关于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实现异步交互,返回一个字符串

1、index.jsp

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

 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

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

Struts2的Json插件,默认将值栈(root)的顶端对象返回(所有getter方法),在没有实现模型驱动类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>

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

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

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

这样,我们想要的数据就可以筛选出来了。

关于Strut2内置Json插件的使用

时间: 2024-10-09 13:03:12

关于Strut2内置Json插件的使用的相关文章

解决IE8 内置JSON.stringify,中文变unicode的问题

转自:http://my.oschina.net/u/919074/blog/191131 项目中出现在IE下出现把json对象转为json串中文变成unicode的问题,最后经过排查,发现是IE8内置JSON.stringify()引起的,解决方法如下: // 把json对象转为json串 var policy_content = JSON.stringify(data.jsonObject); policy_content={policy":[{"name":"

Sql Server 2016中增加了对JSON的内置支持

原文地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/built-in-json-support-in-sql-server-2016/ 在数据库层对JSON提供支持,是请求排名最靠前的特性之一,在Microsoft Connect网站上对他的投票量超过了1000.微软承诺,在Sql Server 2016版本中,会提供内置的JSON支持.注意这并不是Sql Server 2005已有特性XML原生支持的翻版.微软的目标是创

python笔记5:装饰器、内置函数、json

装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1) print('run....') 现有一个新的需求,希望可以记录下函数的运行时间,需要在代码中计算时间的代码: def run(): start_time = time.time() time.sleep(1) print('run....') end_time = time.time() pr

Eclipse spket插件 内置js文件

这一篇将怎么在spket内置js文件,而不用用户自己去添加. 1. 在开发的Eclipse的 运行配置将下面几个插件勾选上. 2. 在org.eclipse.ui.startup拓展里执行(只需执行一次): JSPlugin.getDefault().getPreferenceStore().setValue("js.profile", "BingoTouch"); PS:记得引入com.spket.js的包 3. 生成profiles.xml 这个profiles

Maven-06: 插件的内置绑定

Maven的生命周期与插件相互绑定,用以完成实际的构建任务.具体而言,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务.例如项目编译这一任务,它对应default生命周期的compile这一阶段,而maven-compiler-plugin这一插件的compile目标能够完成该任务.因此将他们绑定,就能实现项目编译的目的. 为了能让用户几乎不用任何配置就能构建Maven项目,Maven在核心为一些主要的生命周期阶段绑定了很多插件的目标,当用户通过命令行调用生命周期阶段的时候,对应的

javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象

对象字面量  JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay":value 对象字面2??定义方法和json很像,只有一点不同,json的key 必须加"" : 对象,数组也可以作为键值 JSON的组成 Javascript Object Notation 对象字面量的一种表现形式 : 键名必须有双引号""包围 : 为什么用J

Fedora25安装Flash插件和Opera浏览器——此浏览器据说内置VPN

Opera浏览器,是一款适用于各种平台.操作系统和嵌入式网络产品的高品质.多平台产品.采用Opera Turbo功能极大的改善受限连接上的浏览器速度,例如wifi,手机联网等:新引擎 Opera Presto在渲染内容复杂页面时速度更快,提速40%:全新的可视化标签,根据个人需求自定义自己的快速拨号.据说,内置VPN. 需要先配置FZUG源:这是一个专门为Fedora中文用户建立的源,很好用.包含很多常用软件,非常推荐安装. 注意事项 一些软件依赖 RPM Fusion 源,请事先自行添加.Fe

五、python函数、装饰器、内置函数、json及模块

一.递归调用 1.一个函数自己调用自己就是递归调用,最多一个函数递归调用自己999次,超过就会出错2.递归必须有一个明确的结束条件3.每次进入更深一层递归时,问题规模相比上次递归都应有所减少4.递归效率不高,少用递归 eg:def test1(): num = int(input('please enter a number:')) if num%2==0:#判断输入的数字是不是偶数 return True #如果是偶数的话,程序就退出了,返回true print('不是偶数请重新输入!') r

第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON

关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的是f1的return,那么在这种情况下函数f1并未定义return,所以默认返回None 因此li的值应该是none 如果是 li = [11,22,33,44] def f1(arg): arg.append(55) f1(li) print(li) 因为函数传递的参数实际是参数的引用,因此在函数