配置注意点:javascript
<package name="xxx" extends="json-default">
<result name="success" type="json"></result>
1、先来个简单示例,利用Struts2+jQuery+JSON实现异步交互,返回一个字符串html
一、index.jspjava
很简单的一个页面,利用Ajax异步向test1.action发送一个post请求,传递了一个参数name,而后把回调函数返回的值显示在页面。jquery
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.4.min.js"></script> <script type="text/javascript"> $("document").ready(function(){ $.post("test1.action",{"name":"Balla_兔子"},function(data){ console.info(data); $("#info").html(data.info); }); }); </script> </head> <body> Hello,Struts2!<div id="info"></div> </body> </html>
二、TestAction.java正则表达式
由于页面发送了一个参数名为name的参数,在这边咱们用属性注入的方式,给成员变量一个setter方法赋值,返回提供了一个getter方法做为回调函数的返回值。apache
Struts2的Json插件,默认将值栈(root)的顶端对象返回(全部getter方法),在没有实现模型驱动类ModelDriven的前提下,值栈的顶端对象为Action(也就是返回Action里全部的getter方法,如有各别方法不想返回,只须要在该方法的上面添加一个@JSON(serialize=false)注解便可)json
如:数组
@JSON(serialize=false) public String getAge() { return "我今年10岁了"; }
package com.lcw.struts.json; import com.opensymphony.xwork2.ActionSupport; public class TestAction extends ActionSupport { private String name; private String info; public String getInfo() { return "我是:"+name; } public void setName(String name) { this.name = name; } public String test1() { return "success"; } }
struts.xml框架
<?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="test1" class="com.lcw.struts.json.TestAction"> <result name="success" type="json">/index.jsp</result> </action> </package> </struts>
下面是页面效果:(这里只是简单举例,也能够实现一些业务逻辑功能,好比验证用户的帐号,能够在Action调用持久层的数据查询,返回布尔值,在回调函数里进行进一步操做)异步
2、下面来讲下关于更为实用的实例,好比如何返回一个List集合,对象等复杂数据,在前台接受数据中,只能识别字符类型的信息,好比Xml,Json,Html字符等,是没法识别List集合的,那咱们应该怎么作呢?
TestAction.java
此次在Action加入了模型驱动类,而后定义了一个User类并提供了setter和getter方法,把该对象添加到一个List集合里去,并提供getter方法以便返回数据。
package com.lcw.struts.json; import java.util.ArrayList; import java.util.List; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; public class TestAction extends ActionSupport implements ModelDriven<User> { private User user = new User(); public User getModel() { return user; } private List<User> list; public List<User> getList() { return list; } public String test1(){ list = new ArrayList<User>(); User user = new User(); list.add(new User("1", "张三")); list.add(new User("2", "李四")); return "success"; } }
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的配置文件里,咱们也是能够根据所需设置的,例如:
<param name="includeproperties">list\[\d+\]\.name</param>
includeProperties表明要包含的参数,值为正则表达式,由于返回的数据是一个list集合,名为list则 list[\d+].name(表明list下全部数组索引下的name属性) 上文的反斜杠是转义符号。(若是要返回模型驱动对象则是model[\d+])
下面是完整配置文件:
struts.xml
<?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> <param name="includeproperties"> list\[\d+\]\.name </param> </result> </action> </package> </struts>
再看下此时的页面数据返回:
这样,咱们想要的数据就能够筛选出来了。