10.4 Struts 2整合JSON开发
Struts 2提供了与JSON插件的整合,从而可以为Action指定名为json的ResultType。JSON插件会自动将Action中的信息序列化成JSON格式的数据,可以通过JavaScript调用这些数据。下面将通过实例来介绍如何通过JSON插件完成Ajax方式的用户名是否占用检测。
10.4.1 下载和安装JSON插件
Struts 2提供了与JSON插件的整合,从而可以为Action指定名为json的ResultType。JSON插件会自动将Action中的信息序列化成JSON格式的数据,并可以通过JavaScript调用这些数据。
登录http://code.google.com/p/jsonplugin/downloads/list站点下载该JSON插件,目前该插件的最新版本为0.3。Struts 2整合JSON是非常简单的,只需将JSON插件复制到WEB-INF目录下就可以了。
10.4.2 JSP页面
新建JSP页面,该页面包括一个简单的表单,该表单中只包含用来输入用户名的单行文本框。当焦点离开该文本框时将触发JavaScript的validateName()事件代码。这里使用另一个强大的JavaScript框架Prototype.js,通过Prototype.js中的Ajax.Request可以非常轻松地实现Ajax交互。同样通过Prototype.js可以非常方便和简单地访问页面中的DOM节点,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title></title> <script type="text/javascript" src="js/prototype.js"></script> <script type="text/javascript" src="js/json.js"></script> <script language="JavaScript"> function validateName() { //请求的地址 var url = ' validateName.action' ; var params = Form.Element.serialize(' username' ); //创建Ajax.Request对象,对应于发送请求 var myAjax = new Ajax.Request( url, { //请求方式:POST method:' post' , //请求参数 parameters:params, //指定回调函数 onComplete: processResponse, //是否异步发送请求 asynchronous:true }); } function processResponse(request) { $("result").innerHTML = request.responseText; } </script> </head> <body> <s:form action="Regist.action"> <s:textfield id="username" name="username" label="用户名" onblur="validateName(); "/> </s:form> <div id="result" style="color: red"></div> </body> </html>
10.4.3 实现业务逻辑Action
新建业务控制器ValidateNameAction,设置同注册表单相对应的属性,并添加其setter和getter方法,代码如下所示。
package net.hncu.action; import net.hncu.service.RegistCheck; import com.opensymphony.xwork2.ActionSupport; public class ValidateNameAction extends ActionSupport { private String username; public String getUsername() { return username; } public void setUsername(String user) { this.username = user; } public String execute() { return SUCCESS; } }
在“struts.xml”文件中配置该业务控制器ValidateNameAction,并配置其Result的type类型的json。为了能够配置json类型的Result,必须配置包继承json-default,代码如下所示。
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="struts2" extends="json-default"> <action name="validateName" class="net.hncu.action.ValidateNameAction"> <result type="json" name="success"></result> </action> </package> </struts>
运行JSP页面,输入用户名信息。当将光标移出该文本框时,页面显示出了Action实例中的信息。这些信息为Action实例中的属性名以及相对应的属性值,如图10.13所示。
图10.13 输出Action属性以及属性值
10.4.4 完成用户名是否占用检测
下面来看如何通过JSON插件完成用户名是否占用检测。首先添加业务逻辑组件,通过其中的isRegist方法来判断用户名是否被占用,如果被占用则返回false;如果没有被占用则返回true,代码如下所示。
package net.hncu.service; import java.util.HashSet; import java.util.Set; public class RegistCheck { public Boolean isRegist(String username){ Set<String> users = new HashSet<String>(); users.add("xiaoqiang"); if(users.contains(username)) { return false; }else { return true; } } }
修改业务逻辑Action,为其添加一个用来输出提示信息的tip属性,并添加其setter和getter方法,代码如下所示。
package net.hncu.action; import net.hncu.service.RegistCheck; import com.opensymphony.xwork2.ActionSupport; public class ValidateNameAction extends ActionSupport { private String username; private String tip; public String getUsername() { return username; } public void setUsername(String user) { this.username = user; } public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } public String execute() { RegistCheck rc = new RegistCheck(); if (rc.isRegist(username)) { setTip("该用户名可以使用"); } else { setTip("用户名已被占用,请重新输入"); } return SUCCESS; } }
修改JSP页面,调用JavaScript中的parseJSON()方法将JSON格式化的字符串解析成一个JSON对象,调用该对象中的tip属性就可以访问Action实例中的tip属性。并设置DIV标签中的值为tip属性值,从而输出提示信息,代码如下所示。
function processResponse(request) { var action = request.responseText.parseJSON(); $("result").innerHTML = action.tip; }
运行注册页面,随意输入一个用户名。当将光标移出该文本框时,页面显示该用户名可以使用的提示信息,如图10.14所示。
输入用户名“xiaoqiang”,因为该用户已经存在,所以当将光标移出该文本框时,页面显示用户名已被占用,并请用户重新输入信息,如图10.15所示。
图10.14 提示用户名可以使用
图10.15 提示用户名已被占用