Struts2 Result详解

来源:互联网 发布:知乎 唯一视觉怎么样 编辑:程序博客网 时间:2024/05/01 16:59
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.2px;"><strong></strong></p>

1,Result原理

 1) Result组件是Struts2中用于输出的组件,实际上就是Java代码。

 2)Struts2中预制了10中类型的Result,这些Result什么在struts-default.xml中。

    这些类实际上都事先了统一的接口:Result.

Java代码  收藏代码
  1. <result-types>  
  2.          <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>  
  3.          <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>  
  4.          <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>  
  5.          <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>  
  6.          <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>  
  7.          <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>  
  8.          <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>  
  9.          <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>  
  10.          <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>  
  11.          <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />  
  12.      </result-types>  

 

3)重点讲解一下类型的Result

--dispatcher  默认类型,转发到一个页面)

   当一个请求到来,服务器直接转发到另一个页面,不能是另一个action。由于这个过程在服务器内部完成,客户端(浏览器)并不知道,所以在地址栏不会显示真实访问的页面,而显示都是所请求的action的地址。在servlet中相当与forword转发。

 

--redirect  (重定向到一个页面)。

   当一个请求到来,服务端将实际地址response给浏览器,然后浏览器重新发起请求,这个过程,浏览器是知道访问的页面的实际地址的,所以在浏览器的地址栏显示的是实际访问的jsp页面地址。但是这种类型不能重定向到一个action.

 

--chain  转发到一个action,而不是页面

  

--redirectAction 重定向到一个action

  跳转到其他包的action:

 

Java代码  收藏代码
  1. <action name="login" class="...">  
  2.         <!-- Chain to another namespace -->  
  3.         <result type="chain">  
  4.             <param name="actionName">dashboard</param>  
  5.             <param name="namespace">/secure</param>  
  6.         </result>  
  7.     </action>  

使用redirectAction 带参数

Java代码  收藏代码
  1. <span style="font-size: 14px; font-family: 'Microsoft YaHei', 微软雅黑, SimHei, tahoma, arial, helvetica, sans-serif;"><action name="temp" class="com.lydia.web.action.TempAction">  
  2.         <result type="redirectAction">  
  3.             <param name="actionName">test.action</param>  
  4.             <param name="name">${name}</param>  
  5.         </result>  
  6. </action></span>  

 

 

--stream  

--json 

 

 

4)使用方式

 <result name="ok" type="类型">

 

</result>

 

2、Stream类型的Result详解

 1)Stream是用于向页面直接输出二进制数据,比如登陆页面的验证码图片,就可以在服务端生成,然后由这种类型的Result输出

 2) 使用

<result name="success" type="stream">

  <param name="inputName">

     输出属性名

  </param>

</result>

--在struts.xml中,我们可以使用param来给组件的属性注入默认值

--<param name="inputName">,这里inputName对应的是StreamResult的inputName属性,这样配置相当于会调用StreamResult的setInputName方法给它注入属性值。

--注入的属性值,是Action中的某个属性的名称,如下图,inputName是StreamResult中的一个属性。在Action中作二进制输出的属性要求其类型为InputStream。





 -- Result会创建一个输出流,接到Action中的输入流,向页面输出。

 

3) 验证码案例:

   struts.xml中配置:

Java代码  收藏代码
  1. <!-- 生成验证码的Action -->  
  2.         <action name="createImage"  
  3.             class="com.netctoss.action.CreateImageAction">  
  4.             <result name="success" type="stream">  
  5.                 <param name="inputName">  
  6.                     imageStream  
  7.                 </param>  
  8.             </result>  
  9.         </action>  

 

    CreateImageAction.java

Java代码  收藏代码
  1. public class CreateImageAction   
  2.     extends BaseAction {  
  3.       
  4.     //ouput  
  5.     private InputStream imageStream;  
  6.       
  7.     public String execute() {  
  8.         //生成验证码图片  
  9.         Map<String,BufferedImage> map =   
  10.             ImageUtil.createImage();  
  11.         //通过遍历得到唯一生成的验证码  
  12.         String imageCode =   
  13.             map.keySet().iterator().next();  
  14.         //将验证码记录到session,在登录验证时使用  
  15.         session.put("imageCode", imageCode);  
  16.         //根据验证码,得到图片  
  17.         BufferedImage image = map.get(imageCode);  
  18.         //将图片转换为输入流,由result作输出  
  19.         try {  
  20.             imageStream =   
  21.                 ImageUtil.getInputStream(image);  
  22.         } catch (IOException e) {  
  23.             e.printStackTrace();  
  24.             return "error";  
  25.         }  
  26.         return "success";  
  27.     }  
  28.   
  29.     public InputStream getImageStream() {  
  30.         return imageStream;  
  31.     }  
  32.   
  33.     public void setImageStream(InputStream imageStream) {  
  34.         this.imageStream = imageStream;  
  35.     }  
  36.   
  37. }  

 

 

Java代码  收藏代码
  1. <script language="javascript" type="text/javascript">  
  2.             function change(imageObj) {  
  3.                 imageObj.src = "createImage?date=" + new Date().getTime();  
  4.             }  
  5. </script>  
  6.   
  7. <tr>  
  8.      <td class="login_info">验证码:</td>  
  9.      <td class="width70"><input name="code" type="text" class="width70" /></td>  
  10.      <td><img src="createImage" alt="验证码" title="点击更换" onclick="change(this);"/></td>    
  11.      <td><span class="required"></span></td>                
  12. </tr>       

  BaseAction.java 实现接口SessionAware

Java代码  收藏代码
  1. /** 
  2.  *  所有Action的父类,可以将通用的代码 
  3.  *  提取出来放到父类中。 
  4.  *  这里,我们让BaseAction实现接口SessionAware, 
  5.  *  那么继承与BaseAction的Action就相当于实现了 
  6.  *  这个接口。在实例化Action之后,Struts2会自动 
  7.  *  调用setSession方法把session注入给Action, 
  8.  * 这里我们利用全局变量session来接收,Action 
  9.  * 可以在调用业务方法时使用它来调用session。 
  10.  */  
  11. public class BaseAction implements SessionAware {  
  12.   
  13.     protected Map<String, Object> session;  
  14.       
  15.     public void setSession(Map<String, Object> session) {  
  16.         this.session = session;  
  17.     }  
  18.   
  19. }  

 

3、Json类型的Result详解

 1) 向页面输出json格式的字符串

 2) struts2 并没有预制这种类型的Result,但是他非常常用,往往用于页面的异步校验。

 3) 使用步骤

       a,导包:struts2-json-plugin-2.1.8.1.jar

       b,struts.xml中将要使用json类型Result的package继承json-default

       c,在struts.xml中配置result

         --最常用,只是输出单个属性

 

Java代码  收藏代码
  1. <result name="success" type="json" >  
  2.         <param name="root">  
  3.                 指定Action的一个属性名  
  4.         <param>  
  5.   </result>  
   注意: name="root"是固定用法;

 

               如指定的属性是boolean类型,那么Result会把这个属性做成字符串"true";

               如指定的属性是JavaBean,那么Result会把这个属性做成字符串{"code":"12"}

 

--输出多个属性

    

Java代码  收藏代码
  1. <result name="success" type="json">  
  2.         <param name="includeProperties">  
  3.                 属性名1,属性名2,...  
  4.         </param>  
  5. </result>  

 注意:Result会将这一组属性做成一个json输出,

如Action中有属性code="aaa",name="zs"

可以将这2个属性做成一个json

{"code":"aaa","name":"zs"}

 

--输出Action中的所有属性

Java代码  收藏代码
  1. <result name="success" type="json">  
  2.                       
  3. </result>  

注意:Result会将Action中所有的属性做成一个

json输出{"":"","":""}


0 0
原创粉丝点击