关于Strut2内置Json插件的使用
配置注意點:
- 在原有Struts2框架jar包的引入下,需要額外多加一個Json的插件包(struts2-json-plugin-2.3.7.jar)
- 在struts.xml配置文件中,包需要繼承json-default,然后把result的類型改為json
- <package name="xxx" extends="json-default"> <result name="success" type="json"></result>
?
一、先來個簡單示例,利用Struts2+jQuery+JSON實現(xiàn)異步交互,返回一個字符串
1、index.jsp
很簡單的一個頁面,利用Ajax異步向test1.action發(fā)送一個post請求,傳遞了一個參數(shù)name,然后把回調(diào)函數(shù)返回的值顯示在頁面。
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <html> 4 <head> 5 <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.4.min.js"></script> 6 <script type="text/javascript"> 7 $("document").ready(function(){ 8 $.post("test1.action",{"name":"Balla_兔子"},function(data){ 9 console.info(data); 10 $("#info").html(data.info); 11 }); 12 13 }); 14 </script> 15 </head> 16 17 <body> 18 Hello,Struts2!<div id="info"></div> 19 </body> 20 </html>2、TestAction.java
因為頁面發(fā)送了一個參數(shù)名為name的參數(shù),在這邊我們用屬性注入的方式,給成員變量一個setter方法賦值,返回提供了一個getter方法作為回調(diào)函數(shù)的返回值。
Struts2的Json插件,默認將值棧(root)的頂端對象返回(所有getter方法),在沒有實現(xiàn)模型驅(qū)動類ModelDriven的前提下,值棧的頂端對象為Action(也就是返回Action里所有的getter方法,若有各別方法不想返回,只需要在該方法的上面添加一個@JSON(serialize=false)注解即可)
如:
@JSON(serialize=false) public String getAge() {return "我今年10歲了"; }?
1 package com.lcw.struts.json; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 public class TestAction extends ActionSupport { 6 7 private String name; 8 private String info; 9 10 public String getInfo() { 11 return "我是:"+name; 12 } 13 14 public void setName(String name) { 15 this.name = name; 16 } 17 18 public String test1() { 19 return "success"; 20 21 } 22 }struts.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <constant name="struts.i18n.encoding" value="UTF-8"/> 8 <constant name="struts.devMode" value="true" /> 9 <package name="strutsjson" extends="json-default" namespace="/"> 10 <action name="test1" class="com.lcw.struts.json.TestAction"> 11 <result name="success" type="json">/index.jsp</result> 12 </action> 13 </package> 14 </struts>?
下面是頁面效果:(這里只是簡單舉例,也可以實現(xiàn)一些業(yè)務邏輯功能,比如驗證用戶的賬號,可以在Action調(diào)用持久層的數(shù)據(jù)查詢,返回布爾值,在回調(diào)函數(shù)里進行進一步操作)
二、下面來說下關于更為實用的實例,比如如何返回一個List集合,對象等復雜數(shù)據(jù),在前臺接受數(shù)據(jù)中,只能識別字符類型的信息,比如Xml,Json,Html字符等,是無法識別List集合的,那我們應該怎么做呢?
TestAction.java
這次在Action加入了模型驅(qū)動類,然后定義了一個User類并提供了setter和getter方法,把該對象添加到一個List集合里去,并提供getter方法以便返回數(shù)據(jù)。
1 package com.lcw.struts.json; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.opensymphony.xwork2.ActionSupport; 7 import com.opensymphony.xwork2.ModelDriven; 8 9 public class TestAction extends ActionSupport implements ModelDriven<User> { 10 11 private User user = new User(); 12 13 public User getModel() { 14 return user; 15 } 16 17 private List<User> list; 18 19 public List<User> getList() { 20 return list; 21 } 22 23 public String test1(){ 24 list = new ArrayList<User>(); 25 User user = new User(); 26 list.add(new User("1", "張三")); 27 list.add(new User("2", "李四")); 28 return "success"; 29 } 30 31 }User.java
package com.lcw.struts.json;public class User {private String id;private String name;public User() {}public User(String id, String name) {super();this.id = id;this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}保持配置文件不變,我們來看頁面看看結(jié)果:
打開firebug調(diào)試查看,會發(fā)現(xiàn)
?為何傳遞過來的數(shù)據(jù)會為空呢?不知道大家是否留意上文提到的一句話
Struts2的Json插件,默認將值棧(root)的頂端對象返回(所有getter方法),在沒有實現(xiàn)模型驅(qū)動類ModelDriven的前提下,值棧的頂端對象為Action(也就是返回Action里所有的getter方法)
我們上面實現(xiàn)了模型驅(qū)動類,也就意味著值棧的棧頂對象此時也不再是Action了,而是Model,所以返回的數(shù)據(jù)為空。那要怎么辦呢?其實很簡單,只需要我們改變默認返回的戰(zhàn)隊對象就可以了,把它設置成Action。
<?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.i18n.encoding" value="UTF-8"/><constant name="struts.devMode" value="true" /><package name="strutsjson" extends="json-default" namespace="/"><action name="test" class="com.lcw.struts.json.TestAction" method="test1"><result name="success" type="json"><param name="root">action</param></result></action></package> </struts>只要在result里添加一個參數(shù)root并設置成action就可以了,我們來看下此時的效果:
這是我們就可以利用(data.list[x].name等)取出其中的數(shù)據(jù)了。
那我們可不可以不要一起把所有的數(shù)據(jù)都返回回來,只返回部分數(shù)據(jù)呢?除了之前說的那個Json注解(只要@JSON注解,屬性將永遠不能參與 json返回),其實Struts2為我們也提供一個更靈活的方法,在struts.xml的配置文件里,我們也是可以根據(jù)所需設置的,例如:
1 <param name="includeproperties">list\[\d+\]\.name</param>includeProperties代表要包含的參數(shù),值為正則表達式,因為返回的數(shù)據(jù)是一個list集合,名為list則 list[\d+].name(代表list下所有數(shù)組索引下的name屬性) 上文的反斜杠是轉(zhuǎn)義符號。(如果要返回模型驅(qū)動對象則是model[\d+])
下面是完整配置文件:
struts.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <constant name="struts.i18n.encoding" value="UTF-8"/> 8 <constant name="struts.devMode" value="true" /> 9 <package name="strutsjson" extends="json-default" namespace="/"> 10 <action name="test" class="com.lcw.struts.json.TestAction" method="test1"> 11 <result name="success" type="json"> 12 <param name="root">action</param> 13 <param name="includeproperties"> 14 list\[\d+\]\.name 15 </param> 16 </result> 17 </action> 18 </package> 19 </struts>?
再看下此時的頁面數(shù)據(jù)返回:
這樣,我們想要的數(shù)據(jù)就可以篩選出來了。
?
總結(jié)
以上是生活随笔為你收集整理的关于Strut2内置Json插件的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: outlook自定义邮件提示声音以及设置
- 下一篇: 创建与删除索引