1. 程式人生 > >struts2+ajax+json實現使用者登入

struts2+ajax+json實現使用者登入

實現的是非同步重新整理登入功能,返回出錯資訊時不重新整理頁面。

前端程式碼:

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
<!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=GBK">
<title>struts2+ajax返回json型別資料</title>
<script type="text/javascript" src="js/jquery.js"></script>
</head>
<body>
        <h5>登入</h5>
        <br />
        <form action="#" method="post">
            <label for="username">使用者名稱:</label><input type="text" name="username" />
            <label for="password">密碼:</label><input type="password" name="password" />
            <input type="button" class="btn" value="登入"/>
        </form>
        <br />
        <h5>錯誤資訊</h5>
        <br />
        <ul>
            <li><span id="error"></span></li>
        </ul>  
    <script type="text/javascript">
         
        /* 提交結果,執行ajax */
        function btn(){
             
            var $btn = $("input.btn");//獲取按鈕元素
            //給按鈕繫結點選事件
            $btn.bind("click",function(){
                 
                $.ajax({
                    type:"post",
                    url:"login",//需要用來處理ajax請求的action name
                    data:{//設定資料來源
                        username:$("input[name=username]").val(),
                        password:$("input[name=password]").val()//這裡不要加","  不然會報錯,而且根本不會提示錯誤地方
                    },
                    dataType:"json",//設定需要返回的資料型別
                    success:function(data){
                        var d = eval("("+data+")");//將資料轉換成json型別,可以把data用alert()輸出出來看看到底是什麼樣的結構
                        //得到的d是一個形如{"key":"value","key1":"value1"}的資料型別,然後取值出來
                        if (d.success=="登入成功!") {
                        window.location.href = "index.jsp";
                        } else {                    
                        $("#error").text(""+d.error+"");  
                        }                     
                    },
                    error:function(){
                        alert("系統異常,請稍後重試!");
                    }//這裡不要加","
                });
            });
        }
     
        /* 頁面載入完成,繫結事件 */
        $(document).ready(function(){          
            btn();//點選提交,執行ajax
        });
    </script>
</body>
</html>

struts.xml檔案配置如下:
<action name="login" class="com.cn.useraction.LoginAction" method="login">
			<!-- 返回json型別資料 -->
            <result name="success" type="json">
                <param name="root">result<!-- result是action中設定的變數名,也是頁面需要返回的資料,該變數必須有setter和getter方法 --></param>
            </result>
            <result name="UserNotExist" type="json">
                <param name="root">result<!-- result是action中設定的變數名,也是頁面需要返回的資料,該變數必須有setter和getter方法 --></param>
            </result>
            <result name="error" type="json">
                <param name="root">result<!-- result是action中設定的變數名,也是頁面需要返回的資料,該變數必須有setter和getter方法 --></param>
            </result>
		</action>

另外,需要在package標籤中加入json資訊:
<package name="useraction" extends="struts-default,json-default">

另外,匯入用到的包:


注意,jsp中url填寫的是action的name,而利用action中返回的不同值來判斷在前端究竟要做什麼工作。

action程式碼如下:

package com.cn.useraction;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
 
import net.sf.json.JSONObject;
 
import com.cn.util.DBConnection;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
 
public class LoginAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    
    private String result;
    private String username;
    private String password;
 
    public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getResult() {
        return result;
    }
    public void setResult(String result) {
        this.result = result;
    }
     
	/**
	 * 使用者名稱與密碼匹配檢查
	 * 
	 * @return 結果標識 字串 success 表示匹配成功 UserNotExist表示使用者不存在 error 表示匹配失敗
	 */
	private String userCheck() {
		String name = null;
		String pass = null;
		Connection conn = DBConnection.getConn();
		String sql = "select * from users where username='" + username + "'";
		PreparedStatement pstmt;
		try {
			pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				name = rs.getString("username");
				pass = rs.getString("password");
				ActionContext.getContext().getSession().put("userflag", rs.getString("flag"));
			}

			rs.close();
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		if (name == null)// 驗證使用者名稱是否存在
			return "UserNotExist";
		else if (name.equals(username) && pass.equals(password))// 驗證登入使用者名稱與密碼是否匹配
			return "success";
		else
			return "error";
	}
    
	/**
	 * 處理ajax請求
	 * @return SUCCESS
	 */
	public String login() throws Exception {
		if (userCheck().equals("success")) {
			ActionContext.getContext().getSession().put("username", username);
			//將資料儲存在map裡,再轉換成json型別資料,也可以自己手動構造json型別資料
			Map<String,Object> map = new HashMap<String,Object>();
			map.put("success", "登入成功!");          
			JSONObject json = JSONObject.fromObject(map);//將map物件轉換成json型別資料
			result = json.toString();//給result賦值,傳遞給頁面
			return "success";
		} else if (userCheck().equals("UserNotExist")) {
			//將資料儲存在map裡,再轉換成json型別資料,也可以自己手動構造json型別資料
			Map<String,Object> map = new HashMap<String,Object>();
			map.put("error", "登入失敗:使用者名稱不存在或使用者名稱為空!");          
			JSONObject json = JSONObject.fromObject(map);//將map物件轉換成json型別資料
			result = json.toString();//給result賦值,傳遞給頁面
			return "UserNotExist";
		} else {
			//將資料儲存在map裡,再轉換成json型別資料,也可以自己手動構造json型別資料
			Map<String,Object> map = new HashMap<String,Object>();
			map.put("error", "登入失敗:密碼錯誤或未知的異常!");          
			JSONObject json = JSONObject.fromObject(map);//將map物件轉換成json型別資料
			result = json.toString();//給result賦值,傳遞給頁面
			return "error";
		}
	}
    
}

完成收工!