配置注意点:

  • 在原有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插件的使用相关推荐

  1. 【Uniapp 原生插件】商米内置打印机插件

    文章目录 商米内置打印机插件 插件需求 插件介绍 使用案例 获取插件 连接服务 断开服务 测试打印 接口列表 商米内置打印机插件 插件地址:https://ext.dcloud.net.cn/plug ...

  2. HBuilder X内置浏览器插件安装失败解决方案

    我是最近下载的HBuilder X,今天要去用的时候,想去下载一下插件,发现其他插件都能下载安装成功,而内置浏览器插件却总是安装失败.注意,提示的是安装失败哦,于是我便去百度寻求帮助. 关闭360,火 ...

  3. python中json模块_Python使用内置json模块解析json格式数据的方法

    本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...

  4. python内置json模块的作用_json和simplejson Python模块之间有什么区别?

    我不同意其他答案:内置json库(在Python 2.7中)不一定比它慢simplejson.它也没有这个讨厌的unicode bug. 这是一个简单的基准:import jsonimport sim ...

  5. c# 对象json互相转换_Go语言进阶之路(六):内置JSON库和开源库gjson

    Go语言内置了部分JSON函数,可以方便地在Go语言结构体实例和JSON字符串之间互相转换.这可比Java强多了. 不过Go语言内置的json库功能比较鸡肋,只能在结构体和JSON之间相互转换,没办法 ...

  6. AWS EMR内置Ranger插件使用的IAM Role及其设计策略

    AWS EMR提供三种内置的Ranger插件,分别是:S3(EMRFS),Spark,Hive,如果要启用这些插件,需要创建三个特定的IAM Role,以便相关组件能获得适当的权限.对这三种Role的 ...

  7. 版权原因,QQ不再内置flash插件,需安装二个插件

    QQ不再内置flash插件 需安装二个插件

  8. Idea中内置Translation插件报“翻译错误”,解决方式!!!

    问题 我的编程软件一直是Idea,Idea是我心中YYDS. 使用的版本是2020.4,最近在使用idea内置的Translation翻译插件的时候,一直报翻译失败的错误.一开始以为是我的网络问题,从 ...

  9. VS code内置浏览器插件-Preview on Web Server

    VS code内置浏览器需要自己下载安装,下面我们就来看看下载安装使用VS code内置浏览器的图文教程. 软件名称: Visual Studio Code(代码编辑器) v1.51.1 64位 中文 ...

最新文章

  1. 有空间感的图片环形滚动代码
  2. web页面实现地图展示,可缩放,标点并点击---使用高德地图
  3. Leetcode 47. 全排列 II (每日一题 20211015)
  4. Caffe学习系列(21):caffe图形化操作工具digits的安装与运行
  5. abp core版本添加额外应用层
  6. Qt鼠标拖动绘制基本几何图形
  7. java 发送邮件昵称_javaMail发送邮件设置发件人中文昵称
  8. java 锁_Java之线程并发的各种锁、锁、锁
  9. 2018年海南计算机职称考试,海南省2018年全国计算机等级考试报名时间
  10. html5播放flv
  11. c语言教程入门ppt,C语言基础入门教程.ppt
  12. IP代理软件哪个比较好
  13. kdj指标计算程序代码
  14. oracle恢复误删除数据/数据回滚
  15. 浅谈css样式及选择器
  16. python运势预测程序_运势.py · Scar/Python-Spider - Gitee.com
  17. 背景的渐变/vatical的专题解析/cs元素的显示与隐藏-学习笔记
  18. 纳秒级分布式无锁限流插件 Current-Limiting
  19. mysql 的一个错误 Error Code: 2013. Lost connection to MySQL server during...
  20. vux安装时报vux-loader配置问题

热门文章

  1. 一步将 p12转为pem
  2. 深圳华强电子交易网络有限公司3.15大会再获大奖
  3. centos 7 学习笔记(一)
  4. 手游研发CJ抱大腿指南
  5. 【补截图】如何获得列标?
  6. insmod 和modprobe的区别
  7. Java 7在整数中出现的次数
  8. altium designer2020中文版
  9. 【laravel】laravel的基础学习笔记
  10. 51Nod 1294 修改数组 —— LIS