1. 程式人生 > >基於struts+hibernate+ajax的登入註冊驗證與購物車demo解析

基於struts+hibernate+ajax的登入註冊驗證與購物車demo解析

本博文主要介紹使用struts完成頁面跳轉和hibernate訪問資料庫的方式,完成簡單的ajax註冊驗證和購物車功能demo例項。將搭建過程和一些心得分享出來。此文為流程分析,並不介紹具體實現過程的每個細節,原始碼放在了下載頁。頁面截圖如下(請忽略頁面醜,只為功能齊全...)

一:struts+hibernate環境搭建

二:使用者登入實現

三. 註冊功能的動態重新整理驗證

四:加入購物車

 

 

一:struts+hibernate環境搭建

在此demo中,使用struts完成跳轉、hibernate訪問資料庫,則需要配置struts與hibernate。新建web專案,配置struts(web.xml新建filter-struts.xml),src下struts.xml檔案如下:

<struts>
	<include file="struts/login.xml"></include>
	<include file="struts/product.xml"></include>
</struts>

配置hibernate,src下新建hibernate.cfg.xml,配置請參考hibernate使用博文。

新建user類,id,name,userName,passWord屬性,並配置與資料庫對映關係 。

<hibernate-mapping package="pojo">
	<class name="User" table="user_">
		<id name="id" column="id">
			<generator class="native"/>
		</id>
		<property name="name" column="name"/>
		<property name="userName" column="username"/>
		<property name="passWord" column="password"/>
		<property name="createTime" column="createtime"/>
	</class>
</hibernate-mapping>

二:使用者登入實現

1. 新建login.jsp,登入驗證實現思路主要為以下幾要點:

form表單提交使用者輸入的資料,表單內容的name屬性為user.name等物件.屬性名的形式,提交form表單,請求login.action,交給struts跳轉到後臺,後臺通過hibernate查詢資料庫,如果輸入正確跳轉至首頁,否則重新跳轉至登入頁面,並在session中存入log提示資訊,告訴使用者登入失敗。

2. struts-login.xml:

<struts>
	<package name="login" extends="struts-default" namespace="/login">
		<!-- 登入驗證 -->
		<action name="loginCheck" class="action.LoginCheck" method="loginCheck">
			<result name="success">index.jsp</result>
			<result name="fail" type="redirect">/</result>
		</action>
		<!-- 執行註冊操作 -->
		<action name="zhuce" class="action.LoginCheck" method="zhuce">
			<result name="success" type="redirect">/</result>
			<result name="fail">fail.jsp</result>
		</action>
		<!-- 註冊時檢測使用者名稱是否重複 -->
		<action name="zhuceCheck" class="action.LoginCheck" method="zhuceCheck">
		</action>	
		<action name="myMsg" class="action.LoginCheck" method="myMsg">
			<result name="myIndex">/user/myIndex.jsp</result>
		</action>
		<!-- 使用者點選退出登入 -->
		<action name="exit" class="action.LoginCheck" method="exit">
			<result name="login" type="redirect">/</result>
		</action>
	</package>
</struts>

login.jsp:

<% Map m = ActionContext.getContext().getSession();
	String result = (String)m.get("result");
	if(result == "yes") {%>
		<font color="green">註冊成功</font>
	<% }%>
	<%if(result == "fail") { %>
		<font color="red">賬號密碼不正確,請重新登入!</font>
	<%} %>
<% m.remove("result"); %>
	<form action="login/loginCheck" method="post">
		使用者名稱:<input type="text" name="user.userName"/><br/>
		密碼:<input type="password" name="user.passWord"/><br/>
		<input type="submit" value="登入"/>
		<a href="login/zhuce.jsp">新使用者註冊</a>
	</form>

action.LoginCheck.java:

public String loginCheck() {
		Session s = sf.openSession();
		Map m = ActionContext.getContext().getSession();//獲取session
		s.beginTransaction();
		if(user != null) {
			Query q = s.createQuery("from User where username=? and password=?");
			q.setString(0, user.getUserName());
			q.setString(1, user.getPassWord());
			List<User> lu = q.list();
			if(lu.size() > 0) {
				for (User u : lu) {
					user = u;
				}
				m.put("loginOk", user.getName());//登入成功,在session中存放使用者姓名
				m.put("userId", user.getId());//登陸成功,在session存放使用者ID,以便後續使用
				return "success";
			}else {
				m.put("result", "fail");//驗證失敗,則session存放驗證結果,在前臺顯示
				return "fail";
			}
		}else {
			m.put("result", "fail");
			return "fail";
		}
	}

至此,登入驗證完成。相比不比我多解釋,大家都能看懂。

三. 註冊功能的動態重新整理驗證

1. zhuce.jsp:

<form method="post">
	使用者名稱:<input type="text" name="user.userName" id="userName"/><font id="check" color=""></font><br/>
	密碼:<input type="password" name="user.passWord" id="passWord"/><br/>
	再次輸入密碼:<input type="password" id="passWord2"/><br/>
	姓名:<input type="text" name="user.name" id="name"/><br/>
	<button onclick="check()">註冊</button>
</form>
<script src="../js/login/zhuce.js?t=2018007"></script>

form表單中,編寫註冊所需填寫資訊,使用者名稱後面加一個font標籤,用以顯示是否存在驗證結果顯示。

button註冊按鈕,對應js中的check()方法。用以提交使用者輸入的資訊提交form表單。

使用者名稱的ajax動態驗證在js中預載入函式中,通過對使用者名稱input框的輸入監控函式keyup(),也就是當鍵盤彈起式,觸發該函式,來完成使用者名稱的ajax驗證。

2. zhuce.js

var userNameIOk;      //用來驗證form提交時,使用者名稱是否存在,設為全域性變數
$(function() {
	$("#userName").keyup(function() {               //使用者名稱輸入鍵盤彈起時,觸發該方法
		var userName = $("#userName").val();
		var url = "zhuceCheck";   //請求action地址
		$.ajax({
			url:url,
			data:{
				userName:userName
			},
			type:"post",
			dataType:"text",
			success:function(result) {
				if(result == '1') {
					userNameIOk = "OK";
					$("#check").attr("color","green");   //修改fone標籤的顏色屬性值
					$("#check").html("可以使用");
				}
				if(result == '0') {
					userNameIOk = "NO";
					$("#check").attr("color","red");
					$("#check").html("已經存在");
				}
			}
		});
	});
});

//該方法為點選提交時,驗證使用者是否輸入完整以及資料的正確性,然後確定提不提交from
function check() {
	var userName = $("#userName").val();
	var passWord = $("#passWord").val();
	var passWord2 = $("#passWord2").val();
	var name = $("#name").val();
	var resulrt;
	if(userName == "" || userName == null) {
		alert("使用者名稱不能為空");
		resulrt = 0;
	}else if(passWord == "" || passWord == null) {
		alert("密碼不能為空");
		resulrt = 0;
	}else if(passWord2 == "" || passWord2 == null) {
		alert("請再次輸入密碼");
		resulrt = 0;
	}else if(name == "" || name == null) {
		alert("姓名不能為空");
		resulrt = 0;
	}else if(passWord2 != passWord) {
		alert("兩次輸入的密碼不一致,請檢查!");
		resulrt = 0;
	}else if (userNameIOk != "OK") {
		alert("該使用者名稱已經存在,請重新輸入");
		resulrt = 0;
	}else {
		resulrt = 1;
	}
	if(resulrt == 1) {
		var form = window.document.forms[0];  //獲取該html文件中的form
		form.action = "zhuce";                //設定該form的action地址
		form.submit();                        //提交該form
	}else {
		$("form").submit(function() {        //獲取所有的form表單,並設定submit屬性執行
                                             //function,返回false,代表不提交
			return false;
		});
	}
}

3. 請求的後臺方法:

public void zhuceCheck() {
		HttpServletResponse response = ServletActionContext.getResponse();//獲取response物件
		response.setCharacterEncoding("UTF-8");
		System.out.println(userName);
		checkResult = loginService.clickUserName(userName);  //hibernate驗證使用者名稱是否存在
		try {
			response.getWriter().write(checkResult);//通過response返回ajax返回結果
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

至此,通過ajax完成動態驗證完成。點選註冊,插入資料庫的操作,這裡不再贅述。

四:加入購物車

1. 新建product實體類,並配置好hibernate對映關係,新增幾條商品資訊,然後通過hibernate查詢所有商品資訊存在list集合中,struts返回jsp頁面,此過程不再贅述,以下為返回的jsp頁面:

<table style="width: 555px" border="1" cellpadding="0" align="center">
	<tr>
		<td><font color="blue">服務編號</font></td>
		<td><font color="blue">服務名稱</font></td>
		<td colspan="2"><font color="blue">服務價格</font></td>
	</tr>
	<s:iterator value="lc" var="p" status="st">
		<tr>
			<td>${p.id}</td>
			<td>${p.name}</td>
			<td>${p.price}</td>
			<td>
				<input class="addCart" pid="${p.id}" type="submit" value="加入購物車">
			</td>
		</tr>
	</s:iterator>
</table>
<a href="carList">檢視我的購物車</a>
<font id="msg"></font>

使用struts的s:標籤,遍歷迴圈出list中的資料,並加入一個加入購物車的按鈕,js中設定該按鈕的點選事件,通過ajax根據該產品的id獲取該產品資訊,並存在後臺購物車中(購物車使用session存放),實現不跳轉加入到購物車,並在下方新增fone標籤,用來顯示新增成功或者失敗的提示資訊。

2. js檔案如下:class為addCart的input觸發點選事件,並執行函式,該函式中設定了ajax請求,獲取到該條產品的id,並把id值傳到後臺,根據後臺response返回的結果顯示新增成功或者失敗的提示資訊

$(function(){
	$("#msg").hide();
	$("input.addCart").click(function(){
		var url = "joinCar";
		var pid = $(this).attr("pid");
		$.ajax({
			url:url,
			type:"post",
			data:{
				pid:pid
			},
			dataType:"text",
			success:function(rel) {
				if(rel == "joinOk") {
					$("#msg").attr("color","green");
					$("#msg").html("新增成功!");
					$("#msg").fadeIn(1200);  //設定fone延遲1200ms顯示
					$("#msg").fadeOut(1200);//設定fone延遲1200ms隱藏
				}
				if(rel == "joinFail") {
					$("#msg").attr("color","red");
					$("#msg").html("新增失敗,請重新新增到購物車!");
					$("#msg").fadeIn(1200);
					$("#msg").fadeOut(1200);
				}
			}
			
		});
	});
});

3. 後臺方法:

public void joinCar() {
		HttpServletResponse response = ServletActionContext.getResponse();
		List<Product> mapPro;
		if(pid > 0) {
			pro = proService.getById(pid);//根據ajax傳來的id獲取該產品的全部資訊
            //獲取session中的該使用者購物車中的內容,key為proCar+id用來區分不用登入使用者使用不同                        
            //的key值
			mapPro = (List<Product>) m.get("proCar"+id);
			if(mapPro == null) {
				mapPro = new ArrayList<Product>();
			}
			mapPro.add(pro);//將該條產品加入到購物車
			m.remove("proCar");
			m.put("proCar"+id, mapPro);加入該條產品的list重新放回session中
			msg = "joinOk";
		}else {
			msg = "joinFail";
		}
		try {
			response.getWriter().write(msg);  //返回ajax的結果值
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

至此,購物車動態加入功能結束。