Struts2的action的配置文件的result元素的type属性详解。

转自:http://wenku.baidu.com/link?url=FmnvzbMU8P4fgW7sGmqVCTNWnx3AEhgSrGD8-b50k-FireOkSECieAwZlipAD3MCAFSgIbseD0tsnu2MyvY60lKIfLLNG2zyOzh-MUtbhlO



















 
13 
探讨type类型: Type类型值 作用说明 对应类 
chain 用来处理Action链 com.opensymphony.xwork2.ActionChainResult dispatcher 用来转向页面,通常处理JSP 
org.apache.struts2.dispatcher.ServletDispatcherResult redirect 重定向到一个URL org.apache.struts2.dispatcher.ServletRedirectResult redirectAction 重定向到一个Action org.apache.struts2.dispatcher.ServletActionRedirectResult  plainText 显示源文件内容,如文件源码 
org.apache.struts2.dispatcher.PlainTextResult freemarker 处理FreeMarker模板 org.apache.struts2.views.freemarker.FreemarkerResult httpheader 控制特殊http行为的结果类型 org.apache.struts2.dispatcher.HttpHeaderResult stream  向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据。 
 
org.apache.struts2.dispatcher.StreamResult 
 velocity 处理Velocity模板 org.apache.struts2.dispatcher.VelocityResult xslt    
  处理XML/XLST模板 
 org.apache.struts2.views.xslt.XSLTResult  
以上对type类型作简要的说明,下面来看实例:当一个Action处理后要返回的Result是另一个Action时,作如何配置,关键就是配置type类型。下面建立struts2result项目说明 步骤一:建立两个Action:TestAction、Test2Action 
步骤二:web.xml配置省略。struts.xml主要配置内容如下: 
<struts>  <package name="resultTest" extends="struts-default">   <action name="test" class="com.asm.TestAction">    <result name="success" type="chain">     
<param name="actionName">test2</param>    
</result> 
  
</action> 
   <action name="test2" class="com.asm.Test2Action">    
<result name="success">/test2Suc.jsp</result>   
</action>  
 
</package> 
</struts> 
说明:在名为“test”的action中,我们配置result元素的type类型值为chain,意为将继续把Action传递到下一个名为test2的Action中去,在test2.action中会把页面转向到test2Suc.jsp中去。在type类型为chain时,它的param有4个值可配,除了这里用到的name=”actionName”外(必须配置,否则报错),还有name=namespace|method|skipActions。其中namespace指定要转向到action的名字空间,由于此处是转到Action位于同一个namespace下,而namesapace的默认值the current namespace,所以可以省略不写(需要说明的是如果要跳到别的名称空间的action中去,除了使用namespace指定外,还可以用:/要跳去action所在名称空间的值/要跳去的action的name值)。Method用于指定转向到一个目标action所调用的方法,默认是调用下一个action的execute方法,所以此处仍可以省略。SkipActions是一个可选的属性,一般不用。具体可以参看chain所对应类的api帮助。 
在本实例中,我们还在TestAction中设定一个username字段,并在execute方法执行为它赋了值,并在test2Suc.jsp中引用了此值。其实这种做法在web开发中还是很有用处,比如可以代替隐藏域。需要注意的是之所以在action的传递中能把设定的这个值保存下去,主要是因为转向都是服务器跳转。如果我们跳转时采取了客户端跳转,比如在test2 action的result中指定type类型为redirect,要想传递参数可以在result指向的jsp页面中附加参数即可,我们可以在test2 action的result中写成: 
<result name="success" type="redirect"> 


















 
14 
/test2Suc.jsp?username=${username} 
</result>   随后在test2Suc.jsp页面中引用时会出现三个问题:1.EL表达式引用失效,(EL表达式
应该使用${param.username}形式)。我们也可以使用<%=request.getParameter("username")%>获取参数值。  2.由于在前面的TestAction中设定的值为中文,而附加到这里的uri请求的参数后面时会出现乱码问题。(可以使用URI编码再解码解决此问题)3.值栈取值失效:因为每一次request共享同一个值栈,所以服务器端的forward跳转也是能共享同一值栈得。但是着当test action执行后把请求交由test2 action时,test2 action采取的是redirect重定向到test2Suc.jsp页面,这时其实就是重发的一次request,所以在test action保存的值栈内容全部失效。这也就是为什么我们要附加参数的原因。而参数是保存在actionContext中,所以采用了#的方式来取出值。图示说明: 
  
步骤三,编写链接页面index.jsp。发布测试: 
全局result: 
如果我们所有的action均有可能跳到相同的页面,则不防使用全局result。为了方便引用我们专门建立一个package来存放公共的result。在会用到个全局的跳转时,只需要把继承自这个公共的package即可。 建立公共包,代码如下: 
<package name="pubResult" extends="struts-default" abstract="true">   <global-results>    
<result name="error">/error.jsp</result>  
 
</global-results> 
</package>  
由于它下面没的action配置,所以我们可以像默认的struts-default包一样,声明abstract=true,这样声明表示此packgage下不会有action,它一般是用来让别的package继承。随后再在要用到全局result中引用这个公共的package。代码如下: 
<package name="testGlobal" extends="pubResult" >  <action name="error" class="com.asm.ErrorAction"></action>  
<action name="error2" class="com.asm.Error2Action"></action> 
</package>这样操作相当于把全局的result加到了此package下的所有action中去。 
test.action 
<package name="resultTest" extends="struts-default"> 
 <action name="test" class="com.asm.TestAction">   <result name="success" type="chain">    
<param name="actionName">test2</param>   
</result> 
 </action> 
 
 
<action name="test2" class="com.asm.Test2Action"> 
<result name="success" type="redirect">  
 
    /test2Suc.jsp?username=${username} 
    </result>  </action> </package> 
test2.action 
同一个 context map 
result tyep: chain  


置 

配置 test2Suc.jsp 
创建新的 context map 
从新的context map中取值 
result tyep: redirect 


















 
15 
动态Result:了解 
步骤一:建立DynaAction,主要代码如下: 
package com.asm; 
public class DynaAction extends ActionSupport {  private String username;  private String nextAction; 
  public String execute() throws Exception {   if (username.equals("admin")) {    nextAction = "admin";   } else if (username.equals("user")) {    nextAction = "user";   } else { 
   nextAction = ERROR; 
  } 
  return SUCCESS; 
 

 ...省略get/set方法  } 
步骤二、建立jsp页面dyna.jsp,主要是为了向DynaAction中传递username参数。 步骤三、相关配置如下: 
<package name="dynaTest" extends="pubResult">   <action name="dyna" class="com.asm.DynaAction">    
<result name="success" type="chain">${nextAction}</result>   
</action> 
   <action name="admin" >    
<result>/admin.jsp</result>   
</action>    <action name="user">    
<result>/user.jsp</result>  
 
</action> </package> 
分析:当dyna.jsp把参数传递到DynaAction中去时,如果传递的值为admin,我们便设定了nextAction的值admin,在配置文件中我们通过${nextAction}(用在struts配置文件中的ognl,其实nextAction的值是存在值栈中,我们通过${}这样的形式取出。在此只作了解)来获取值便为admin,随后再继续把请求传递到下一个Action中去(此时也即admin.action),为了方便我们设定了两个ForwardAction:admin.action和user.action。这样便可以跳到指定的jsp页面。 原理:dyna.action执行后会继续把请求传递给下一个Action,而下一个Action的到底是哪一个Action,是通过DynaAction中动态指定的,比如这里是根据传递的username的值指定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值