博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Strut2内置Json插件的使用
阅读量:5983 次
发布时间:2019-06-20

本文共 4240 字,大约阅读时间需要 14 分钟。

配置注意点:

  • 在原有Struts2框架jar包的引入下,需要额外多加一个Json的插件包(struts2-json-plugin-2.3.7.jar
  • 在struts.xml配置文件中,包需要继承json-default,然后把result的类型改为json

 

一、先来个简单示例,利用Struts2+jQuery+JSON实现异步交互,返回一个字符串

1、index.jsp

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

1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2  3  4      5          6         15     16 17     18         Hello,Struts2!
19 20

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 
2 5 6
7
8
9
10
11
/index.jsp
12
13
14

 

下面是页面效果:(这里只是简单举例,也可以实现一些业务逻辑功能,比如验证用户的账号,可以在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
{10 11 private User user = new User();12 13 public User getModel() {14 return user;15 }16 17 private List
list;18 19 public List
getList() {20 return list;21 }22 23 public String test1(){24 list = new ArrayList
();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。

action

只要在result里添加一个参数root并设置成action就可以了,我们来看下此时的效果:

这是我们就可以利用(data.list[x].name等)取出其中的数据了。

那我们可不可以不要一起把所有的数据都返回回来,只返回部分数据呢?除了之前说的那个Json注解(只要@JSON注解,属性将永远不能参与 json返回),其实Struts2为我们也提供一个更灵活的方法,在struts.xml的配置文件里,我们也是可以根据所需设置的,例如:

1 list\[\d+\]\.name

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

下面是完整配置文件:

struts.xml

1 
2 5 6
7
8
9
10
11
12
action13
14 list\[\d+\]\.name15 16
17
18
19

 

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

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

 

转载地址:http://doeox.baihongyu.com/

你可能感兴趣的文章
Red Hat Enterprise Linux(RHEL)中yum的repo文件详解
查看>>
利用Office宏及Powershell的针对性攻击样本分析
查看>>
golang中 net/http 网络连接与协程
查看>>
浅谈Service Mesh体系中的Envoy
查看>>
证书问题“Command /usr/bin/codesign failed with exit code 1”编译不通过的解决方法
查看>>
跨域资源共享--CORS
查看>>
vue版stickTop效果
查看>>
Re:从零开始的机器学习 - Titanic: Machine Learning from Disaster
查看>>
Java集合源码分析之基础(五):平衡二叉树(AVL Tree)
查看>>
进击webpack4 (基础篇三:配置 二)
查看>>
直播、短视频平台如何选择合适的CDN?
查看>>
Python为何如此优秀?斯坦福教授告诉你!
查看>>
Jenkins in Action :GitLab 部署 Maven 项目
查看>>
一块GPU就能训练语义分割网络,百度PaddlePaddle是如何优化的?
查看>>
SSH 免密登录
查看>>
微服务实战:从架构到发布(一)
查看>>
Linux命令
查看>>
Win 7 下 C++ 编译环境 MSYS2 MinGW 64-bit + Visual Studio Code
查看>>
Nginx 通过 Lua + Redis 实现动态封禁 IP
查看>>
第十七天-企业应用架构模式-会话状态模式
查看>>