`
wangyijiangshui
  • 浏览: 85960 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类

1、Struts2之Json处理

 
阅读更多

1、使用Struts2自带Json数据支持。

如果页面采用Ajax请求数据,且希望Struts2返回Json数据那么可以采用Struts2自带的对Json的支持功能。Struts2对Json的支持主要是通过拦截器实现的,只需在Struts.xml中稍做配置,然后Action中遵守一定规则即

可。

①、配置Struts.xml文件如下: 

<!-- 专门用于json数据处理的包,该包中的action支持响应json格式的字符串 -->
	<package name="jsonpak" namespace="/" extends="json-default">
		<action name="studentJson" class="studentAction" method="queryStudentsJson">
			<result name="studentList" type="json"></result><!--将action的bean属性以json字符串返回浏览器-->
		</action>
	</package>

 注意,必需继承json-default包,result设置成json之后,容器会把action中所有以get开头的方法自动封装到一个json对象中(json拦截器来做,注意封装到json中的数据与action中的属性无关,只与get开头的方法有关,即使一个属性都没有,只要有get开头的方法,struts都会正常封装json字符串),然后调用js的callback方法,返回json数据。

②、在对应的Action的方法中将处理后的数据放置到对应的类属性用,并且属性提供get方法,即可。对于上面的配置,在方法queryStudentsJson中将需要返回的数据对象赋给类属性(有对应的get方法)后,返回到

studentList结果视图中即可(return "studentList")。

 

2、Struts2支持Jons所需Jar包。

使用Struts2的Json支持功能,需要的jar包有:commons-lang-2.4.jar;json-lib-2.3-jdk13.jar;jsonplugin-0[1].32.jar;ezmorph-1.0.2.jar;commons-beanutils-1.7.0.jar。

 

3、使用Struts2自带Json支持功能的全部数据Json化问题。

按照上面实现json处理后,会出现一个问题,struts2的拦截器会将Action类中所有的get方法都格式化到Josn字符串中,而在实际需求中,可能只需要部分数据,这时可以采用xml配置或者注解功能,实现筛选控制,这样可以有选择的格式化部分数据到json字符串中。

①、配置Struts.xml文件实现:action标签的子标签result中提供了一些参数解决这个问题,一般情况下用的最多的就是includeProperties 参数和excludeNullProperties参数。 

includeProperties 参数:输出结果中需要包含的属性值,这里正则表达式和属性名匹配,可以用“,”分割填充多个正则表达式。这个参数直接返回对象的json数据,前台不需要eval转换,<param name="root">result</param>则不同,需要前台进行eval转换如:输出data对象下面的所有属性 和 总条数。
<result type="json">
    <param name="includeProperties">totalCount,data.*</param>
</result>

excludeProperties 参数:输出结果需要剔除的属性值,也支持正则表达式匹配属性名,可以用“,”分割填充多个正则表达式,类同includeProperties

更多配置参考如下:
<result type="json">     
	<!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->     
	<!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->     
	<param name="root">dataMap</param> 
    
	<!-- 指定是否序列化空的属性 -->     
	<param name="excludeNullProperties">true</param>
   
	<!-- 这里指定将序列化dataMap中的那些属性 -->     
	<param name="includeProperties">userList.*</param> 
    
	<!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 -->  
	<param name="excludeProperties">SUCCES</param>  
</result>

 ②、在action中的get方法上加注解。

默认情况下以get方法开头的都会序列化,如果不想序列化,在action中的相应get方法要打上注解@JSON(serialize=false)
如果在属性get方法上面加@JSON(name="newName"),则返回的json数据中名称是指定的新名称。
@JSON(format ="yyyy-MM-dd'T'HH:mm:ss")设置用于格式化输出、解析日期表单域的格式。
@JSON(deserialize=true)设置是否反序列化该属性

 

4、 使用json功能,报如下错误。

Class com.googlecode.jsonplugin.JSONWriter can not access a member of class*

Class org.apache.struts2.json.JSONWriter can not access a member of class oracle.jdbc.driver.BaseResultSet with modifiers "public"

上面的错误是初使用Struts2的json功能的开发人员经常遇到的。

错误含义:不能把程序中的某种数据结构串行化成json格式。

原因:struts2的action里面的数据转换成json数据时,会将提供了get方法的属性都串行化输出JSON到客户端。有的时候,很多属性并不能串行化成json数据,比如这里的oracle.jdbc.driver.BaseResultSet。这时还进行强行转换就会出现这样的异常。

解决方法:在不能串行化到json的属性相应的get方法前加一条json标记 @JSON(serialize=false)。告诉json不需要转化这个属性。或者根本不写这个get方法。

 

5、自实现Json数据返回

不采用Struts2自带的Json功能,直接操作response对象实现json格式数据返回,这样不但简单,而且回避了上面的各种问题。

①、Struts.xml中不再需要特殊配置,直接继承struts-default包即可,参考如下:

<!-- 处理学生信息的action -->
	<action name="pageQuery" class="classAction" method="pageQueryClasses">
	</action>
	<action name="createClass" class="classAction" method="createClass">
	</action>
	<action name="updateClass" class="classAction" method="updateClass">
	</action>
	<action name="deleteClassById" class="classAction" method="deleteClassById">
	</action>
	<action name="getClassById" class="classAction" method="getClassById">
	</action>
</package>

action标签中不再需要result子标签,在Action对应的方法中直接返回null即可。

public class ClassAction extends BaseAction  implements ModelDriven<Classe>{

	private static final long serialVersionUID = 8354047356806230499L;
	/* ClassService接口 */
	private IClassService classService = null;
	private Classe classe = new Classe();
	
	/**
	 * 分页查询数据
	 * 
	 * @return
	 * @throws Exception
	 */
	public String pageQueryClasses() throws Exception {
		int sourceNum = classService.getCount("");
		List<Classe> classes = classService.findPage("", this.getPage(), this.getRows());
		Page pageObj = new Page(0, sourceNum, 10, classes);
		this.sendJsonDataToClient(JSONObject.fromObject(pageObj).toString(), ServletActionContext.getResponse());
		return null;
	}
………………………………………………………………

  其中sendJsonDataToClient方法体如下:

/**
 * 将指定的数据写到客户端
 * 
 * @param jsonData
 * @param response
 */
 public void sendJsonDataToClient(String jsonData, HttpServletResponse response) {
	response.setContentType("text/html;charset=UTF-8");
	response.setHeader("Pragma", "no-cache");
	response.setHeader("Cache-Control", "no-cache, must-revalidate");
	response.setHeader("Pragma", "no-cache");
	try {
		response.getWriter().write(jsonData);
		response.getWriter().flush();
		response.getWriter().close();
	} catch (IOException e) {
		e.printStackTrace();
	}
 }

 

分享到:
评论

相关推荐

    struts2+json

    请求的目标是一个Struts2 Action,Action处理完业务逻辑后,通过JSON返回数据。 为了实现这一功能,Action类需要包含将要序列化成JSON的属性,并且需要配置对应的Action Mapping。在struts.xml配置文件中,你可以...

    struts2与json整合

    该插件包含处理JSON相关的类库,使得Struts2能够识别并处理JSON格式的数据。具体来说,插件中的`struts-plugin.xml`配置文件定义了一个名为`json-default`的包,其中包含了`JSONResult`和`JSONInterceptor`两种结果...

    json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar

    这个插件允许开发者在Struts 2中轻松地创建能够返回JSON的Action,使得前端(通常使用JavaScript库如jQuery)可以获取到JSON数据并进行进一步处理。 现在我们来详细讨论这两个库在实际应用中的作用: 1. **json-...

    struts2-json-plugin源码

    1. **Action结果类型**:在Struts2中,Action的结果类型决定了如何处理Action的返回值。`struts2-json-plugin`添加了JSON结果类型,当Action返回此类型时,会将结果转换为JSON格式。 2. **JSONResult类**:这是实现...

    struts2返回JSON数据的两种方式

    Struts2提供了一套方便的机制来支持JSON数据的处理。 ### 第一种方式:使用`response.getWriter().print(...)`方法 1. **前端**: 在JSP页面中,使用jQuery的AJAX方法发送POST请求到服务器。这里的`dataType`设置...

    struts2-json

    1. **Struts2 JSON插件**: Struts2提供了JSON插件,允许开发者在Action类中返回JSON响应。安装插件后,只需在Action配置中启用JSON支持,就能自动处理JSON输出。 2. **Action配置**: 在Struts2的配置文件...

    Struts2+Json+Android简单实现

    1. **服务端**:在Struts2的Action类中,定义一个方法处理请求,该方法可能需要访问数据库或其他业务逻辑,然后将结果转化为JSON对象。通过配置struts.xml,设定这个方法返回JSON类型的结果。 2. **客户端**:在...

    struts2-json-plugin-2.3.8.jar

    3. 集成了Jackson库:默认情况下,Struts2 JSON Plugin使用Jackson库进行JSON序列化和反序列化,Jackson是一个高性能的JSON处理库,提供了丰富的API和灵活性。 4. 异常处理:在出现异常时,插件可以自动捕获并返回...

    struts2所需的包和Struts2_json所需包

    - `jackson-*.jar` 或 `gson-*.jar`:这两个库提供了JSON对象和Java对象之间的自动转换,Struts2可以与它们集成,使得JSON处理更加便捷。 4. **Servlet容器相关库**:由于Struts2是基于Servlet API的,因此需要`...

    Struts2与JSON

    1. **配置Struts2**: 首先,确保你的项目已经引入了Struts2的核心库和JSON插件。在`struts.xml`配置文件中,添加JSON结果类型: ```xml &lt;constant name="struts.enable.SlashesInActionNames" value="true"/&gt; ...

    struts2-json-lib

    1. 添加JSON插件到项目的类路径:确保`struts2-json-plugin-x.x.x.jar`在类路径中,并在`struts.xml`配置文件中启用JSON插件。 2. 配置Action:在Action类中,添加`@Result`注解或者在XML配置文件中定义结果类型为`...

    Struts2_JSON_Demo

    1. **Struts2 JSON插件**:Struts2提供了内置的JSON插件,允许我们直接将Action的返回值转换为JSON格式。安装并配置该插件后,只需在Action类的方法上添加`@Result(type="json")`注解,即可启用JSON响应。 2. **...

    Struts2 ajax json使用介绍

    3. JSON处理库:`json-lib.jar`(通常在Struts2的JSON插件中已经包含) 确保这些库被添加到项目的类路径中,以便Struts2能够解析并返回JSON数据。 **二、编写页面** 在前端,我们需要一个使用Ajax的HTML页面。...

    AJAX和struts2传递JSON数组

    在本场景中,我们将探讨如何使用AJAX来传递JSON数组,并在Struts2的Action中接收和处理这些数据。 首先,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,同时也易于机器解析...

    struts2+json的使用

    在Struts2中集成JSON,可以方便地将服务器端处理的结果以JSON格式传递给前端,简化数据传输并提高应用性能。 一、Struts2与JSON集成的必要性 在传统的Web开发中,服务器通常返回HTML页面来更新客户端视图。然而,...

    使用Struts2的JSON插件来实现JSON数据传递

    Struts2的JSON插件正是为了方便开发者在Struts2框架中处理JSON数据而设计的。 首先,让我们深入了解JSON。JSON是一种独立于语言的数据交换格式,具有易于人阅读和编写,同时也易于机器解析和生成的特点。它的数据...

    Struts2处理json简介及注意事项

    1. **添加依赖**:首先,需要在项目中引入Struts2的JSON插件。通常,这可以通过在Maven的pom.xml文件中添加相关依赖,或者在构建路径中手动添加struts2-json-plugin.jar来完成。 ```xml &lt;groupId&gt;org.apache....

    struts2返回json

    1. **添加依赖**:首先,你需要确保你的项目已经包含了Struts2的JSON插件。这通常意味着在Maven的pom.xml文件或构建脚本中添加相关的依赖。 2. **配置Action**:在你的Action类中,你需要定义一个方法来处理请求并...

    Struts2.5操作JSON相关jar包

    1. `com.opensymphony.xwork2`: 这是Struts2的基础组件,负责处理Action的映射和执行。 2. `org.apache.struts2`: 包含了Struts2的核心API,如Interceptor(拦截器)和Result(结果类型)等。 3. `org.json`: 提供了...

    struts2-json包集合 不会出现任何报错

    - 配置Struts2的配置文件(struts.xml或struts-default.xml),添加JSON插件的配置,以便让Struts2框架知道如何处理JSON相关的Action。 - 确保Action类中有相应的getter和setter方法,以便JSON插件能够正确地序列化...

Global site tag (gtag.js) - Google Analytics