關於Strut2內置Json插件的使用

配置注意點:javascript

  • 在原有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>

 

1、先來個簡單示例,利用Struts2+jQuery+JSON實現異步交互,返回一個字符串html

一、index.jspjava

很簡單的一個頁面,利用Ajax異步向test1.action發送一個post請求,傳遞了一個參數name,而後把回調函數返回的值顯示在頁面。jquery

 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>

二、TestAction.java正則表達式

由於頁面發送了一個參數名爲name的參數,在這邊咱們用屬性注入的方式,給成員變量一個setter方法賦值,返回提供了一個getter方法做爲回調函數的返回值。apache

Struts2的Json插件,默認將值棧(root)的頂端對象返回(全部getter方法),在沒有實現模型驅動類ModelDriven的前提下,值棧的頂端對象爲Action(也就是返回Action裏全部的getter方法,如有各別方法不想返回,只須要在該方法的上面添加一個@JSON(serialize=false)註解便可)json

如:數組

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

 

下面是頁面效果:(這裏只是簡單舉例,也能夠實現一些業務邏輯功能,好比驗證用戶的帳號,能夠在Action調用持久層的數據查詢,返回布爾值,在回調函數裏進行進一步操做)異步

2、下面來講下關於更爲實用的實例,好比如何返回一個List集合,對象等複雜數據,在前臺接受數據中,只能識別字符類型的信息,好比Xml,Json,Html字符等,是沒法識別List集合的,那咱們應該怎麼作呢?

TestAction.java

此次在Action加入了模型驅動類,而後定義了一個User類並提供了setter和getter方法,把該對象添加到一個List集合裏去,並提供getter方法以便返回數據。

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

}

保持配置文件不變,咱們來看頁面看看結果:

打開firebug調試查看,會發現

 爲什麼傳遞過來的數據會爲空呢?不知道你們是否留意上文提到的一句話

Struts2的Json插件,默認將值棧(root)的頂端對象返回(全部getter方法),在沒有實現模型驅動類ModelDriven的前提下,值棧的頂端對象爲Action(也就是返回Action裏全部的getter方法

咱們上面實現了模型驅動類,也就意味着值棧的棧頂對象此時也再也不是Action了,而是Model,因此返回的數據爲空。那要怎麼辦呢?其實很簡單,只須要咱們改變默認返回的戰隊對象就能夠了,把它設置成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裏添加一個參數root並設置成action就能夠了,咱們來看下此時的效果:

這是咱們就能夠利用(data.list[x].name等)取出其中的數據了。

那咱們可不能夠不要一塊兒把全部的數據都返回回來,只返回部分數據呢?除了以前說的那個Json註解(只要@JSON註解,屬性將永遠不能參與 json返回),其實Struts2爲咱們也提供一個更靈活的方法,在struts.xml的配置文件裏,咱們也是能夠根據所需設置的,例如:

1 <param name="includeproperties">list\[\d+\]\.name</param>

includeProperties表明要包含的參數,值爲正則表達式,由於返回的數據是一個list集合,名爲list則 list[\d+].name(表明list下全部數組索引下的name屬性) 上文的反斜槓是轉義符號。(若是要返回模型驅動對象則是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>

 

再看下此時的頁面數據返回:

這樣,咱們想要的數據就能夠篩選出來了。

相關文章
相關標籤/搜索