action只是一个控制器,真正为客户端呈现处理结果的是jsp文件。而action的工作,是要在xml中配置,在特定的情况下返回特定的jsp页面。action的java类中返回的是String类型,而它仅仅是一个逻辑处理结果,或者说它只是一个代号。只有在xml中配置了逻辑结果与物理结果的映射关系,jsp页面才会作为response呈现。其实Struts2支持多种结果映射,因此物理结果资源可以是jsp,也可以是另一个action链中的另一个action。result元素起到了一个路标的作用。
配置结果
在struts.xml中的action下使用众多result子元素来配置结果,它的name属性就是逻辑结果(也就是action的方法中返回的字符串)。标准写法如下:
<action name="login"> <result name="success" type="dispatcher"> <param name="location">/WEB-INF/welcome.jsp</param> </result> </action>
默认的type就是dispatcher,也就是转发;默认的name是success。因为通常无需指定param,所以一般只需这样写:
<result name="success">/WEB-INF/welcome.jsp</result>
可以使用通配符来指定result的不同url。可以在package中设置全局结果。
<global-results> <result>/WEB-INF/global.jsp</result> </global-results>
各种result结果类型
result不仅可以调取对应的视图资源,也可以指定其他类型的资源。常用的type有plainText、redirect、redirectAction。
plainText可以将结果视图资源当成resource code输出。
redirect相当于重定向到某一个视图资源。
redirectAction可以重新生成一个新的请求,跳转到另一个action。
<result name="resultname" type="redirectAction"> <param name="actionName">another</param> <param name="namespace">/others</param> </result> <result name="error" type="redirectAction">another</result>
第一种配置方式可以转发到其它命名空间的action。第二种直接转到相同空间的action。
PreResultListener
这个监听接口可以在action完成控制后,转入result视图前被回调,监听器的beforeResult方法会被调用。在action的处理方法中添加如下代码:
ActionInvocation invocation=ActionContext.getContext().getActionInvocation(); invocation.addPreResultListener(new PreResultListener(){ public void beforeResult(ActionInvocation arg0, String arg1) { System.out.println("我是监听的处理代码"); } });
添加监听器通过ActionInvocation的addPreResultListener方法完成。这个监听器可以添加给action,也可以添加给拦截器,使之对它所拦截的所有action有效。
beforResult方法中的arg1参数指的是逻辑视图的名字,success或者是error。
动态结果
有两种实现动态结果的方式。第一种是通过通配符,action的name决定了跳转的result page的名字。第二种是使用OGNL表达式,直接使用${ }来输出属性名,由属性名决定视图资源的名称。