先搭建一个struts2的项目,在lib目录下导入struts2开发的基础包,即必须要的。一定要先下载一个版本的全部struts2jar包,然后从这个包里面逐一添加所需要的包,不能需要哪个包然后从网上下载,下一次需要另一个包又从另一个网下载,这样可能会导致各个包由于版本问题而导致冲突报错,很难解决。
然后是代码。
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 配置struts2为项目的controller -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>ajax.jsp</welcome-file>
</welcome-file-list>
</web-app>
前台界面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<script type="text/javascript" src="/Struts2Ajax/js/jquery.min.js"></script>
<script type="text/javascript" src="/Struts2Ajax/js/json2.js"></script>
</head>
<body>
<input id="name" type="text">
<input id="msg" type="button" value="ok">
</body>
<script type="text/javascript">
$(document).ready(function () {
$("#msg").click(function () {
var params = {
name : $("#name").val(),
};
$.ajax({
url:'ajaxRequest',
type:'POST',
data: params,
dataType:'json',
success:function (data) {
alert(data.result);
alert(data.jo.gg);//直接访问不行;
console.log(data);
var obj = JSON.parse(data.js);
alert(obj.gg);
}
});
});
});
</script>
</html>
Action:
package com.ajax;
import java.util.HashMap;
import java.util.Map;
import net.sf.json.JSONObject;
public class AjaxAction {
private String name;
private JSONObject jo;
private String result;
private Map<String, String> map = new HashMap<>();
private int a = 1000000;
private String js;
public String getName() {
return name;
}
// ajax请求参数赋值
public void setName(String name) {
this.name = name;
}
// ajax返回结果
public String getResult() {
return result;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public String execute() {
this.result = "Hello! " + this.name + ".";
int a=10;
int b=100;
map.put("gg", "gl");
map.put("1", "55");
map.put("2", "88");
jo = JSONObject.fromObject(map);
js = jo.toString();
System.out.println(js);
return "success";
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public String getJs() {
return js;
}
public void setJs(String js) {
this.js = js;
}
public JSONObject getJo() {
return jo;
}
public void setJo(JSONObject jo) {
this.jo = jo;
}
}
struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<!--采用json数据格式,package的extends必须是extends="json-default"-->
<package name="testAjax" extends="json-default">
<action name="ajaxRequest" class="com.ajax.AjaxAction">
<result type="json">
<param name="includeProperties">name,result,a,map,js,jo</param>
</result>
</action>
<!--客户端请求(非动态调用)-->
</package>
</struts>
下面逐一说明。
先说要加入的与json有关的jar包:
1.json-lib-2.4-jdk15.jar,这是java代码中把java对象转化为json字符串所需要的包,当然这个jar本身也会有一些依赖的jar要导入,根据具体的jar导入情况补充加入即可。
使用这个包的JSONObject对象的方法可以把一个对象转化为一个json string传给前台,只有转化为json string的对象才能在前台的js中解析数据,否则,如果直接传输java对象,前台是知道这是一个Object类型的东西,但不知道它具体的数据是什么,也就是说没法解析。关于这一点我们可以在AjaxAction中看到,我会向前台传一个map对象,我同时传了map这个java对象,也传了map使用JSONObject转化以后生成的json格式的string对象,即我命名为js的对象,最后我在前台查看时,发现map无法解析,只是一个object,而js则显示为一个map的字符串格式的对象,里面的数据可以解析。
如下图:
只有经过JSONObject对象处理的java对象,前台的js才可以解析。
2.struts2-json-plugin-2.3.16.1.jar包,这个包是用于struts2对与json的支持的。这个jar要与之前的struts2jar版本统一,否则可能报错,最好从之前下载的全部struts2jar里面复制出来。那么struts2对于json的支持体现在哪里呢?答案是strust.xml文件。
(1)处理ajax的action配置,必须放在继承自”json-default“包的packge下才可以,而这个json-default就是定义在struts2-json-plugin-2.3.16.1.jar里面。
(2)<result>标签的写法:
<result type="json"></result>如果是这样写的话,默认ajax会返回action中定义的全部带有getter方法的成员变量,前台使用的时候就“data.成员”即可 。
<result type="json">
<param name="includeProperties">name,result,a,map,js,jo</param>
</result>
而如果用上面的方式的话,就指定了ajax要返回的变量名称,它不会全部返回所有成员,而是写了哪几个就返回哪几个,具体定义在param标签里面,当然必须提供getter方法。
3.json2.js:
这个是一个前台解析json 数据的js库。也需要引入。为的是方便解析map等集合对象。简单的string或者int就不要了,主要针对集合对象,因为js前台拿到的是一个json字符串,解析起来比较复杂,而引入这个js文件就会方便一些。
var obj = JSON.parse(data.js);
alert(obj.gg);
只需要使用parse方法就可以将json string转化为js里的对象,省略了很多对string的操作,很方便。如上,data.js是我们map对象的json string格式,使用parse方法后,直接得到了map对象,就可以直接用map.key的形式来访问对象数据了。
最后附上项目源码的连接: