• 【转】Struts2中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实现异步交互,返回一个字符串

    1、index.jsp

    很简单的一个页面,利用Ajax异步向test1.action发送一个post请求,传递了一个参数name,然后把回调函数返回的值显示在页面。

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

    2、TestAction.java

    因为页面发送了一个参数名为name的参数,在这边我们用属性注入的方式,给成员变量一个setter方法赋值,返回提供了一个getter方法作为回调函数的返回值。

    Struts2的Json插件,默认将值栈(root)的顶端对象返回(所有getter方法),在没有实现模型驱动类ModelDriven的前提下,值栈的顶端对象为Action(也就是返回Action里所有的getter方法,若有各别方法不想返回,只需要在该方法的上面添加一个@JSON(serialize=false)注解即可)

    如:

    @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调用持久层的数据查询,返回布尔值,在回调函数里进行进一步操作)

    二、下面来说下关于更为实用的实例,比如如何返回一个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

  • 相关阅读:
    2015531 网络攻防 Exp1 PC平台逆向破解(5)M
    2017-2018-1 20155331 嵌入式C语言
    20155330 《网络对抗》 Exp9 web安全基础实践
    20155330 《网络对抗》 Exp8 Web基础
    20155330 《网络对抗》 Exp7 网络欺诈防范
    20155330 《网络对抗》 Exp6 信息搜集与漏洞扫描
    20155330 《网络对抗》 Exp5 MSF基础应用
    20155330 《网络攻防》 Exp4 恶意代码分析
    20155330 《网络攻防》 Exp3 免杀原理与实践
    20155330 《网络对抗》 Exp2 后门原理与实践
  • 原文地址:https://www.cnblogs.com/fengmingyue/p/6160216.html
Copyright © 2020-2023  润新知