【转】Struts2中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

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.4.min.js"></script>
        <script type="text/javascript">
            $("document").ready(function(){
                $.post("test1.action",{"name":"Balla_兔子"},function(data){
                    console.info(data);
                    $("#info").html(data.info);
                });
            
            });
        </script>
    </head>

    <body>
        Hello,Struts2!<div id="info"></div>
    </body>
</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岁了";
} 
package com.lcw.struts.json;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
    private String name;    
    private String info;
    public String getInfo() {
        return "我是:"+name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String test1() {
        return "success";
    }
}

struts.xml框架

<?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="test1" class="com.lcw.struts.json.TestAction">
                <result name="success" type="json">/index.jsp</result>
            </action>
        </package>
</struts>

下面是页面效果:(这里只是简单举例,也能够实现一些业务逻辑功能,好比验证用户的帐号,能够在Action调用持久层的数据查询,返回布尔值,在回调函数里进行进一步操做)异步

2、下面来讲下关于更为实用的实例,好比如何返回一个List集合,对象等复杂数据,在前台接受数据中,只能识别字符类型的信息,好比Xml,Json,Html字符等,是没法识别List集合的,那咱们应该怎么作呢?

TestAction.java

此次在Action加入了模型驱动类,而后定义了一个User类并提供了setter和getter方法,把该对象添加到一个List集合里去,并提供getter方法以便返回数据。

package com.lcw.struts.json;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class TestAction extends ActionSupport implements ModelDriven<User> {
    private User user = new User();
    public User getModel() {
        return user;
    }
    private List<User> list;
    public List<User> getList() {
        return list;
    }
    public String test1(){
        list = new ArrayList<User>();
        User user = new User();
        list.add(new User("1", "张三"));
        list.add(new User("2", "李四"));
        return "success";
    }
}

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的配置文件里,咱们也是能够根据所需设置的,例如:

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

includeProperties表明要包含的参数,值为正则表达式,由于返回的数据是一个list集合,名为list则 list[\d+].name(表明list下全部数组索引下的name属性) 上文的反斜杠是转义符号。(若是要返回模型驱动对象则是model[\d+])

下面是完整配置文件:

struts.xml

<?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>
                    <param name="includeproperties">
                        list\[\d+\]\.name
                    </param>
                </result>
            </action>
        </package>
</struts>

再看下此时的页面数据返回:

这样,咱们想要的数据就能够筛选出来了。

原连接:http://www.cnblogs.com/lichenwei/p/3925588.html

相关文章
相关标签/搜索