`
dreamoftch
  • 浏览: 486163 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

struts2和json的集成

阅读更多

 

 

参考资料:

http://struts.apache.org/release/2.3.x/docs/json-plugin.html

 

注意:

 

步骤

1.引入jar包

2.struts.xml中加入自定义的package:

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="json-package" extends="json-default" abstract="true">
		<interceptors>
			<!-- 定义自己的拦截器栈 -->
			<interceptor-stack name="my-interceptor-stack">
				<!-- 将json拦截器加进来 -->
				<interceptor-ref name="json" />
				<!-- 这个默认拦截器栈不要忘了加上 -->
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
		</interceptors>
		
		<!-- 将自定义的拦截器栈设为默认拦截器栈 -->
		<default-interceptor-ref name="my-interceptor-stack"/>
	</package>

	<package name="default" namespace="/LBAdmin/onlineservice" extends="json-package">
		<action name="xxx" class="yyy"
			method="xxx">
			<result name="json" type="json">
				<param name="root">jsonResult</param>
			</result>
		</action>		
	</package>
</struts>

 

上面就可以将action中的jsonResult属性以json格式返回

3.上面只是获取json结果,另外还有就是请求中携带的json格式的数据传递给action里面的属性中,这就需要在jquery的ajax请求中设置一下了:

假如下面的data是一个json数据,例如: var data = {};   var user = {}; user.age = 23;  user.sex = '男'; data.user1 = user;   这种格式的话:

 

首先需要将使用JSON.stringify(data)处理一下(需要引入JSON2.js),然后就是ajax请求里面需要指定 contentType 为 application/json  的格式;

 

 

                data = JSON.stringify(data);
		$.ajax({
			type:"post",
			url:url,
			data:data,
			dataType:"json",
			contentType:"application/json",
			success:callback
		});

 

 

 

首先引入jar包 

 

struts2-json-plugin-2.x.x.jar

 

 

Maven的引入方式:

<dependencies>
   <dependency>
       <groupId>org.apache.struts</groupId>
       <artifactId>struts2-json-plugin</artifactId>
       <version>2.x.x</version>
   </dependency>
</dependencies>
 

我使用的版本号是 2.3.12

 

struts2-json-plugin-2.3.12.jar

 

 

 

然后在struts.xml中的package继承json-default:

 

<package name="default" namespace="/" extends="json-default">

</package>

 

 

这样就可以使用

 

<result type="json"></result>

 

 了

 

例如:struts.xml:

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="json-default">
        <action name="json" class="com.tch.test.json.action" method="json">
               <!--默认会把所有的具有get方法的变量都放到json结果中-->
        	<result type="json"></result>
        </action>
        <action name="json2" class="com.tch.test.json.action" method="json">
        	<result type="json">
                       <!--这样就可以只把指定的变量customName放到json结果中-->
        		<param name="root">
				    customName
			</param>
        	</result>
        </action>
    </package>

</struts>

  

对应的action:

 

package com.tch.test.json.action;

import java.util.HashMap;
import java.util.Map;

import org.apache.struts2.json.annotations.JSON;
import com.opensymphony.xwork2.ActionSupport;

public class MyAction extends ActionSupport {
	private static final long serialVersionUID = 1L;
	private String field1 = "str";
    private int[] ints = {10, 20};
    private Map<String,String> map = new HashMap<String,String>();
    private String customName = "custom";

    //'transient' fields are not serialized
    private transient String field2;

    //fields without getter method are not serialized
    private String field3;

	public String json(){
		return SUCCESS;
	}	

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public int[] getInts() {
        return ints;
    }

    public void setInts(int[] ints) {
        this.ints = ints;
    }

    public Map<String,String> getMap() {
        return map;
    }

    public void setMap(Map<String,String> map) {
        this.map = map;
    }

    @JSON(name="newName")//这是为了让json现实的变量名为指定的值newName而不是默认的customName
    public String getCustomName() {
        return this.customName;
    }
}

 

 

然后部署访问json:http://localhost:8080/test/json

结果为:{"newName":"custom","field1":"str","ints":[10,20],"map":{}}

 

然后部署访问json:http://localhost:8080/test/json2

结果为:"custom"

 

 然后在页面中使用ajax测试一下:

 

首先访问json:

 

$.getJSON('json.action',function(data){
	alert(data.newName);
});

 

结果为:custom

 

 

然后访问json2:

$.getJSON('json2.action',function(data){
	alert(data[1]);
});

 

结果为 20

 

完事。

 

最后附上代码:

http://pan.baidu.com/s/1I8n2

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics