空间站

北极心空

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
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 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”。

 

 

第三种方式:利用Velocity ResultFreeMarker Result

类似第一种方式,这里不再重复

posted on 2008-11-24 12:54 芦苇 阅读(3349) 评论(1)  编辑  收藏 所属分类: Struts

Feedback

# Site Promotion 2009-05-18 09:19 Site Promotion
Good evening. You need only claim the event of your life to make yourself yours. When you truly possess all you have been and done, which may take some time, you are fierce with reality.
I am from Gabon and learning to read in English, tell me right I wrote the following sentence: "Seo software can help you to acquire targeted traffic interested in your business.Optimize your website get top rankings for."

Waiting for a reply :o, Ellen.  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: