zoukankan      html  css  js  c++  java
  • Struts2中Result的配置

    一个result代表了一个可能的输出。当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出。

    一、结果类型

    Struts2提供了很多的结果类型的,这里介绍最常用的四种。

    dispatcher:在服务器内跳转到结果页面(视图页面)中去,只可以跳转到视图页面,不能跳转到Action。(默认类型)
    redirect:客户端跳转(重定向),URL会发生变化,只可以跳转到视图页面,不能跳转到Action。
    chain:在服务器内跳转到Action。
    redirectAction:客户端跳转到Action,URL会发生变化。

    配置代码如下:

    <struts>
        <constant name="struts.devMode" value="true" />
        <package name="resultTypes" namespace="/r" extends="struts-default">
    	    <action name="r1">
    	    	<result type="dispatcher">/r1.jsp</result>
    	    </action>
    	    
    	    <action name="r2">
    	    	<result type="redirect">/r2.jsp</result>
    	    </action>
    	    
    	    <action name="r3">
    	    	<result type="chain">r1</result>
    	    </action>
    	    
    	    <action name="r4">
    	    	<result type="redirectAction">r2</result>
    	    </action>
    	    
        </package>
    </struts>
    

    (1)dispatcher类型

    这是最常用也是Struts2中默认使用的类型,Struts2在后台使用Server API的RequestDispatch来转发请求,因此在用户的整个请求/响应过程中,目标Servlet/JSP接收到的request/response对象,与最初的Servlet/JSP相同。也就是说dispatch是在服务器内完成跳转,其过程如下:

    其转跳后URL不会变化,如下:

    http://localhost:8080/Struts2_ResultType/r/r1
    

    注意:这种方式的Action共享同一Value Stack(值栈)。

    (2)redirect类型

    redirect是指客户端跳转(重定向),它在后台使用HttpServletResponse的sendRedirect方法将请求重定向到指定的URL,用户要完成一次与服务器之间的交互,浏览器需要发出两次请求。其过程如下:

    使用redirect结果类型,实际上是告诉浏览器目标资源所在的位置,让浏览器重新访问目标资源,其转跳后URL会重定向到指定的结果页面中去,如下:

    http://localhost:8080/Struts2_ResultType/r2.jsp
    

    由于在一次用户交互过程中存在着两次请求,因此第一次请求中的数据在第二次请求中是不可用的(其实是因为不能从第一次请求的Value stack(值栈)中取值),这就意味着目标资源是不能访问第一次请求的action实例,action错误以及字段错误等。

    (3)chain类型

    与dispatcher类型相似,只不过chain类型是转跳到Action。

    (4)redirectAction类型

    与redirect类型相似,只不过redirectAction类型是转跳到Action。

    二、全局结果

    全局结果比较简单,当有多个action要使用同一个结果集时,则可以使用全局结果集(GlobalResult),这样就不用在每一个使用同一个结果集的action里面都添加一个result,如下:

    <package name="user" namespace="/user" extends="struts-default"> 	
        
    	<!-- 全局结果,在这个包内,所以的Action都可以用这个name="mainpage"的result,result可以有多个-->
    	<global-results>
    		<result name="mainpage">/main.jsp</result>
    	</global-results>
    
    	<action name="user" class="com.chongqing.action.UserAction">
    		<result>/user_success.jsp</result>
    		<result name="error">/user_error.jsp</result>
    	</action>	    
    </package>
    

    当其它不同的package需要使用这个全局的Result时,则需要使用<package>标签中的extends属性来指定继承包含全局的package就可以了。如下:

    <package name="admin" namespace="/admin" extends="user">
    	<action name="admin" class="com.chongqing.action.AdminAction">
    		<result>/admin.jsp</result>
    	</action>
    </package>
    

    三、动态结果

     所谓动态结果,就是指在配置的时候不知道要执行哪一个结果,要在运行的时刻才能确定执行的结果。简单地说,就是在配置结果时使用了表达式,在运行时刻框架解析并计算表达式,根据表达式的值来确定要执行的结果。

    配置如下:

    <struts>
        <constant name="struts.devMode" value="true" />
        <package name="user" namespace="/user" extends="struts-default">
        	
    	    <action name="user" class="com.chongqing.action.UserAction">
    	    	<result>${r}</result>
    	    </action>	    
        </package>   	
    </struts>
    

    注:${}:作用是用于是从Value stack(值栈)中取值。例如:${r} 表示从Value stack(值栈)中取出action的r(成员属性)的值。注意这个成员属性必需具有get/set方法。

    Action类如下:

    package com.chongqing.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UserAction extends ActionSupport {
    	private int type;
    	
    	private String r;
    
    	public String getR() {
    		return r;
    	}
    
    	public void setR(String r) {
    		this.r = r;
    	}
    
    	public int getType() {
    		return type;
    	}
    
    	public void setType(int type) {
    		this.type = type;
    	}
    
    	@Override
    	public String execute() throws Exception {
    		if(type == 1) r="/user_success.jsp";
    		else if (type == 2) r="/user_error.jsp";
    		return "success";
    	}
    
    }
    

    四、带参数的结果集

    也就是向结果集传参数。正如第一节所介绍,Result的dispatch类型共享同一个Value Stack(值栈),而redirect类型却不共享。所以这节介绍当Result是redirect类型如何传参数。

    配置如下:

    <struts>
        <constant name="struts.devMode" value="true" />
        <package name="user" namespace="/user" extends="struts-default">
        	
    	    <action name="user" class="com.chonqing.action.UserAction">
    	    	<result type="redirect">/user_success.jsp?t=${type}</result>
    	    </action>	    
        </package>	
    </struts>
    

    UserAction类:

    package com.chonqing.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UserAction extends ActionSupport {
    	private int type;
    	
    	public int getType() {
    		return type;
    	}
    
    	public void setType(int type) {
    		this.type = type;
    	}
    
    	@Override
    	public String execute() throws Exception {
    		return "success";
    	}
    
    }
    

    因为只有Action才具有值堆栈,JSP是没有什么值堆栈的。所以当result重定向到/user_success.jsp?t=${type}后,是不能从值堆栈中取出t的值。但是有ActionContext,可以从中取出t的值。JSP代码如下:

    <body>
    	User Success!
    	from valuestack: <s:property value="t"/><br/>
    	from actioncontext: <s:property value="#parameters.t"/>
    	<s:debug></s:debug>
    </body>
    

    注:<s:property value="t"/>取不到值,因为JSP不是一个Action没有值堆栈。
    <s:property value="#parameters.t"/>可以取出t的值,因为#方式是从ActionContext中取属性值,ActionContext堆栈中具有parameters这个属性是用于存储传入的参数,可以取出。

  • 相关阅读:
    天天共写了四本书,如果您使用有问题欢迎反馈
    难道QQ没有办法封?
    一个包含ASP.NET2.0全部登陆控件在典型身份验证的考虑
    数据访问模式二:数据集和数据适配器(传统的数据访问模式)
    数据访问两种模式的比较
    在母版页里使用FindControl的困惑
    有了中文版MSDN2,何必又东奔西走去找资料
    ASP.NET2.0技术详解与应用实例
    ASP.NET2.0新功能之客户端脚本功能
    使用ASP.NET2.0的TreeView控件显示分层数据
  • 原文地址:https://www.cnblogs.com/yzy-blogs/p/6714592.html
Copyright © 2011-2022 走看看