Blog / 阅读

Struts2+jQuery+JSON实现异步交互

by admin on 2014-04-21 14:19:51 in ,



Struts2+JQuery+JSON实现异步交互,包括从后台获得单个值、对象、List和Map数据并从前台的表达中获取值把值进行序列化通过JQuery的$.ajax({})传到后台和后台的对象进行绑定。

1.Struts2需要用到的包
这里我们以2.3.16.1为例

需要用到的jar如下

学过Struts2的同学应该很清楚这些包,除了两个似乎有点陌生,分别是struts2-json-plugin-2.3.16.1.jar和json-lib-2.1-jdk15.jar。
这两个包如果只是做普通的struts2项目,正常返回result对应的界面肯定是用不上的,但是如果需要Action返回json数据,就必须用到它们了,一个是struts2提供的json插件包,一个是插件所依赖的json解析包。


2.web.xml配置
[html] view plaincopyprint?
<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    <welcome-file-list>  
        <welcome-file>index.jsp</welcome-file>  
    </welcome-file-list>  
  
    <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>  
  
</web-app>  
这个配置是广为人知的,引入该过滤器,就相当于引入struts2框架。


3.strus2.xml配置
[html] view plaincopyprint?
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE struts PUBLIC  
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
    "http://struts.apache.org/dtds/struts-2.0.dtd">  
  
<struts>  
    <!-- *****************************JSON************start********************************** -->  
    <package name="struts2-json"  extends="json-default">    
          
        <action name="index" class="net.itcast.action.IndexAction">  
            <!-- 返回单个值的result -->  
            <result name="message" type="json"></result>  
            <!-- 返回UserInfo对象的 -->  
            <result name="user" type="json"></result>  
            <!-- 返回List对象的 -->  
            <result name="list" type="json">  
                <param name="excludeProperties">message,user,userMap,strList,strMap</param>  
            </result>  
            <!-- 返回Map对象的 -->  
            <result name="map" type="json"></result>  
            <result name="strlist" type="json"></result>  
            <result name="strmap" type="json"></result>  
        </action>  
    </package>    
    <!-- *****************************JSON************end********************************** -->  
</struts>  




strus2.xml配置 在包继承方面继承的不再是struts-default,而是json-default,以及返回类型也不再是redirect、dispatcher等,而是json。
这里我们看下json-default所对应的xml文件,它在定义中
[html] view plaincopyprint?
<?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>  
    <package name="json-default" extends="struts-default">  
        <result-types>  
            <result-type name="json" class="org.apache.struts2.json.JSONResult"/>  
        </result-types>  
        <interceptors>  
            <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>  
        </interceptors>  
    </package>  
</struts>  
看到这我们似乎明白了一些,type为json的在这里被定义。


4.Action代码
[java] view plaincopyprint?
public class IndexAction extends ActionSupport  
{  
    private String message; // 使用json返回单个值  
    private User user; // 使用json返回对象  
    private List<User> userList; // 使用josn返回List对象  
    private Map<String, User> userMap; // 使用json返回Map对象  
    private List<String> strList;  
    private Map<String, String> strMap;   
  
    /** 
     * <p> 
     * 返回单个值 
     * <p> 
     *  
     * @return 
     */  
    public String returnMessage()  
    {  
        this.message = "成功返回单个值";  
        return "message";  
    }  
  
    /** 
     * <p> 
     * 返回UserInfo对象 
     * </p> 
     *  
     * @return 
     */  
    public String returnUser()  
    {  
        user = new User();  
        user.setUsername("张三");  
        user.setPassword("000000");  
        return "user";  
    }  
  
    /** 
     * <p> 
     * 返回List对象 
     * </p> 
     *  
     * @return 
     */  
    public String returnList()  
    {  
        userList = new ArrayList<User>();  
        User u1 = new User();  
        u1.setUserid("10001");  
        u1.setUsername("张三");  
        u1.setPassword("000000");  
        User u2 = new User();  
        u2.setUserid("10002");  
        u2.setUsername("李四");  
        u2.setPassword("111111");  
        User u3 = new User();  
        u3.setUserid("10003");  
        u3.setUsername("王五");  
        u3.setPassword("222222");  
        User u4 = new User();  
        u4.setUserid("10004");  
        u4.setUsername("赵六");  
        u4.setPassword("333333");  
        userList.add(u1);  
        userList.add(u2);  
        userList.add(u3);  
        userList.add(u4);  
        return "list";  
    }  
  
    /** 
     * <p> 
     * 返回Map对象 
     * </p> 
     *  
     * @return 
     */  
    public String returnMap()  
    {  
        userMap = new LinkedHashMap<String, User>();  
        User u1 = new User();  
        u1.setUserid("10000");  
        u1.setUsername("张三");  
        u1.setPassword("000000");  
        User u2 = new User();  
        u2.setUserid("10001");  
        u2.setUsername("李四");  
        u2.setPassword("111111");  
        User u3 = new User();  
        u3.setUserid("10002");  
        u3.setUsername("王五");  
        u3.setPassword("222222");  
        User u4 = new User();  
        u4.setUserid("10003");  
        u4.setUsername("赵六");  
        u4.setPassword("333333");  
        userMap.put(u1.getUserid() , u1);  
        userMap.put(u2.getUserid() , u2);  
        userMap.put(u3.getUserid() , u3);  
        userMap.put(u4.getUserid() , u4);  
        return "map";  
    }  
    public String returnStrList()  
    {  
        strList = new ArrayList<String>();  
        strList.add("张三");  
        strList.add("李四");  
        strList.add("王五");  
        strList.add("赵六");  
        return "strlist";  
    }  
    public String returnStrMap()  
    {  
        strMap = new LinkedHashMap<String,String>();  
        strMap.put("10000", "张三");  
        strMap.put("10001", "李四");  
        strMap.put("10002", "王五");  
        strMap.put("10003", "赵六");  
        return "strmap";  
    }  
  
    省略set、get方法  
}  

action代码看起来和之前所认知的action写法没多大区别,再还没有页面调用前我们依次访问下每一个action。
4.1 http://localhost:8080/jquery-struts2-json/index!returnMessage单个字符串
4.2 http://localhost:8080/jquery-struts2-json/index!returnUser       一个User对象
4.3 http://localhost:8080/jquery-struts2-json/index!returnList   list集合封装的对象







4.4 http://localhost:8080/jquery-struts2-json/index!returnMap      Map集合封装的User对象
4.5 http://localhost:8080/jquery-struts2-json/index!returnStrList      List集合封装的存放的String字符串
4.6 http://localhost:8080/jquery-struts2-json/index!returnStrMap     Map集合封装的存放的String字符串
 
看了上面的返回json结果发现是不是每一个key都对应着Action中的属性,如果没有值就为null,如果不想那些不显示的值显示出来是否可以呢,答案是可以的,只需要在struts.xml中的result中配置
<param name="excludeProperties">message,user,userMap,strList,strMap</param>
如果需要引入那些属性只需要同理配置<param name="includeProperties">message,user,userMap,strList,strMap</param>即可


5.页面中异步处理这些json数据
[html] view plaincopyprint?
<body>  
  <input id="getMessage"  class="btn"  type="button" value="获取单个值"/>  
  <input id="getUser" class="btn"   type="button" value="获取User对象"/>  
  <input id="getList"  class="btn"  type="button" value="获取List中的User对象"/>  
  <input id="getMap" class="btn"   type="button" value="获取Map中的User对象"/>  
  <input id="getStrList"  class="btn"  type="button" value="获取List中的String值"/>  
  <input id="getStrMap" class="btn"   type="button" value="获取Map中的String值"/>  
    
  <!-- 要显示信息的层 -->  
  <div id="message"></div>  
</body>  

获取单个值
[javascript] view plaincopyprint?
$(document).ready(function(){  
    //为获取单个值的按钮注册鼠标单击事件  
    $("#getMessage").click(function()  
    {  
        $.ajax({  
            url:"index!returnMessage.action",  
            type:"POST",  
            dataType:"json",  
            success:function(data)  
            {  
                //清空显示层中的数据  
                $("#message").empty();  
                //通过.操作符可以从data.message中获得Action中message的值  
                $("#message").append("<font color='red'>"+data.message+"</font>");  
            }  
        });  
    });   
});  



获取User对象
[javascript] view plaincopyprint?
$(document).ready(function(){  
    $("#getUser").click(function()  
    {  
        $.ajax({  
            url:"index!returnUser.action",  
            type:"POST",  
            dataType:"json",  
            success:function(data)  
            {  
                //清空显示层中的数据  
                $("#message").empty();  
                //为显示层添加获取到的数据  
                //获取对象的数据用data.userInfo.[属性]  
                $("#message").append("<div><font color='red'>用户名:"+data.user.username+"</font></div>")  
                                    .append("<div><font color='red'>密码:"+data.user.password+"</font></div>");  
            }  
        });  
    });  
});  

获取List中的User对象
[javascript] view plaincopyprint?
$(document).ready(function(){  
    //为获取List对象按钮添加鼠标单击事件  
    $("#getList").click(function()  
    {  
         $.ajax({  
            url:"index!returnList.action",  
            type:"POST",  
            dataType:"json",  
            success:function(data)  
            {  
                //清空显示层中的数据  
                $("#message").empty();  
                //使用jQuery中的each(data,function(){});函数  
                //从data.userInfosList获取UserInfo对象放入value之中  
                $.each(data.userList,function(i,value)  
                {  
                    $("#message").append("<div>第"+(i+1)+"个用户:</div>")  
                         .append("<div><font color='red'>用户ID:"+value.userid+"</font></div>")  
                            .append("<div><font color='red'>用户名:"+value.username+"</font></div>")  
                             .append("<div><font color='red'>密码:"+value.password+"</font></div>");  
                 });  
            }  
        });  
    });  
});  


获取Map中的User对象
[javascript] view plaincopyprint?
$(document).ready(function(){  
    //为获取Map对象按钮添加鼠标单击事件  
    $("#getMap").click(function()  
    {  
        $.ajax({  
            url:"index!returnMap.action",  
            type:"POST",  
            dataType:"json",  
            success:function(data)  
            {  
                //清空显示层中的数据  
                $("#message").empty();  
                //使用jQuery中的each(data,function(){});函数  
                //从data.userInfosMap获取Map对象放入value之中  
                //key值为Map的键值  
                $.each(data.userMap,function(key,value)  
                {  
                    $("#message").append("<div><font color='red'>用户ID:"+value.userid+"</font></div>")  
                                            .append("<div><font >用户名:"+value.username+"</font></div>")  
                                             .append("<div><font color='red'>密码:"+value.password+"</font></div>");  
                });  
            }  
        });  
     });  
});  


获取List中的String值
[javascript] view plaincopyprint?
$(document).ready(function(){  
    $("#getStrList").click(function()  
    {  
         $.ajax({  
            url:"index!returnStrList.action",  
            type:"POST",  
            dataType:"json",  
            success:function(data)  
            {  
                //清空显示层中的数据  
                $("#message").empty();  
                $.each(data.strList,function(i,value)  
                {  
                    $("#message").append("<div>第"+(i+1)+"个用户:</div>")  
                         .append("<div><font color='red'>用户名字:"+value+"</font></div>");  
                 });  
            }  
        });  
    });  
});  

获取Map中的String值
[javascript] view plaincopyprint?
$(document).ready(function(){  
     $("#getStrMap").click(function()  
    {  
        $.ajax({  
            url:"index!returnStrMap.action",  
            type:"POST",  
            dataType:"json",  
            success:function(data)  
            {  
                //清空显示层中的数据  
                $("#message").empty();  
                $.each(data.strMap,function(key,value)  
                {  
                    $("#message").append("<div><font >用户ID:"+key+"</font></div>")  
                                            .append("<div><font color='red'>用户名:"+value+"</font></div>");  
                });  
            }  
        });  
     });  
});  


写评论

相关文章

上一篇:PHP 超强过滤函数

下一篇:jQuery源码 框架分析

评论

写评论

* 必填.

分享

栏目

赞助商


热门文章

Tag 云