您的位置:首页 > 编程语言 > Java开发

struts2 使用ajax 传递json数据

2016-01-16 13:01 961 查看
先搭建一个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的形式来访问对象数据了。

最后附上项目源码的连接:

点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: