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



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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值