Struts2输出XML格式的Result

来源:互联网 发布:网络教育招生方案 编辑:程序博客网 时间:2024/06/05 00:25

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