Struts2 Result详解             

 

               

1,Result原理

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

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

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

Java代码  Struts2 Result详解  _result

  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代码  Struts2 Result详解  _result

  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代码  Struts2 Result详解  _result

  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。


Struts2 Result详解  _Struts2_04


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

 

3) 验证码案例:

   struts.xml中配置:

Java代码  Struts2 Result详解  _result

  1. <!-- 生成验证码的Action -->  

  2.         <action name="createImage"  

  3.             class="com.netctoss.action.CreateImageAction">  

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

  5.                 <param name="inputName">  

  6.                     p_w_picpathStream  

  7.                 </param>  

  8.             </result>  

  9.         </action>  

 

    CreateImageAction.java

Java代码  Struts2 Result详解  _result

  1. public class CreateImageAction   

  2.     extends BaseAction {  

  3.       

  4.     //ouput  

  5.     private InputStream p_w_picpathStream;  

  6.       

  7.     public String execute() {  

  8.         //生成验证码图片  

  9.         Map<String,BufferedImage> map =   

  10.             ImageUtil.createImage();  

  11.         //通过遍历得到唯一生成的验证码  

  12.         String p_w_picpathCode =   

  13.             map.keySet().iterator().next();  

  14.         //将验证码记录到session,在登录验证时使用  

  15.         session.put("p_w_picpathCode", p_w_picpathCode);  

  16.         //根据验证码,得到图片  

  17.         BufferedImage p_w_picpath = map.get(p_w_picpathCode);  

  18.         //将图片转换为输入流,由result作输出  

  19.         try {  

  20.             p_w_picpathStream =   

  21.                 ImageUtil.getInputStream(p_w_picpath);  

  22.         } catch (IOException e) {  

  23.             e.printStackTrace();  

  24.             return "error";  

  25.         }  

  26.         return "success";  

  27.     }  

  28.   

  29.     public InputStream getImageStream() {  

  30.         return p_w_picpathStream;  

  31.     }  

  32.   

  33.     public void setImageStream(InputStream p_w_picpathStream) {  

  34.         this.p_w_picpathStream = p_w_picpathStream;  

  35.     }  

  36.   

  37. }  

 

 

Java代码  Struts2 Result详解  _result

  1. <script language="javascript" type="text/javascript">  

  2.             function change(p_w_picpathObj) {  

  3.                 p_w_picpathObj.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代码  Struts2 Result详解  _result

  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代码  Struts2 Result详解  _result

  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代码  Struts2 Result详解  _result

  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代码  Struts2 Result详解  _result

  1. <result name="success" type="json">  

  2.                       

  3. </result>  

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

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

 

  • Struts2 Result详解  _Struts2_12