配置Action
在struts.xml中的包下,格式是:
...
<package ...>
<action name="Action的名称" [class="实现类所在的java包.实现类名"]>
...
</action>
</package>
...
这里所指定的Action名称,即对应请求Action的URL中的Action名.action
。
Action的实现类可以不写,这样就会使用ActionSupport类。
配置result处理
因为Action使用时会返回不同的字符串用于控制,针对不同的返回来的字符串(或者叫逻辑视图)做不同的事情,就是通过<result></result>
双标签来指示处理方法的。
局部result
即在<action></action>
双标签中配置的<result></result>
双标签,其仅仅对这个Action生效。
...
<action ...>
...
<result [name="返回来的字符串"] [type="处理方式"]>
处理时要使用的视图
</result>
...
</action>
...
其中name是返回来的字符串,上一篇学习的Action接口中就定义了很多,当然也可以在Action里自定义,总之这里一定是对应的Action真的有可能返回来的字符串。name也是可选的,如果不写,默认就是"success"
字符串。
type的值则是要处理的方式,常用的有:
type的值 | 描述 |
---|---|
“dispatcher” | 转发资源 |
“redirect” | 重定向到其它URL |
“redirectAction” | 重定向到其它Action |
全局result
其name属性和type属性还是一样的用法,全局result不是配置在<action></action>
双标签中,而是要配置在和<action></action>
双标签并列的<global-results></global-results>
双标签中,它会对这个包下所有的Action生效。
...
<package ...>
<global-results>
...
<result [name="返回来的字符串"] [type="处理方式"]>
处理时要使用的视图
</result>
...
</global-results>
<action ...>
...
</action>
...
<action .../>
...
</package>
...
因为有了全局result的存在,有些Action不去写局部result也没关系,让<action ...></action>
双标签直接闭合成了<action .../>
。
对于每个Action而言,要匹配<result></result>
中配置的逻辑视图,以去获得具体的处理方式和使用的资源,当既存在局部result又存在全局result时,会优先在局部result中匹配和处理,当全都不匹配时才会去看全局result。
result的三种常见处理方式
"dispatcher"
,"redirect"
,"redirectAction"
是result元素的type属性的常见的三种取值,对应了对Action的返回结果的三种常见的处理方式。
"dispatcher"
是转发到指定的JSP资源,和<jsp:forward ../>
是一个道理。
而"redirect"
则是重定向到指定的URL,重定向会丢失所有的请求参数、请求属性,就像服务器要求客户端重新向另一个(或者即使还是自己)这个资源进行了请求。它在下层的Servlet层面使用的是HttpServletResponse
的sendRedirect()
方法,因为重定向会发出新的请求,所以连刚刚(到达这个result用的)使用的Action对象也会被析构,里面存的信息也都没了。
"redirectAction"
也是重定向,不过是重定向到其它的Action,下层使用的是ActionMapperFactory
的ActionMapper
。为了重定向到其它的Action,必须要给出那个Action的逻辑上的位置信息,也就是它属于哪个命名空间,和它的名字。result标签显然不会提供这种属性,所以是放在其子元素<param></param>
中:
...
<result type="redirectAction">
<param name="actionName">Action的名称</param>
<param name="namespace">它所在的命名空间</param>
</result>
...