零基础学Struts
上QQ阅读APP看书,第一时间看更新

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 提示用户名已被占用