JSP+Servlet培訓班作業管理系統[4]-記錄登錄用戶信息


稍微總結下,根據當前的項目結構圖:
這里寫圖片描述
簡單說下當前已經實現的邏輯如下:

1,login.jsp是用戶登錄頁
2,點擊登錄按鈕后,登錄頁表單提交到/LoginServlet
3,如果用戶名、密碼錯誤,跳轉到error.jsp並在error.jsp頁面顯示錯誤信息
4,如果用戶名、密碼正確,根據角色不同跳轉到不同頁面(此處暫時未實現,但是邏輯是這么設計的,而且也留好了設計的位置)
5,以校長角色登錄后,跳轉到schoolmaster.jsp
6,在schoolmaster.jsp中點擊菜單欄任意鏈接,將通過/RouteServlet將右側內容區域更換為鏈接指向的網頁。

重點是6,既然我們已經能控制點擊不同菜單,右側顯示不同內容,所以也沒有必要為每種角色單獨設計一個登錄后的頁面了。我們可以在登錄成功的時候記錄下登錄用戶的角色,然后根據角色在登錄成功頁面顯示不同的菜單。這樣的話,我們只需要一個后台jsp頁面就行了。

好的,接下來我們具體實現下task3-x:根據登錄用戶角色不同在同一后台頁面顯示不同的菜單和內容

task3-1:,登錄頁面login.jsp不作任何變化。

task3-2:,在LoginServlet的doPost方法中,添加記錄登錄用戶信息的語句如下:

package servlet;
import java.io.*;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import command.LoginCommand;
import entity.User;
import exception.MyException;
public class LoginServlet extends HttpServlet {//用於處理登錄請求的LoginServlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);//直接調用doPost方法處理get請求
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {//處理post請求
//設置輸入輸出格式、編碼
response.setContentType("text/html");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//獲取用戶在網頁輸入的用戶名和密碼
String userName=request.getParameter("userName");
String userPassword=request.getParameter("userPassword");
//數據庫操作
LoginCommand lc=new LoginCommand();
User user=null;
try {
user=lc.checkLogin(userName, userPassword);
if(user==null)
throw new MyException(new Date(),"用戶名或者密碼錯誤","用戶名或者密碼錯誤");
//根據user.getUserRole();用戶角色顯示不同內容
request.getSession().setAttribute("loginUser", user);//重點!
request.getRequestDispatcher("/index.jsp").forward(request,response);//跳轉到index.jsp
} catch (MyException e) {
//跳轉到錯誤提示頁面,並提示用戶錯誤信息
request.setAttribute("errorInfo", e.getInfo());//設置錯誤信息
request.getRequestDispatcher("/error.jsp").forward(request,response);//跳轉到error.jsp
}
}
}

其實就添加了兩句:

request.getSession().setAttribute("loginUser", user);//重點!
request.getRequestDispatcher("/index.jsp").forward(request,response);//跳轉到index.jsp

重點只有第一句,request.getSession()是獲取Session對象,所謂的Session就是用來標記某一個瀏覽器客戶端和服務器之間的會話的。之前request.setAttribute中保存的對象,只在一次請求之間有效,比如登錄頁面跳轉到Servlet有效,再跳轉就丟失了,服務器不負責一直保存該對象。而Session中保存的對象,只要瀏覽器沒關閉,程序員不刪除,沒有超時(時間很久瀏覽器端沒有操作也會自動丟失),就一直存在,所以非常適合用來保存登錄用戶的信息。

task3-3:,保存了含有用戶信息的loginUser對象到Session作用域中之后,跳轉到index.jsp頁面,我們將schoolmaster.jsp頁面的內容拷貝到index.jsp頁面,並修改如下(哈哈,其實只修改了 <title>index.jsp</title>一處),修改完成后schoolmaster.jsp頁面完成任務,退出歷史舞台:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!-- 使用c:標簽需要添加本行代碼 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index.jsp</title>
<style type="text/css">
/*星號表示選擇全部,設置外邊距0,內邊距0,字體大小12px,宋體*/
*{
margin:0px;
padding:0px;
font-size:12px;
font-family:"宋體";
}

/*整個body區域背景色為#F5F5F5,這個很簡單,自己下載個取色器,找個漂亮的網頁,取個顏色就行*/
body {
background-color: #FCFCFC;
}

/*在top、left、right外面套用一層main是為了控制寬度,並且整體居中*/
#main{
width:1000px;
margin:0px auto;

}

/*寬度占滿它爹的寬度,高度64px是瞎試的,不好看再調整,貓哥喜歡用16px、32px、64px、128px這些,你懂的。
背景色貓哥繼續取色器
line-height表示文字占用的高度,它也是64那就是文字占用高度跟top區域高度是一樣的嘛,所以文字就居中了*/

#top{
width:100%;
height:64px;
background-color:#000000;
line-height:64px;
}

/*文字顏色取色器,標題部分啊文字用微軟雅黑,大氣!*/
#top_title{
line-height:64px;
font-family:"微軟雅黑";
color:#FFFFFF;
float:left;
font-size:32px;
margin-left:16px;
}

/*顏色依然是自己取色的*/
#top_info{
color:#71777D;
float:right;
line-height:64px;
font-size:16px;
margin-right:16px;
}

/*寬度占200px差不多了吧
float表示漂浮,left的話就是靠左了,所以這個left區域就得靠左飄飄了
內部的東西跟邊距有點距離好看點,暫時定為10px,上下左右都是哦*/

#left{
width:200px;
height:536px;/*貓哥認為600-64=536*/
float:left;
background-color:#EEEEEE;
padding:10px;
}

/*調整id=left的div中的ul標簽下的li標簽的樣式為上邊距10px,左邊距15px*/
#left ul li{
margin:10px 0px 0px 15px;
}

/*注意逗號表示同時設置兩組對象的CSS屬性
a:link表示未訪問的鏈接,a:visited表示已訪問的鏈接,顏色憑愛好了*/

#left a:link, #left a:visited {
color: #333333;
text-decoration:none;/*不要下划線*/
}

/*a:hover表示鼠標懸停的鏈接,a:active表示被選擇的鏈接*/
#left a:hover, #left a:active {
color: #0AA770;
text-decoration:none;
}

/*同理right向右飄*/
#right{
width:760px;/*1000-200-10*4=760,此處一定要注意padding的內容會拓寬div整體寬度,有志於前端的可以專門去研究下*/
min-width:600px;
height:536px;/*貓哥認為600-64=536*/
float:right;
background-color:#FFFFFF;
padding:10px;
}


</style>
</head>
<body>
<div id="main">
<div id="top">
<div id="top_title">
貓哥培訓班作業管理系統
</div><!-- 標題部分 -->
<div id="top_info">
已登錄用戶名:張三
</div><!-- 登錄用戶信息部分 -->
</div><!-- top部分是標題欄 -->
<div id="left">
<ul>
<li><a href="/HomeworkSystem/RouteServlet?type=userManage">人員管理</a></li>
<li><a href="/HomeworkSystem/RouteServlet?type=viewInfo">信息查詢</a></li>
</ul>
</div><!-- left部分是菜單欄 -->
<div id="right">
<c:if test="${empty type}">
歡迎來到貓哥培訓班管理系統
</c:if>
<c:if test="${not empty type}">
<jsp:include page="${type}" flush="true"></jsp:include>
</c:if>
</div><!-- right部分是具體內容顯示區 -->
</div>
</body>
</html>

task3-4:,為了區分已登錄用戶的信息,我們將index.jsp中的:

<div id="top_info">
已登錄用戶名:張三
</div><!-- 登錄用戶信息部分 -->

修改為:

<div id="top_info">
歡迎您,尊敬的:${loginUser.userName}
</div><!-- 登錄用戶信息部分 -->

忘了告訴看官,$操作符及其強大,不光能讀request作用域中的attribute,也能讀session作用域中的attribute。(要是request和session中重名咋辦,哈哈,你別讓它重名不就噢了,就算重名也有辦法,不過這個跑題了,自行百度)。

task3-5:,這樣就通了,不同用戶登錄后,都是登錄到index.jsp,還能顯示不同的信息,非常好。為了測試我們添加一個測試類EntityFactory用來創建測試的實體類User,這個EntityFactory也放在entity包下好了。

package entity;
public class EntityFactory {
public static Object CreateEntity(String type){
if(type.equals("User")){
User user=new User();
user.setUserId(-1);
user.setUserName("張校長");
user.setUserPassword("1234");
user.setUserRole((Role)EntityFactory.CreateEntity("Role"));//設置UserRole,也可以手工寫
return user;
}
else if(type.equals("Role")){
Role role=new Role();
role.setRoleId(-1);//不存在的,虛構的
role.setRoleName("校長");
return role;
}
return null;
}
}

task3-6:,我們將從數據庫查詢的地方修改為直接使用測試工廠類生成一個:

package command;
import java.util.Date;

import entity.EntityFactory;
import entity.User;
import exception.MyException;
public class LoginCommand {//從此處向數據庫類下操作指令
public User checkLogin(String userName,String userPassword) throws MyException{
if(userName.equals("")||userPassword.equals("")){
//拋出輸入信息異常
throw new MyException(new Date(),"用戶名或者密碼為空","用戶名或者密碼為空");
}
User user=null;
try{
//從數據庫中執行查詢,此處暫時使用測試工廠類創建一個代替
user=(User)EntityFactory.CreateEntity("User");
}catch(Exception e){
throw new MyException(new Date(),e.getMessage(),"數據庫訪問異常");
}
return user;
}
}

task3-7:,重新部署、啟動后測試。用戶名密碼隨便輸入,都會以一個校長角色登錄。如下圖:
這里寫圖片描述

好的,接下來,只需要實現根據不同登錄角色加載不同的左側菜單這一功能就OK啦。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com