struts2对json和ajax的支持

发表时间:2017-05-16 15:52:42 浏览量( 18 ) 留言数( 0 )

学习目标:

1、了解Struts2对json的解析


学习过程:

一、struts2对json的支持

1、导入json插件包

首先导入struts2-json-plugin-2.3.16.jar包。

2、继承json-default包

使用MyEclipse打开struts-plugin.xml文件,查看内容如下:

<package name="json-default" extends="struts-default">
 <result-types>
     <result-type name="json" 
     class="org.apache.struts2.json.JSONResult"/>
 </result-types>
<interceptors>
 <interceptor name="json" 
  class="org.apache.struts2.json.JSONInterceptor"/>
<interceptor name="jsonValidation" 
    class="org.apache.struts2.json.JSONValidationInterceptor"/>
      <!-- Sample JSON validation stack -->
       <interceptor-stack name="jsonValidationWorkflowStack">
     <interceptor-ref name="basicStack"/>
         <interceptor-ref name="validation">
           <param name="excludeMethods">input,back,cancel</param>
          </interceptor-ref>
            <interceptor-ref name="jsonValidation"/>
           <interceptor-ref name="workflow"/>
       </interceptor-stack>
     </interceptors>
</package>

有上面的代码可见,我们要使用json插件定义的result-type类型,就需要继承json-default。我们定义一UserAction代码如下:

public class UserAction extends ActionSupport {
	private List<Employee> employees;
	private EmployeeBiz employeeBiz = new EmployeeBiz();
	public String listuser() {
		employees = employeeBiz.getAll();
		return SUCCESS;
	}
	public List<Employee> getEmployees() {
		return employees;
	}
	public void setEmployees(List<Employee> employees) {
		this.employees = employees;
	}
}

3、定义xml文件如下:

<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="json-default">
	<action name="listuser" class="com.action.UserAction" method="listuser">
		<result type="json">
			<param name="root">employees</param>
		</result>
	</action>
</package>
</struts>

你可以查看这个action。就可以看到该employees对象已经是以json显示的。前台的jquery和上一节的使用就一样了,只是url改成这个action路径

二、struts2的ajax标签

1、简介

要使用struts2的ajax标签在新的版本中已经放在struts2-dojo-plugin-2.3.16.jar标签中了,所以现在需要先导入这个包。在页面上导入一下标签:

<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>

在html的<head>标签中需要写上以下代码:

<sx:head />

2、示例

struts2定义了很多ajax标签,使用都比较简单,但是和jquery等一些js客户端的ajax框架相比,灵活性就比较差点,所以这里就不做详细的介绍,具体大家可以查看官方文档:

http://struts.apache.org/release/2.3.x/docs/ajax-tags.html

在这里我们就举div标签简单讲解一下,其他大家可以自己阅读这个文档。在UserAction中新建一个now方法,用户获得当前时间:代码如下:

private String now;
	public String now() {
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
		now = sdf.format(date);
		return SUCCESS;
	}
	
	public String getNow() {
		return now;
	}

	public void setNow(String now) {
		this.now = now;
	}

新建test.jsp页面只是用于显示这个now,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'test.jsp' starting page</title>
</head>

<body>
${now }
</body>
</html>

xml配置如下:

<action name="now" class="com.action.UserAction" method="now">
   <result>/test.jsp</result>
</action>

可见这也并没有什么特殊的地方。下面在页面异步的访问这个action,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<sx:head />
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
    <sx:div href="now.action" loadingText="加载中..."></sx:div>
    <sx:div href="now.action" loadingText="加载中..."  updateFreq="500"></sx:div>
</body>
</html>