zoukankan      html  css  js  c++  java
  • Struts2输出XML格式的Result

     

    扩展Struts2--自定义String和XML格式的Result 

    struts2虽然继承了webwork优秀的MVC分离,可是有很多地方让人百思不得其解!最让人离谱的是,返回的结果集中居然没有String,xml这两种非常常用的类型。还是自己动手,丰衣足食:

    第一种方式:使用“PlainText Result”

        先看官方文档对plain text结果的定义:“A result that send the content out as plain text. Usefull typically when needed to display the raw content of a JSP or Html file for example.”这是一个纯扯蛋的说法。。。貌似感觉只能返回jsp页面似的,最起码他误导了我。

        其实使用“PlainText Result” ,返回的结果是未进行格式和编码定义的字符串 什么意思?就类似于“FreeMarker Result”  ,返回一个*.ftl格式的模板,你完全可以在*.ftl写string,那么结果就是string;也可以在里面写xml,那么结果就是xml。

       举例如下:

    1. <? xml   version = "1.0"   encoding = "UTF-8"   ?>
    2. <!DOCTYPE struts PUBLIC
    3.         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    4.         "http://struts.apache.org/dtds/struts-2.0.dtd">
    5. < struts >
    6.      < package   name = "example"   namespace = "/example"
    7.          extends = "struts-default" >
    8.          < action   name = "outputXml"    method = "outxml"   class = "example.OutputXml" >
    9.              < result   name = "xmlMessage"   type = "plaintext" > </ result >
    10.          </ action >
    11.      </ package >
    12. </ struts >

    这里定义了xmlMessage为plain text结果,至于它具体是什么,看下面的Action类:

     

    1. public   class  OutputXml  extends  ActionSupport {
    2.      public   void  outxml()  throws  Exception {
    3.         HttpServletResponse response = ServletActionContext.getResponse();
    4.         response.setContentType( "text/xml " );
    5.         PrintWriter pw = response.getWriter();
    6.         pw.print( "<cc>cccccc</cc>" );
    7.     }

        在代码中,我们显式的给response定义了ContentType。 那么返回去的内容"<cc>cccccc</cc>"就会被接收方按xml进行解析。

     而如果需要返回的是String类型,那么contentType = "text/plain”。

    如果进一步需要指明编码,那么contentType = "text/plain; charset=UTF-8";

     

        到这里理解“ plain text的结果是未进行格式和编码定义的字符串”应该就不困难了。基于http的内容传输实际都是字符串型,类型的定义是放在response的contentType 中。

     

     

    第二种方式: 直接扩展struts2的结果集StrutsResultSupport 

     

    代码如下:

    应该很容易懂了。。嘿嘿

    1. package  commons.struts2;
    2. import  java.io.PrintWriter;
    3. import  javax.servlet.http.HttpServletResponse;
    4. import  org.apache.struts2.dispatcher.StrutsResultSupport;
    5. import  com.opensymphony.xwork2.ActionInvocation;
    6. /**
    7.  * result type for output string in action
    8.  * 
    9.  * @author songwei,yaolei <b>Example:</b>
    10.  * 
    11.  * <pre>
    12.  * <!-- START SNIPPET: example -->
    13.  * <result name="success" type="string">
    14.  *   <param name="stringName">stringName</param>
    15.  * </result>
    16.  * <!-- END SNIPPET: example -->
    17.  * </pre>
    18.  * 
    19.  */
    20. public   class  StringResultType  extends  StrutsResultSupport {
    21.      private   static   final   long  serialVersionUID = 1L;
    22.      private  String contentTypeName;
    23.      private  String stringName =  "" ;
    24.      public  StringResultType() {
    25.          super ();
    26.     }
    27.      public  StringResultType(String location) {
    28.          super (location);
    29.     }
    30.      protected   void  doExecute(String finalLocation, ActionInvocation invocation)
    31.              throws  Exception {
    32.         HttpServletResponse response = (HttpServletResponse) invocation
    33.                 .getInvocationContext().get(HTTP_RESPONSE);
    34.          // String contentType = (String)
    35.          // invocation.getStack().findValue(conditionalParse(contentTypeName,
    36.          // invocation));
    37.         String contentType = conditionalParse(contentTypeName, invocation);
    38.          if  (contentType ==  null ) {
    39.             contentType =  "text/plain; charset=UTF-8" ;
    40.         }
    41.         response.setContentType(contentType);
    42.         PrintWriter out = response.getWriter();
    43.          // String result = conditionalParse(stringName, invocation);
    44.         String result = (String) invocation.getStack().findValue(stringName);
    45.         out.println(result);
    46.         out.flush();
    47.         out.close();
    48.     }
    49.      public  String getContentTypeName() {
    50.          return  contentTypeName;
    51.     }
    52.      public   void  setContentTypeName(String contentTypeName) {
    53.          this .contentTypeName = contentTypeName;
    54.     }
    55.      public  String getStringName() {
    56.          return  stringName;
    57.     }
    58.      public   void  setStringName(String stringName) {
    59.          this .stringName = stringName;
    60.     }
    61. }

     

    使用的方法:

    1.Action

    1. package  test;
    2. import  com.opensymphony.xwork2.ActionSupport;
    3. public   class  MyAction  extends  ActionSupport{
    4.     String  result= "abc" ;
    5.      public  String ajax() {
    6.          return   "ajaxResponse" ;
    7.     }
    8.      // getter && setter
    9.      public  String getResult() {
    10.          return  result;
    11.     }
    12.      public   void  setResult(String result) {
    13.          this .result = result;
    14.     }
    15.     
    16. }

    2.定义struts.xml

    1. <? xml   version = "1.0"   encoding = "UTF-8"   ?>
    2. <!DOCTYPE struts PUBLIC
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    4.     "http://struts.apache.org/dtds/struts-2.0.dtd">
    5. < struts >
    6.      < package   name = "test"   extends = "struts-default" >
    7.          < result-types >
    8.              < result-type   name = "string"   class = "test.StringResultType" > </ result-type >
    9.          </ result-types >
    10.         
    11.          < action   name = "myAction"   class = "test.MyAction"   >
    12.              < result   name = "ajaxResponse"   type = "string" >
    13.                  < param   name = "stringName" > result </ param >
    14.              </ result >
    15.          </ action >
    16.      </ package >
    17. </ struts >

    无非也就是将string结果集进行申明,然后给返回“ajaxResponse”的结果绑定变量名。这里定义返回Action的String  result 变量,即“abc”。

  • 相关阅读:
    C# DataGridView显示行号的三种方法
    jQuery之前端国际化jQuery.i18n.properties
    大龄程序员的未来在何方
    【翻译】HTML5开发——轻量级Web Database存储库html5sql.js
    HBuilder webApp开发 Websql增删改查操作
    JS 互相调用iframe页面中js方法、VUE里 iframe 互调方法
    工具,百度编辑器 UEditor 使用实例化
    html 表格head头部不动 body部分滚动,每格宽同内容增加
    JS 正则收集(邮箱验证等)
    jQuery,title、仿title功能整理
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6168072.html
Copyright © 2011-2022 走看看