(9)運(yùn)行測(cè)試。單擊Eclipse菜單欄中的按鈕,在彈出的菜單中選擇“運(yùn)行方式/JUnit測(cè)試”命令運(yùn)行測(cè)試,若顯示圖1.43所示的運(yùn)行結(jié)果,則說(shuō)明Count類(lèi)中的encrypt()方法正確;否則,說(shuō)明encrypt()方法中存在錯(cuò)誤或方法實(shí)現(xiàn)的功能與預(yù)設(shè)計(jì)的不同。 1.9 后臺(tái)登錄設(shè)計(jì)
1.9.1 后臺(tái)登錄功能概述
用戶(hù)可通過(guò)單擊前臺(tái)頁(yè)面頂部的“進(jìn)入后臺(tái)”超鏈接,進(jìn)入后臺(tái)登錄頁(yè)面,如圖1.48所示。
為了防止任意用戶(hù)進(jìn)入后臺(tái),進(jìn)行非法操作,所以需要設(shè)置登錄功能。當(dāng)用戶(hù)沒(méi)有輸入用戶(hù)名和密碼,或輸入了錯(cuò)誤的用戶(hù)名和密碼進(jìn)行登錄時(shí),會(huì)返回登錄頁(yè)面顯示相應(yīng)的提示信息,如圖1.49所示。
后臺(tái)登錄模塊的操作流程如圖1.50所示。
在實(shí)現(xiàn)登錄功能時(shí),對(duì)于已經(jīng)登錄的用戶(hù),當(dāng)再次單擊前臺(tái)頁(yè)面頂部的“進(jìn)入后臺(tái)”超鏈接時(shí),應(yīng)直接進(jìn)入后臺(tái)主頁(yè),而不是再次顯示如圖1.48所示的登錄頁(yè)面要求用戶(hù)登錄,該功能的具體實(shí)現(xiàn)過(guò)程,將在1.9.3節(jié)中進(jìn)行介紹。
1.9.2 后臺(tái)登錄技術(shù)分析
在后臺(tái)登錄模塊中,對(duì)于已登錄的用戶(hù)要跳過(guò)登錄頁(yè)面,直接進(jìn)入后臺(tái)主頁(yè)。實(shí)現(xiàn)該功能的主要技術(shù)就是:在當(dāng)前用戶(hù)登錄成功后,向session中注冊(cè)一個(gè)屬性,并為該屬性賦值,當(dāng)用戶(hù)再次單擊“進(jìn)入后臺(tái)”超鏈接時(shí),先在程序中獲取存儲(chǔ)在session中該屬性的值,然后通過(guò)判斷其值來(lái)得知當(dāng)前用戶(hù)是否已經(jīng)登錄,從而決定將請(qǐng)求轉(zhuǎn)發(fā)到登錄頁(yè)面還是后臺(tái)首頁(yè)。
1.9.3 后臺(tái)登錄的實(shí)現(xiàn)過(guò)程
后臺(tái)登錄用到的數(shù)據(jù)表:tb_user。
根據(jù)技術(shù)分析,用戶(hù)單擊頁(yè)面頂部的“進(jìn)入后臺(tái)”超鏈接請(qǐng)求登錄時(shí),會(huì)先判斷用戶(hù)是否已經(jīng)登錄。若沒(méi)有登錄,則進(jìn)入登錄頁(yè)面,在該頁(yè)面中填寫(xiě)用戶(hù)名和密碼后,提交表單,在A(yíng)ction處理類(lèi)中獲取表單數(shù)據(jù)進(jìn)行驗(yàn)證,驗(yàn)證成功后查詢(xún)數(shù)據(jù)表,查詢(xún)是否存在用戶(hù)輸入的用戶(hù)名和密碼,若存在,則登錄成功,進(jìn)入網(wǎng)站后臺(tái)。如果用戶(hù)已經(jīng)登錄,則直接進(jìn)入后臺(tái)。下面按照這個(gè)流程,介紹后臺(tái)登錄的實(shí)現(xiàn)過(guò)程。
1.實(shí)現(xiàn)“進(jìn)入后臺(tái)”超鏈接
在view目錄下的top.jsp文件中實(shí)現(xiàn)進(jìn)入后臺(tái)的超鏈接。代碼如下:
例程45 代碼位置:光盤(pán)\TM\01\view\top.jsp
<a href="log_isLogin.action">[進(jìn)入后臺(tái)]</a>
上述代碼實(shí)現(xiàn)的超鏈接所請(qǐng)求的路徑為log_isLogin.action,觸發(fā)該超鏈接產(chǎn)生的請(qǐng)求將由LogInOutAction類(lèi)中的isLogin()方法處理,isLogin()方法用來(lái)判斷用戶(hù)是否已經(jīng)登錄。
2.設(shè)計(jì)登錄頁(yè)面Login.jsp
在登錄頁(yè)面中,應(yīng)包含一個(gè)表單,并提供“用戶(hù)名”和“密碼”兩個(gè)表單字段以便用戶(hù)輸入數(shù)據(jù)。Login.jsp頁(yè)面的關(guān)鍵代碼如下:
例程46 代碼位置:光盤(pán)\TM\01\pages\admin\Login.jsp
<%@ taglib prefix="s2" uri="/struts-tags" %>
<s2:form action="log_Login.action" theme="simple">
<tr><td colspan="2"><s2:fielderror/></td></tr> <!-- 輸出提示信息 -->
<tr>
<td>用戶(hù)名: </td>
<td><s2:textfield name="user.userName" size="30"/></td>
</tr>
<tr>
<td>密 碼: </td>
<td><s2:password name="user.userPassword" size="30"/></td>
</tr>
</s2:form>
3.創(chuàng)建封裝登錄表單數(shù)據(jù)的JavaBean
該JavaBean用來(lái)保存輸入的用戶(hù)名和密碼。代碼如下:
例程47 代碼位置:光盤(pán)\TM\01\src\com\yxq\model\UserSingle.java
package com.yxq.model;
public class UserSingle{
private String userName; //對(duì)應(yīng)表單中的“用戶(hù)名”字段
private String userPassword; //對(duì)應(yīng)表單中的“密碼”字段
……//省略了屬性的setXXX()與getXXX()方法
}
4.創(chuàng)建LogInOutAction類(lèi)
LogInOutAction類(lèi)用來(lái)處理用戶(hù)登錄和退出登錄請(qǐng)求。代碼如下:
例程48 代碼位置:光盤(pán)\TM\01\src\com\yxq\action\LogInOutAction.java
package com.yxq.action;
import com.yxq.actionSuper.MySuperAction;
import com.yxq.dao.OpDB;
import com.yxq.model.UserSingle;
public class LogInOutAction extends MySuperAction {
protected UserSingle user; //封裝表單數(shù)據(jù)的JavaBean
public UserSingle getUser() {
return user;
}
public void setUser(UserSingle user) {
this.user = user;
}
……//此處為判斷當(dāng)前用戶(hù)是否登錄的isLogin()方法
……//此處為驗(yàn)證用戶(hù)身份的Login()方法
……//此處為處理退出登錄的Logout()方法
……//此處為表單驗(yàn)證方法validateLogin()
}
當(dāng)用戶(hù)觸發(fā)“進(jìn)入后臺(tái)”超鏈接后,請(qǐng)求由LogInOutAction類(lèi)中的isLogin()方法驗(yàn)證用戶(hù)是否已經(jīng)登錄。isLogin()方法的代碼如下:
例程49 代碼位置:光盤(pán)\TM\01\src\com\yxq\action\LogInOutAction.java
/* 功能:判斷當(dāng)前用戶(hù)是否登錄 */
public String isLogin(){
Object ob=session.get("loginUser");
if(ob==null||!(ob instanceof UserSingle)) //如果對(duì)象為空,或者不是UserSingle類(lèi)的實(shí)例,表示沒(méi)有登錄
return INPUT; //返回登錄頁(yè)面
else //已經(jīng)登錄
return LOGIN; //進(jìn)入后臺(tái)