关于Strut2内置Json插件的使用
配置注意点:
? 一、先来个简单示例,利用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 > ? 再看下此时的页面数据返回: 这样,我们想要的数据就可以筛选出来了。 ? (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |