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类:

 

 

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

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

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

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

 

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

 

 

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

 

代码如下:

应该很容易懂了。。嘿嘿


    • package  commons.struts2;
    • import  java.io.PrintWriter;
    • import  javax.servlet.http.HttpServletResponse;
    • import  org.apache.struts2.dispatcher.StrutsResultSupport;

  • import  com.opensymphony.xwork2.ActionInvocation;
  • /**
  •  * result type for output string in action
  •  * 
  •  * @author songwei,yaolei <b>Example:</b>
  •  * 
  •  * <pre>
  •  * <!-- START SNIPPET: example -->
  •  * <result name="success" type="string">
  •  *   <param name="stringName">stringName</param>
  •  * </result>
  •  * <!-- END SNIPPET: example -->
  •  * </pre>
  •  * 
  •  */
  • public   class  StringResultType  extends  StrutsResultSupport {
  •      private   static   final   long  serialVersionUID = 1L;
  •      private  String contentTypeName;
  •      private  String stringName =  "" ;
  •      public  StringResultType() {
  •          super ();
  •     }
  •      public  StringResultType(String location) {
  •          super (location);
  •     }
  •      protected   void  doExecute(String finalLocation, ActionInvocation invocation)
  •              throws  Exception {
  •         HttpServletResponse response = (HttpServletResponse) invocation
  •                 .getInvocationContext().get(HTTP_RESPONSE);
  •          // String contentType = (String)
  •          // invocation.getStack().findValue(conditionalParse(contentTypeName,
  •          // invocation));
  •         String contentType = conditionalParse(contentTypeName, invocation);
  •          if  (contentType ==  null ) {
  •             contentType =  "text/plain; charset=UTF-8" ;
  •         }
  •         response.setContentType(contentType);
  •         PrintWriter out = response.getWriter();
  •          // String result = conditionalParse(stringName, invocation);
  •         String result = (String) invocation.getStack().findValue(stringName);
  •         out.println(result);
  •         out.flush();
  •         out.close();
  •     }
  •      public  String getContentTypeName() {
  •          return  contentTypeName;
  •     }
  •      public   void  setContentTypeName(String contentTypeName) {
  •          this .contentTypeName = contentTypeName;
  •     }
  •      public  String getStringName() {
  •          return  stringName;
  •     }
  •      public   void  setStringName(String stringName) {
  •          this .stringName = stringName;
  •     }
  • }
  •  

e="color: #000000;">使用的方法:

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”。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值