Struts2绝大多数的配置都是在struts.xml中完成的。小伙伴们在学习中会有遇到xml不熟悉导致配置文件不知从何下手的感觉,小可在此给大家详述struts.xml的配置方法
一.Action配置
Action是struts2的工作单元。配置一个基本的Action需要两个信息:Action名字和对应的Action类。属性”method”用来告诉Struts2调用Action的哪个方法。在Action处理之后需要展示处理结构给用户,所以还需要把Action和Result映射在一起:
/**action配置*/
<action name="helloWorld" class="example.HelloWorld" method="doWork">
<result name="failure" path="Error.jsp" />
<result name="ok" path="HelloWorld.jsp" />
</action>
几种默认配置:
(1)没有class定义,默认使用com.opensymphony.xwork.ActionSupport类,有一个execute()方法,返回”success”
(2)method为空,默认调用Action类的execute()方法。如果没有该方法则抛出异常
(3)没有第一个result的属性,默认为”success”
二.Result配置
Struts2定义一些默认Result:error、input、login、none、success
小伙伴们也可以自定义结果,以“名字 - 值”的形式映射到结果类型。Result嵌套在标签里,如果location参数是唯一的参数,可以:
/**添加参数*/
<action name="bar" class="myPackage.barAction">
<result name="success" type="dispatcher">
<param name="location">foo.jsp</param>
</result>
</action>
如果没有param参数,可以:
<action name="bar" class="myPackage.barAction">
<result name="success" type="dispatcher">foo.jsp </result>
</action>
如果没有type属性,默认为dispatcher类型
使用全局Result映射是减少struts.xml配置内容的另一种好方法。在Action中使用一组通用的Result,可以把这些通用的Result的定义集中起来,而不需要每个Action重复定义:
/**全局result配置*/
<package name="default">
....
<global-results>
<result name="login" type="dispatcher">
<param name="location">login.jsp</param>
</result>
</global-results>
<action name="foo" class="mypackage.fooAction">
<result name="success" type="dispatcher">bar.jsp</result>
</action>
<action name="submitForm" class="mypackage.submitFormAction">
<result name="success" type="dispatcher">submitSuccess.jsp</result>
</action>
...
</package>
三.拦截器(Interceptor)配置
Interceptor是能在一个Action执行的前后执行的代码,功能有安全检查,跟踪日志等,也可以把Interceptor连接成栈,但必须先定义好:
/**Interceptor配置*/
<interceptors>
<interceptor name="security" class="com.mycompany.security.SecurityInterceptor" />
<interceptor-stack name="defaultComponnentStack">
<interceptor-ref name="component" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
/**action中这样使用*/
<action name="VelocityCounter" class="com.opensymphony.webwork.example.counter.SimpleCounter">
<result name="success">...</result>
<interceptor-ref name="defaultComponentStack" />
/**引用名既可以是拦截器名也可以是栈名,没区别*/
</action>
四.包配置
包配置就是把actions,results,types和interceptors打包到一个逻辑单元中,更像是一个对象。name是必填属性,extends和abstract可选
/**扩展default包*/
<package name="example" namespace="/example" extends="struts-default">
<action name="HelloWorld" class="example.HelloWorld">
<result>/example/HelloWorld.jsp</result>
</action>
<action name="Login" method="login" class="example.Login">
<result name="input">/example/Login.jsp</result>
<result type="redirect-action">Menu</result>
</action>
<action name="*" class="example.ExampleSupport">
<result>/example/blank.jsp</result>
</action>
</package>
五.命名空间配置
命名空间允许把Action配置分成不同的命名空间,可以是功能不同Action中使用相同的名字。Struts2中以”/”命名的根命名空间,是请求直接来自应用程序根路径的时候的命名空间,默认寻找:
/**命名空间为空*/
<package name=""default>
<action name="foo" class="mypackage.simpleAction">
<result name="success" type="dispatcher">greeting.jsp</result>
</action>
<action name="bar" class="mypackage.simpleAction">
<result name="success" type="dispatcher">bar1.jsp</result>
</action>
</package>
/**命名空间为"/"*/
<package name="mypackage1" namespace="/">
<action name="mybackage1" class="mypackage.simpleAction">
<result name="success" type="dispatcher">moo.jsp</result>
</action>
</package>
`/**命名空间为"barspace"*/
<package name="mypackage2" namespace="/barspace">
<action name="bar" class="mypackage.simpleAction">
<result name="success" type="dispatcher">bar2.jsp</result>
</action>
</package>
流程:
(1)如果请求为/barspace/bar.action,系统首先查找/barspace命名空间,如果找到bar Action便执行,如果没有继续到默认命名空间查找
(2)请求为barspace/foo.action,系统会在/barspace中找foo这个action,如果找不到,则到默认中查找,例子中会在默认中找到foo
(3)请求为/moo.action,系统在根空间找到moo
(4)请求为/foo.action,先找根再找默认
六.struts.xml中定义JavaBean
定义JavaBean:
<struts>
<bean type="com.opensymphony.xwork2.ObjectFactory"
name="myfactory"
class="com.company.myapp.MyObjectFactory" />
</struts>
这里使用反转控制概念Ioc,也称为依赖注入。反转控制用来处理对象间的依赖关系而出现的。但一般使用Spring作为IoC容器
七.使用通配符
在配置Action Mapping数量很多的时候,通配符是一个好方法,将一些相似的Mapping绑在一起,路径用*来代替变化的部分,而Action的处理类和Jsp中{1}刚好是代替这个变量
<action name="/edit*" class="example.Edit{1}Action">
<result name="failure" path="/mainMenu.jsp" />
<result name="ok" path="/\{1\}.jsp" />
</action>
以上代码URI:editSubscription、editRegistration都将复合条件匹配到这个Action配置,被代替的是Action映射中的变量属性和Action结果替换{1}。比如/editSubscription将对应的Action处理类是example.EditSubscriptionAction,result的jsp是Subscription.jsp