Struts 2 Tutorial – Struts Configuration
The struts.xml file defines the relationship between actions and .jsp views, the inclusion of interceptors, and possible result types. It’s essential that you be able to handle at least basic configuration changes, so we’ll demonstrate the most important and frequently used below.
Packages: Extension, Namespaces, and More
For more complex applications, you will likely want to split the configuration between multiple packages. In Struts 2.0.x, the the default package is struts-default. Most of the time, extending this package is a pretty good place to start from.
<package name="example" extends="struts-default"> <interceptors> <interceptor name="authorization" class="com.lumidant.tutorial.struts2.interceptor.AuthorizationInterceptor"> <interceptor-stack name="authStack"> <interceptor-ref name="authorization" /> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <global-results>
<result name="error">/WEB-INF/pages/error.jsp</result> </global-results> </package>
In the package above, we did not define any action mappings, but rather we defined some more general properties that we can share between other packages. We can now extend the package we just defined when creating new packages. This package and any that extend it will have all Action.ERROR results go to error.jsp. We also defined a new interceptor and interceptor stack that our actions and packages can make use of. In this example, you could imagine that we would have two other packages extending this one. One package would contain pages that any user could visit. The other package could contain pages requiring the user to be logged in, so we would set the default-interceptor-ref to “authStack” as shown below:
<package name="admin" namespace="/admin" extends="example">
<default-interceptor-ref name="authStack"/>
<action name="DeleteSomething_*" method="{1}" class="com.lumidant.tutorial.struts2.action.DeleteSomething">
<result name="input">/WEB-INF/pages/deleteSomething.jsp</result>
<result>/WEB-INF/pages/deleteSuccessful.jsp</result>
</action>
</package>
We also introduced additional new topics in this example. Firstly, you’ll see that we created a namespace. That means that all the actions in this package will be accessed through a spearate URL. In this example it is an “/admin” URL. Also, you’ll see that we put the “*” wildcard in the action name. What this is doing is taking what was located in the * and replacing the “{1}” with that string. Since the “{1}” is located in the method attribute, we will be calling a method on our action. So let’s say the user accesses /admin/DeleteSomething_input.action. Then the input method of the DeleteSomething.java action will be called. Assuming we did not define our own input method, then we will inherit the input method from ActionSupport, which will take us to the result named “input”, which in this example is the deleteSomething.jsp page.
Better URL Structure
By adding the following a child of the struts tag, you no longer need to append .action to your URLs.
<constant name="struts.action.extension" value="action,,"/>
Action Chaining
<action name="LogIn_*" method="{1}" class="com.lumidant.tutorial.struts2.action.LogIn">
<result type="chain">ShowHomepage</result>
</action>
What happens when we don’t want to show a .jsp page as the result of our action, but instead want to continue on directly to another action? We simply use the result type “chain” to forward to another action.
Redirect After Post
<action name="SubmitOrder_*" method="{1}" class="com.lumidant.tutorial.struts2.action.SubmitOrder">
<result name="redirect" type="redirect-action">
<param name="actionName">DisplayOrder</param>
<param name="namespace">/user</param>
</result>
</action>
Very often, after an action is taken, we want to redirect the user to a separate action. For example, let’s say the user submits an order. If we leave the URL in their browser as SubmitOrder.action and they hit refresh, then the order could be submitted a second time. So after they submit an order, it’s probably better if we redirect them to another action, such as one displaying the order they just placed with a thank you message.
Great explanation! Just what I was after
Thanks
Thanks for the explanation.
Thanks a lot for the explanation
Than you very much……….!
Thanks for the awesome tutorial mate, it’s just what i was looking for.
thanks a lot…..that was gr8
Thanks dude! Thanks a lot for the tutorial!
nice explanation,easy to understand for everyone…
I found your blog web site on google and test a few of your early posts. Proceed to maintain up the excellent operate. I just additional up your RSS feed to my MSN News Reader. Seeking forward to studying extra from you in a while!…
thanks a lot..very useful for me..
Thanks for the awesome explanation. It would be great if you can shed some knowledge on interceptors and how can we implement authorization using interceptors.
Thanks again.