webwork2.1.7没有带json类型的result,2.2.7中的json类型的result好像有bug,不支持encoding编码。这里写了一个result,可以通用,并且可以将普通的POJO转化成JSON对象。很好用
package com.xujun.framework.webwork;
import java.io.OutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.Result;
import org.json.JSONObject;
/**
* 支持自动组装JSONObject的JSONResult,支持encoding编码。
* @author 徐骏
* @data 2009-11-25
*/
public class JSONResult implements Result
{
private static final Log LOG = LogFactory.getLog(JSONResult.class);
//action中的json对象的名词
private String jsonObjectProperty = "jsonObject";
private String contentType = "application/json";
private String encoding = "utf-8";
@Override
public void execute(ActionInvocation invocation) throws Exception
{
if (LOG.isDebugEnabled())
{
LOG.debug("executing JSONResult");
}
// 通过xwork的invocation从webwork的action中获得JSONObject对象
JSONObject jsonObject = getJSONObject(invocation);
if (jsonObject != null)
{
String json = jsonObject.toString();
HttpServletResponse response = getServletResponse(invocation);
response.setContentType(getContentType());
// encoding
byte[] bs = json.getBytes(this.encoding);
response.setContentLength(bs.length);
OutputStream os = response.getOutputStream();
os.write(bs);
os.flush();
if (LOG.isDebugEnabled())
{
LOG.debug("written [" + json
+ "] to HttpServletResponse outputstream");
}
}
}
protected JSONObject getJSONObject(ActionInvocation invocation)
throws Exception
{
ActionContext actionContext = invocation.getInvocationContext();
//从xwork配置中获得JSON对象名词
Object obj = actionContext.getValueStack()
.findValue(jsonObjectProperty);
if (obj == null)
{
LOG.error("property [" + jsonObjectProperty
+ "] returns null, please check xwork.xml file");
return null;
}
//如果Action中的对象是JSONObject,那么就不需要反射动态转换为JSONObject
//如果Action中的对象就是POJO,那么这里自动组装JSONObject
if (!JSONObject.class.isInstance(obj))
{
LOG.debug("build json object by reflection.");
JSONObject jsonObj = new JSONObject();
for (Field field : obj.getClass().getDeclaredFields())
{
String getter = "get"
+ Character.toUpperCase(field.getName().charAt(0))
+ field.getName().substring(1);
jsonObj.append(field.getName(), obj.getClass()
.getDeclaredMethod(getter).invoke(obj));
}
return jsonObj;
}
return (JSONObject) obj;
}
protected HttpServletResponse getServletResponse(ActionInvocation invocation)
{
return (HttpServletResponse) invocation.getInvocationContext()
.getContextMap().get(ServletActionContext.HTTP_RESPONSE);
}
public void setEncoding(String encoding)
{
this.encoding = encoding;
}
public String getEncoding()
{
return encoding;
}
public void setJsonObjectProperty(String jsonObjectProperty)
{
this.jsonObjectProperty = jsonObjectProperty;
}
public String getJsonObjectProperty()
{
return jsonObjectProperty;
}
public void setContentType(String contentType)
{
this.contentType = contentType;
}
public String getContentType()
{
return contentType;
}
}
xwork.xml配置
<!--My Result-->
<result-types>
<result-type name="json" class="com.xujun.framework.webwork.JSONResult" />
</result-types>
<action name="jsonTest" class="com.ntyl.action.JSONAction">
<result name="success" type="json">
<param name="jsonObjectProperty">user</param>
</result>
</action>
JSONAction.java 注意User对象是POJO,我自己写的一个对象,result会自动的转化成JSONObject,当然如果这里就是一个JSONObject,通过put方法设置属性,那么也完全没有问题.
public class JSONAction implements Action{
private User user;
public User getUser()
{
return user;
}
/**
* @see com.opensymphony.xwork.Action#execute()
*/
public String execute() throws Exception
{
user = new User();
user.setUserName("xujun");
user.setPassword("123456");
user.setUserId(1);
return Action.SUCCESS;
}
}
分享到:
相关推荐
- **实施WebWork动作**:第四章讲解了如何实现WebWork中的动作,包括动作的定义、参数传递、异常处理等内容。 - **使用拦截器增加功能**:第五章重点介绍了拦截器的作用及其配置方法,读者可以通过拦截器来增强动作...
5. 结果处理器(Result)根据Action返回的结果类型,决定如何展示给用户,如转发到JSP页面或者生成JSON响应。 6. 视图层(如JSP)从ValueStack中获取数据,渲染输出。 三、Webwork2中的MVC模式 1. **Model**: 业务...
WebWork框架允许开发者自定义主题,通过CSS和模板引擎实现统一的页面样式,提升用户体验的一致性。 ### 核心概念与技术 #### 配置与管理 WebWork框架通过XML配置文件来管理请求映射、拦截器、主题等,这为开发者...
4. **Result**:定义了Action执行后的响应,可以是重定向、转发到特定的JSP页面,或者返回JSON、XML等格式的数据。 5. **ValueStack**:WebWork中的一个重要概念,它是一个对象栈,用于存储Action的属性,方便在...
此外,WebWork的Action和Result概念为处理HTTP请求和返回响应提供了简洁的模型。 Struts 2的诞生是在2005年,当Apache软件基金会决定将WebWork与Apache Struts 1.x合并,以创建一个更强大、更现代的框架。这次合并...
在SSH+EXTJS+JSON的组合中,Spring负责后端业务逻辑和数据访问,Struts2处理MVC流程,Hibernate处理数据持久化,EXTJS构建前端用户界面,而JSON作为前后端数据交换的格式,提高了数据传输效率和易读性。这种组合在...
2. **Interceptor**: 拦截器是Struts2中的一个重要概念,它允许在Action执行前后插入自定义逻辑,比如日志记录、权限验证、事务管理等。通过配置拦截器栈,开发者可以灵活地控制请求的处理流程。 3. **Value Stack*...
Struts2是Apache软件基金会下的一个项目,它继承了WebWork框架的核心功能,同时也吸取了Struts1的优点,提供了更灵活、强大的控制层解决方案。 一、Struts2核心概念 1. Action:Action是Struts2的核心,它是业务...
对于压缩包中的"api"文件,可能包含的是Struts的官方API文档,或者是开发者自定义的扩展API,这些都可以作为开发和调试的参考资料。 总之,Struts API是Java Web开发的重要工具,通过学习和掌握其API,开发者可以...
首先,Struts 2.0是Struts 1的升级版本,它融合了WebWork框架的许多优秀特性,提供了更强大、灵活的控制层解决方案。它的核心组件包括Action、Result、Interceptor等,这些组件共同协作以实现业务逻辑的处理和视图的...
Struts2框架整合了WebWork的核心功能和其他优秀框架的特点,提供了灵活的MVC实现,简化了Java Web应用的开发流程。 **一、Struts2框架基础** Struts2的核心组件包括Action、Result、Interceptor(拦截器)等。...
在实际开发中,开发者需要将这些jar包添加到项目的类路径中,然后按照Struts 2的配置规范设置struts.xml文件,定义Action、Result以及拦截器链。此外,还需要创建Action类,实现业务逻辑,并使用OGNL来绑定数据。 ...
- **基本概念**:解释Struts2中的核心概念,如Action、Interceptor、Result等,帮助初学者理解框架的基本架构。 #### 三、Struts2核心概念详解 - **体系结构**:深入讲解Struts2的架构组成,包括请求处理流程、MVC...
Struts2.16支持多种Result类型,如dispatcher(用于转发到JSP页面)、stream(用于文件下载)和json(用于AJAX请求)。 2. **Interceptor(拦截器)**:拦截器是Struts2的重要特性,它允许开发者在Action执行前后...
- **12.4 Struts2与JSON示例**:如何在Struts2应用中使用JSON进行前后端交互。 #### 十三、集成Hibernate - **13.1 系统总体设计图**:整体架构设计思路。 - **13.2 系统用例图**:系统的主要功能模块。 - **13.3 ...
1. **Action和Result**:Struts2中的Action是业务逻辑的载体,而Result则是Action执行后的结果,例如跳转到某个页面或执行其他操作。这些类在核心包中定义。 2. **配置管理**:包括struts.xml配置文件,用于定义...
6. **插件和UI标签库**:Struts2提供了一系列插件,如Tiles、JSON、Ajax等,用于增强功能。同时,其丰富的标签库简化了JSP页面的编写,如s:form、s:textfield、s:submit等。 7. **异常处理与国际化**:了解如何在...
- 在Action配置中应用自定义拦截器。 #### 七、探讨IOC模式 - **IOC(Inversion of Control)**: - 控制反转的概念:将对象创建和依赖注入的过程从代码中分离出来。 - Struts2如何支持IOC:通过配置文件指定...
Result定义了请求处理后的输出,可以是JSP、Freemarker模板、JSON等格式。 2. **拦截器(Interceptor)**:拦截器是Struts2的一大创新,它们是可插拔的组件,可以在Action执行前后插入,实现如日志、权限验证、事务...