struts2学习之---配置处理结果

来源:互联网 发布:mysql pdf 微盘 编辑:程序博客网 时间:2024/05/16 03:21

Action处理完用户请求之后,将返回一个普通字符串,整个普通字符串就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图名之间的映射关系,一旦系统受到Action返回的某个逻辑视图名,系统就会把对应的物理视图呈现给浏览者。

1.配置结果

struts2在struts.xml文件中使用<result.../>元素来配置结果,根据<result.../>所在位置的不同,分为:

  • 局部结果:将<result.../>作为<action.../>元素的子元素配置。
  • 全局结果:将<result.../>作为<global-results.../>元素的子元素配置。

配置<result.../>元素时通常有两个属性:

  • name:该属性指定所配置的逻辑视图名。
  • type:该属性指定结果类型。
    struts2默认的结果类型就是dispatcher(用于与JSP整合的结果类型)。
    省略了name属性,系统将采用默认的name属性值,默认的name属性值为success。

2.struts2支持的结果类型

 结果类型决定了Action处理结束后,下一步将调用哪种视图资源来呈现处理结果。struts2的结果类型要求实现com.opensymphony.xwork2.Result,这个结果是所有结果类型的通用接口。
1.plainText结果类型
 这个结果类型不常用,因为它的作用太过于局限,主要用于显示实际视图资源的源代码。

  • location:指定实际的视图资源。
  • charSet:指定输出页面时所用的字符集。
    <result type="plainText">        <param name="loaction">/WEB-INF/content/welcome.jsp</param>        <param name="charSet">GBK</param>    </result>

2.redirect结果类型
这种结果类型与dispatcher结果类型相对,dispatcher结果类型是将请求forward(转发)到指定的JSP资源;而redirect结果类型,则意味着将请求redirect(重定向)到指定的视图资源。重定向会丢失所有的请求参数、请求属性,当然也会丢失了Action的处理结果。
使用redirect结果类型的效果是,系统将调用HttpServletResponse的sendRedirect(String)方法来重定向指定视图资源,这种重定向的效果就是重新产生一个请求。当Action处理完用户请求后,再次向视图资源发送一次新的请求。

  • location:该参数指定Action处理完用户请求后跳转的地址。
  • parse:该参数指定是否允许在location参数中使用表达式,默认是true。

3.redirectAction结果类型
这种结果类型与redirect类型非常相似,一样是重新生成一个全新的请求,区别在于:redirectAction使用ActionMapperFactory提供的ActionMapper来重定向请求。
当需要一个Action处理结束后,直接将请求重定向(是重定向,不是转发)到另一个Action时,就应该使用这种结果类型。

  • actionName:该参数指定重定向的Action名。
  • namespace:该参数指定需要重定向的Action所在的命名空间。

3.动态结果

动态结果的含义是指在指定实际视图资源时使用了表达式语法,通过这种语法可以允许Action处理完用户请求后,动态转入实际的视图资源。

    <action name="crud_*" class="" method="{1}">        <result>/WEB-INF/content/{1}.jsp</result>    </action>

4.Action属性值决定物理视图资源

    <action name="save" class="" method="save">        <result type="redirect">edit.action?skillName=${currentSkill.name}</result>    </action>

上面的配置中使用过了${currentSkill.name}表达式来指定结果视图资源,要求在对应的Action实例里包含currentSkill属性,且currentSkill属性必须包含name属性,否则表达式的值为null。

    <result>/WEB-INF/content/${target}.jsp</result>

这要求在对应的Action类里应该包含target属性,该属性值决定实际的视图资源。

5.全局结果

当在<global-results.../>元素中配置<result.../>元素时,该<result.../>元素配置了一个全局结果,全局结果对所有的Action都有效。
如果一个Action里包含了与全局结果里同名的结果,则Action里的局部Result会覆盖全局Result。当Action处理用户请求结束后,会首先在本Action里的局部结果里搜索逻辑视图对应的结果,只有在Action里的局部结果里找不到逻辑视图对应的结果,才会到全局结果里搜索。

6.使用PreResultListener

PreResultListener是一个监听器接口,它可以在Action完成控制处理之后,系统转入实际的物理视图之间被回调。
struts2应用可由Action、拦截器添加PreResultListener监听器,添加PreResultListener监听器通过ActionInvocation的addPreResultListener()方法完成。一旦为Action添加了PreResultListener监听器,该监听器就可以在应用转入实际物理视图之前回调监听器的beforeResult()方法;一旦为拦截器添加了PreResultListener监听器,该监听器会对该拦截器的所有Action起作用。

    public class LoginAction extends ActionSupport{        private String username;        private String password;        public String execute() throws Exception{            ActionInvocation invocation = ActionContext.getContext().getActionInvocation();            invocation.addPreResultListener(new PreResultListener{                public void beforeResult(ActionInvocation invocation,String resultCode){                    System.out.println("返回的逻辑视图名为:" + resultCode);                    invocation.getInvocationContext().put("extra",new java.util.Date() + "由" + resultCode + "逻辑视图名转入");                    }                }            )        }    }
原创粉丝点击