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

来源:互联网 发布:c语言1000以内水仙花数 编辑:程序博客网 时间:2024/05/16 02:54

 

来源:http://blog.csdn.net/d8111/archive/2008/09/11/2914079.aspx

 

 

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

 

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

 

    先看官方文档对plain text结果的定义:“A result that send the content out asplain text. Usefull typically when needed to display the raw content ofa 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”。

原创粉丝点击