• 关于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>

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

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

  • 相关阅读:
    c#异步执行方法
    sql 增加、修改、删除触发器小例子
    c#解决高并发加锁(Lock)
    sql中写事物和c#中执行事物
    socket 服务器浏览器与服务器客户端实例
    c# 写txt
    vs2003 序列化json
    一个完整的Windows 服务从创建到安装卸载
    js封装长度验证
    jquery 右下角弹出框
  • 原文地址:https://www.cnblogs.com/lichenwei/p/3925588.html
Copyright © 2020-2023  润新知