以前在采用Struts2开发的项目中,对JSON的处理一直都在Action里处理的,在Action中直接Response,最近研读了一下Struts2的源码,发现了一个更加优雅的解决办法,自己定义一个ResultType,
首先大家先看下Struts2中的源码
包com.opensymphony.xwork2下的DefaultActionInvocation
472行
[java] view plaincopyprint?
- /**
- * Save the result to be used later.
- * @param actionConfig current ActionConfig
- * @param methodResult the result of the action.
- * @return the result code to process.
- */
- protected String saveResult(ActionConfig actionConfig, Object methodResult) {
- if (methodResult instanceof Result) {
- this.explicitResult = (Result) methodResult;
- // Wire the result automatically
- container.inject(explicitResult);
- return null;
- } else {
- return (String) methodResult;
- }
- }
如果resultType实现了Result接口,则执行
[java] view plaincopyprint?
- this.explicitResult = (Result) methodResult;
- // Wire the result automatically
- container.inject(explicitResult);
- return null;
现在我们来定义一个接口(JsonResult)来处理一般的POJO对象
[java] view plaincopyprint?
- package com.kiloway.struts;
- import java.io.PrintWriter;
- import javax.servlet.http.HttpServletResponse;
- import net.sf.json.JSONObject;
- import net.sf.json.JsonConfig;
- import org.apache.struts2.ServletActionContext;
- import org.apache.struts2.dispatcher.StrutsResultSupport;
- import com.opensymphony.xwork2.ActionInvocation;
- public class JsonResult extends StrutsResultSupport {
- private Object result;
- private JsonConfig jsonConfig;
- public Object getResult() {
- return result;
- }
- public JsonResult(JsonConfig jsonConfig) {
- super();
- this.jsonConfig = jsonConfig;
- }
- public void setResult(Object result) {
- this.result = result;
- }
- private static final long serialVersionUID = 7978145882434289002L;
- @Override
- protected void doExecute(String finalLocation, ActionInvocation invocation)
- throws Exception {
- HttpServletResponse response = null;
- try {
- response = ServletActionContext.getResponse();
- PrintWriter printWriter = response.getWriter();
- if (jsonConfig != null) {
- printWriter.write(JSONObject.fromObject(result).toString());
- } else {
- printWriter.write(JSONObject.fromObject(result, jsonConfig)
- .toString());
- }
- }catch(Exception e){
- throw new Exception("json parse error!");
- } finally {
- response.getWriter().close();
- }
- }
- }
JsonReulst定义好了该如何让Struts处理呢?
我们在struts.xml里面可以这样定义
[html] view plaincopyprint?
- <package name="default" namespace="/" extends="struts-default">
- <result-types>
- <result-type name="jsonResult" class="com.kiloway.struts.JsonResult"/>
- </result-types>
- <action name="student" class="com.kiloway.struts.Student">
- <result name="json" type="jsonResult"/>
- </action>
- </package>
reuslt的name可以任意,但type必须和你注册的ResultType相同。
Action 中直接这样调用
[java] view plaincopyprint?
- public JsonResult getJson()
- {
- UserInfo f = new UserInfo();
- f.setName("小睿睿");
- f.setPassword("哈哈");
- JsonResult jsonResult = new JsonResult();
- jsonResult.setResult(f);
- return jsonResult;
- }
在我们的Action代码中就不用response.write了,完全交给了Reuslt对象去处理了(doExecute)
这样就很方便的处理了JSON格式的数据
在我下载的最新的struts的开发包里,发现了一个JSON处理插件 struts2-json-plugin-2.3.8.jar
该插件提供了更完善的JSON处理解决方案,下篇文章会介绍该插件的使用方式
来源:http://blog.csdn.net/myxx520/article/details/8655088
时间: 2024-10-14 10:39:51