SSH2项目 LoginDemo 添加 AJAX
在前一篇教程中 Netbeans 整合 Struts2 Spring3 Hibernate3 登录演示 ,我们做了一个完整的基于 SSH2 的 登录演示。
这篇教程,我们将为它加入 AJAX 方式的 登录演示。
Struts2 对 AJAX 的支持是很方便的。加入 AJAX 只需要做非常小的改动即可。这篇教程中所提到的修改,均基于 LoginDemo项目。
具体步骤如下:
-  库文件依赖,为 Struts2 添加 AJAX 支持需要几个库文件包:
- json-lib-2.1.jdk15.jar
- struts2-json-plugin-2.2.1.1.jar
- struts2-jquery-plugin-2.5.0.jar
 
- 修改 Action 类 LoginAction.java 添加 JSON 格式的返回值。
package com.track2web.demo.action;
import com.opensymphony.xwork2.ActionSupport;
import com.track2web.demo.entity.User;
import com.track2web.demo.service.IUserService;
public class LoginAction extends ActionSupport {
    private User user;
    private IUserService userService;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public IUserService getUserService() {
        return userService;
    }
    public void setUserService(IUserService userService) {
        this.userService = userService;
    }
    /**
     * Ajax 方式所调用的 Action 方法
     * @return 返回调用成功信号
     */
    public String loginAjax() {
        //将 登录信息保存至 user 属性,如果校验失败,user 属性值为 NULL
        this.user = this.userService.login(user);
        return SUCCESS;
    }
    /**
     * 普通登录方式调用的 ACTION 方法
     * @return
     */
    @Override
    public String execute() {
        //将 登录信息保存至 user 属性,如果校验失败,user 属性值为 NULL
        this.user = this.userService.login(user);
        if (user!=null) {
            return SUCCESS;
        }
        else {
            return ERROR;
        }
    }
}
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <!-- 普通方式登录 -->
    <package name="login-demo" extends="struts-default">
        <action name="loginAction" class="LoginAction">
            <result name="success">/success.jsp</result>
            <result name="error" type="redirect">/index.jsp</result>
        </action>
    </package>
    <!-- AJAX方式登录 注意 extends 自 json-default 时 result 的 type 值才有 json 类型-->
    <package name="login-ajax" extends="json-default">
        <!-- method 指定了 请求 Action 中哪个具体方法-->
        <action name="loginAjax" class="LoginAction" method="loginAjax">
            <!-- 返回值类型为 json -->
            <result type="json">
                <!-- 序列化 json 值时,不包括 NULL 值 属性-->
                <param name="excludeNullProperties">
                <!-- 序列化 json 值时,不包括 的属性,userSerive 为 Spring 注入属性-->
                <param name="excludeProperties">
                    userService
                </param>
            </result>
        </action>
    </package>
</struts>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!-- 添加 jquery tag 库 -->
<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <!-- 添加 JQUERY 库的 JS 库文件包含 -->
        <sj:head locale="zh_CN" jqueryui="true" />
        <!-- AJAX 方式登录 callback 函数响应,可以写至专门的 JS 文件 -->
        <script type="text/javascript">
                //当成功执行 ACTION 返回 JSON 值后的 CALLBACK
                $.subscribe("success", function(event) {
                    //判断如果返回值中不存在 user 对象,输出 登录失败!否则输出登录成功!
                    if (typeof(event.originalEvent.data.user)=="undefined") {
                        $("#result").html("Sorry! Login Fail! Please try argin.");          
                    }
                    else {
                        $("#result").html("Welcome! Login Successful!");
                    }
                });
        </script>
        <title>Login Demo</title>
    </head>
    <body style="text-align:center;">
        <!--普通登录方式 同原来的例子没有区别,只是加入了点CSS-->
        <s:div cssStyle="border:#000000 solid 1px;width:400px;margin:0 auto;">
            <span style="display:block;text-align:center;">Login Action Demo</span>
            <s:form action="loginAction" method="post" namespace="/login-demo" cssStyle="margin:0 auto;text-align:center;">
                <s:textfield name="user.userName" label="USERNAME" />
                <s:password name="user.userPass" label="USERPASS" />
                <s:submit value="Login Action" />
            </s:form>
        </s:div>
        <br />
        <!-- AJAX 方式登录 -->
        <s:div cssStyle="border:#000000 solid 1px;width:400px;margin:0 auto;">
            <span style="display:block;text-align:center;">Login AJAX Demo</span>
            <s:form action="loginAjax" method="post" namespace="/login-ajax" cssStyle="margin:0 auto;text-align:center;">
                <s:textfield name="user.userName" label="USERNAME" />
                <s:password name="user.userPass" label="USERPASS" />
                <!--
                    使用了 jquery 标签库的 submit 标签
                    targets - 登录后信息回显目标
                    onSuccessTopics - ACTION 执行成功返回 JSON 后调用的 callback 句柄
                    dataType - 定义 ACTION 返回值类型为 json
                -->
                <sj:submit value="Login AJAX" targets="result" onSuccessTopics="success" dataType="json" />
            </s:form>
            <!-- AJAX方式登录,信息回显目标元素 -->
            <span id="result" ></span>
        </s:div>
    </body>
</html>
Categories: 网页编程




