关于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 ="success" type="json"></result>

 

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

1、index.jsp

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

 1 <%@ page language="java importjava.util.* pageEncodingutf-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         ="text/javascript" 7             $(document).ready(function(){
 8                 $.post(test1.action,{name:Balla_兔子},(data){
 9                     console.info(data);
10                     $(#info).html(data.info);
11                 });
12             
13             });
14         15     16 
17     body18         Hello,Struts2!div id="info"div19     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 
import com.opensymphony.xwork2.ActionSupport;
 4 
 5 public class TestAction extends ActionSupport {
 6 
 7     private String name;    
 8      String info;
 9     
10      String getInfo() {
11         return "我是:"+name;
12     }
13 
14     void setName(String name) {
15         this.name = name;
16 17 
18      String test1() {
19         return "success";
20 
21 22 }

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
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 ="struts.i18n.encoding" value="UTF-8"/>
 8         ="struts.devMode"="true"  9         ="strutsjson"="json-default" namespace="/"10             action ="test1" class="com.lcw.struts.json.TestAction"11                 >/index.jsp12             action13         14 >

 

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

二、下面来说下关于更为实用的实例,比如如何返回一个List集合,对象等复杂数据,在前台接受数据中,只能识别字符类型的信息,比如Xml,Json,Html字符等,是无法识别List集合的,那我们应该怎么做呢?

TestAction.java

这次在Action加入了模型驱动类,然后定义了一个User类并提供了setter和getter方法,把该对象添加到一个List集合里去,并提供getter方法以便返回数据。

 java.util.ArrayList;
 4  java.util.List;
 7  com.opensymphony.xwork2.ModelDriven;
 8 
 9 extends ActionSupport implements ModelDriven<User> {
10 
11     private User user = new User();
12 
13      User getModel() {
return user;
15 private List<User> list;
18 
public List<User> getList() {
20         22 
23      String test1(){
24         list = new ArrayList<User>();
25         User user = 26         list.add(new User("1","张三"));
27         list.add(new User("2","李四"28         29 30 
31 }

User.java

 com.lcw.struts.json;

class User {

     String id;
     String name;

     User() {
    }

     User(String id,String name) {
        super();
        this.id = id;
         name;
    }

     String getId() {
         id;
    }

     setId(String id) {
         String getName() {
         setName(String name) {
         name;
    }

}

保持配置文件不变,我们来看页面看看结果:

打开firebug调试查看,会发现

 为何传递过来的数据会为空呢?不知道大家是否留意上文提到的一句话

Struts2的Json插件,默认将值栈(root)的顶端对象返回(所有getter方法),在没有实现模型驱动类ModelDriven的前提下,值栈的顶端对象为Action(也就是返回Action里所有的getter方法

我们上面实现了模型驱动类,也就意味着值栈的栈顶对象此时也不再是Action了,而是Model,所以返回的数据为空。那要怎么办呢?其实很简单,只需要我们改变默认返回的战队对象就可以了,把它设置成Action。

DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

>    
        />
        >
            ="test"="com.lcw.struts.json.TestAction" method="test1">
                >
                    param ="root">actionparam>
        >

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

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

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

1 ="includeproperties">list\[\d+\]\.name>

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

下面是完整配置文件:

struts.xml

12                     13                                             list\[\d+\]\.name
15                     16                 17             18         19 >

 

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

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

 

相关文章

开发过程中是不可避免地会出现各种异常情况的,例如网络连接...
说明:使用注解方式实现AOP切面。 什么是AOP? 面向切面编程...
Spring MVC中的拦截器是一种可以在请求处理过程中对请求进行...
在 JavaWeb 中,共享域指的是在 Servlet 中存储数据,以便在...
文件上传 说明: 使用maven构建web工程。 使用Thymeleaf技术...
创建初始化类,替换web.xml 在Servlet3.0环境中,Web容器(To...