Struts2+jQuery+JSON實現非同步互動

來源:互聯網
上載者:User

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配置

<?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配置

<?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檔案,它在定義中

<?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代碼

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資料

  <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>


擷取單個值

$(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對象

$(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對象

$(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對象

$(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值

$(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值

$(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>");});}}); });});



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.