Struts2中配置处理结果及异常处理

来源:互联网 发布:网络摄像头 监控软件 编辑:程序博客网 时间:2024/05/01 21:42


Action处理用户请求结束后,控制器应该使用哪个视图资源生成响应呢?

        这就必须使用<result…/>元素进行配置,该元素定义逻辑视图名和物理视图资源之间的映射关系。

理解处理结果

浏览者、控制器和视图资源之间的顺序图:




Action处理完用户请求后,并未直接将请求转发给任何具体的视图资源,而是返回一个逻辑视图(普通字符串),Struts2框架收到这个逻辑视图后,把请求转发到对应的视图资源,视图资源将处理结果呈现给用户。


配置结果


        Struts2Action处理用户请求结束后,返回一个普通字符串---逻辑视图名,必须在struts.xml文件中完成逻辑视图和物理视图的映射,才可让系统转到实际的视图资源。


        Struts2的两种配置:


                  局部结果:将<result…/>作为<action…/>元素的子元素配置。


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


        <result…/>元素需要指定两个属性:


                  name:该属性指定所配置的逻辑视图名。


                  type:该属性指定结果类型。


<result…/>片段:


<action name="login" class="org.crazyit.app.action.LoginAction"><!-- 定义三个逻辑视图和物理资源之间的映射 --><result name="success" type="dispatcher"> <param name=”location”>/thank_you.jsp</param></result></action>

<result…/>最简片段:


<action name="login" class="org.crazyit.app.action.LoginAction"><!-- 定义三个逻辑视图和物理资源之间的映射 --><result> /thank_you.jsp</result></action>

省略默认:


        如果我们省略了<result…/>元素的name属性,系统将采用默认的name属性值,默认的name属性值为success


        如果我们省略了<result…/>元素的location参数,系统将会把<result…>…</result>中间的字符串当成实际视图资源;name属性默认值:successtype属性默认值:dispatcher


结果类型


        Struts2的结果类型要求实现com.opensymphony.xwork2.Result,这个结果是所有结果类型的通用接口。如果我们需要自己的结果类型,我们应该提供一个实现该接口的类,并且在struts.xml文件中配置该结果类型。


struts2-core-2.2.1.jar里的struts-default.xml文件默认提供了一系列的结果类型。


  chain:Action链式处理结果类型


  dispather:用于JSP整合的结果类型(默认)


  redirect:用于直接跳转到其他URL的结果类型


  redirect-action:用于直接跳转到其他Action的结果类型


  stream:用于向浏览器返回一个InputStream(一般用于文件下载)


  freemarker:用于FreeMarker整合的结果类型


  plaintext:用于显示某个页面的原始代码的结果类型


  chart:用于整合JFreeChart的结果类型


  jsf:用于JSF整合的结果类型


  httpheader:用于控制特殊的HTTP行为的结果类型


  jasper:用于JasperReports整合的结果类型


  tiles:用于Tiles整合的结果类型


  velocity:用于Velocity整合的结果类型


  xslt:用于XML/XSTL整合的结果类型


plaintext结果类型


        用于输出资源视图源代码。


        如果结果页面代码中包含了中文字符,使用plainText结果类型必须指定charSet参数,该参数指定输出页面所用的字符集。


        使用plainText结果类型时可指定如下两个参数


                  location:指定实际的视图资源。


                  charSet:指定输出页面时所用的字符集。


redirect结果类型


        dispatcher是将请求forward到指定的JSP资源;redirect是重定向到指定的视图资源,重定向的话浏览器的URL会刷新,请求参数、请求属性和前一个Action的处理结果全部丢失。


        配置一个redirect,可以指定如下两个参数:


                  location:该参数指定Action处理完用户请求后跳转的地址。


                  parse:该参数指定是否允许在location参数值中使用表达式,该参数默认true


redirectAction结果类型


        redirectAction使用ActionMapperFactory提供的ActionMapper来重定向请求。


        当需要让一个Action处理结束后,直接将请求重定向到另一个Action时,我们应该使用这种结果类型。


        配置redirectAction,可以指定如下两个参数:


                  actionName:该参数指定重定向的Action名。


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


通配符和属性配置结果


1.通配符示例:

<action name="crud_*" class="lee.CrudAction" method=”{1}”><!-- 定义三个逻辑视图和物理资源之间的映射 --><result name=”input”> /input.jsp</result><result> /{1}.jsp</result></action>

例如有一个crud_create.action的请求,系统将调用lee.CrudAction类的create方法来  处理用户请求。当Action处理用户请求结束后,配置了两个结果:当处理结果为input        跳转到/input.jsp;处理结果为success跳转到create.jsp


2.属性配置结果示例:

<action name="delete" class="org.crazyit.app.action.SkillAction"><!-- 定义三个逻辑视图和物理资源之间的映射 --><result name="error">/empmanager/editSkill.jsp</result><result type=”redirect”>edit.action?skillName=${currentSkill.name}</result></action>

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


全局结果

<global-results><result name="success">/${target}.jsp</result></ global-results >

优先级:局部>全局


PreResultListener


        一旦为Action添加了PreResultListener监听器,该监听器就可以在应用转入实际物理视图之前回调该监听器的beforeResult()方法;一旦为拦截器添加了PreResultListener监听器,该监听器会对该拦截器所拦截的所有Action起作用。


配置Struts2的异常处理


Action中的execute方法

public String execute() throws Exception{if (getUsername().equalsIgnoreCase("user")){throw new MyException("自定义异常");}if (getUsername().equalsIgnoreCase("sql")){throw new java.sql.SQLException("用户名不能为SQL");}if (getUsername().equals("crazyit.org")&& getPassword().equals("leegang") ){setTip("哈哈,服务器提示!");return SUCCESS;}else{return ERROR;}}

<?xml version="1.0" encoding="GBK"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN""http://struts.apache.org/dtds/struts-2.1.7.dtd"><struts><package name="lee" extends="struts-default"><!-- 定义全局结果映射 --><global-results><!-- 定义当sql、root两个逻辑异常都对应exception.jsp页 --><result name="sql">/exception.jsp</result><result name="root">/exception.jsp</result></global-results><!-- 定义全局异常映射 --><global-exception-mappings><!-- 当Action中遇到SQLException异常时,系统将转入name为sql的结果中--><exception-mapping exception="java.sql.SQLException" result="sql"/><!-- 当Action中遇到Exception异常时,系统将转入name为root的结果中--><exception-mapping exception="java.lang.Exception" result="root"/></global-exception-mappings><action name="login" class="org.crazyit.app.action.LoginAction"><!-- 定义局部异常映射, 当Action中遇到MyException异常时,系统将转入name为my的结果中--><exception-mapping exception="org.crazyit.app.exception.MyException"result="my"/><!-- 定义三个结果映射 --><result name="my">/exception.jsp</result><result name="error">/error.jsp</result><result name="success">/welcome.jsp</result></action><action name=""><result>.</result></action></package></struts>

如上述例子,配置中的异常与Action中的异常相同。



0 0