关于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,然后把回调函数返回的值显示在页面。
<%@ 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>
再看下此时的页面数据返回:
这样,我们想要的数据就可以筛选出来了。
关于Strut2内置Json插件的使用的更多相关文章
- 解决IE8 内置JSON.stringify,中文变unicode的问题
转自:http://my.oschina.net/u/919074/blog/191131 项目中出现在IE下出现把json对象转为json串中文变成unicode的问题,最后经过排查,发现是IE8内 ...
- 内置json&pickle&shelve&xml
序列化:把对象(变量)从内存中变成可存储可传输的过程称之为序列化,Python中叫做pickling,其他语言中也被称之为serialization,marshalling,flattening等等 ...
- 对象&内置对象& 对象构造 &JSON&__proto__和prototype
原型是一个对象,其他对象可以通过它实现属性继承 原型链:每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__pro ...
- Eclipse spket插件 内置js文件
这一篇将怎么在spket内置js文件,而不用用户自己去添加. 1. 在开发的Eclipse的 运行配置将下面几个插件勾选上. 2. 在org.eclipse.ui.startup拓展里执 ...
- 如何利用.Net内置类,解析未知复杂Json对象
如何利用.Net内置类,解析未知复杂Json对象 如果你乐意,当然可以使用强大的第三方类库Json.Net中的JObject类解析复杂Json字串 . 我不太希望引入第三方类库,所以在.Net内置类J ...
- 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON
关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...
- 使用动态内置的JSON 数据源
自从ActiveReports 11发布以来,一个重磅功能推出,为Web开发人员又带来一大福利.JSON数据常常会通过WebService来动态生成JSON数据,因此动态链接JSON 数据内置参数会更 ...
- javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象
对象字面量 JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay&quo ...
- Maven-06: 插件的内置绑定
Maven的生命周期与插件相互绑定,用以完成实际的构建任务.具体而言,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务.例如项目编译这一任务,它对应default生命周期的compile ...
随机推荐
- matlab 更改横坐标坐标值的方向
[转载]http://blog.sina.com.cn/s/blog_7270407901012dyd.html#post 非常有用的Matlab代码,收藏了. function th=rotat ...
- C# 我理解的接口、抽象类、以及事件
一.摘要 面试中无数次被问及到什么是接口,什么是抽象类,接口和抽象类有什么区别?什么是委托,什么是事件. 请写出猫叫了,老鼠跑了的例子..... 这些东西对于一些初学者来说可能还真的有点搞不懂,对于一 ...
- unity3d 参考坐标系
原地址:http://www.cnblogs.com/88999660/archive/2013/04/01/2993844.html 参考坐标系(Reference Coordinate Syste ...
- [Educational Codeforces Round 16]B. Optimal Point on a Line
[Educational Codeforces Round 16]B. Optimal Point on a Line 试题描述 You are given n points on a line wi ...
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...
- KMP算法心得
今天又看了一遍KMP,感觉真的懂了...就来这儿发一下心得吧. KMP算法其实就是暴力的改进版.让我们看看暴力的匹配. Original string: ababababcbbababababc Pa ...
- C/C++语法知识:typedef struct 用法详解
第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定 ...
- jekyll中文乱码问题
一般编写都是采用utf-8的吧,但是在windows下安装的jekyll,默认是以GBK编码的方式去读取咱们编写的文件,如此便乱码了. 要解决此问题,总不至于要写GBK编码的文件吧,毕竟这个编码不怎么 ...
- Android 中的selector
今天做程序时,发现了selector 选择器不单单能用系统的自定义属性(比如, <item android:state_selected="true" android:co ...
- sqlcmd
使用sqlcmd可以在批处理脚本中执行SQL.虽然这个命令的参数很多,但幸运的是,我们不需要全部理解,在这里简要介绍以下几个: { -U login_id [ -P password ] } | –E ...