JSP+Servlet培訓班作業管理系統[1]
按照貓哥的一般習慣,做一個項目的順序如下:
1,先搞定數據庫
2,搞定Java Web項目基本結構,包括數據庫相關操作類
3,開發Java Web各項功能
4,優化、改進
這個順序呢,不直觀,而且容易使人厭倦,非常無聊,是故,拋棄之。這次貓哥從看的見摸得著的網頁出發,然后網頁需要后臺提供啥功能,就搞啥。最后后臺需要數據庫啥樣,就弄啥樣,用這樣一個順序實現培訓班管理系統。為了方便記憶和理解,貓哥將內容分節,節名統一用從task:X-Y開始,X表示任務名稱,Y表示任務步驟
。
task:1-1
,作為一個系統,首先就得提供登錄功能。設計一個最簡單的登錄頁面如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>login.jsp</title>
</head>
<body>
<form id="mainForm" method="post" action="/HomeworkSystem/LoginServlet">
請輸入用戶名:<input type="text" name="userName" />
<br/>
請輸入密碼:<input type="password" name="userPassword"/>
<br/>
<input type="submit" value="登錄"/>
</form>
</body>
</html>
task:1-1注意點
1,文件為:WebRoot/login.jsp
2,注意編碼保持utf-8
3,點擊【登錄】按鈕后,表單內容被提交給/LoginServlet
task:1-2
,我們來編輯LoginServlet處理登錄頁面提交的登錄請求吧。(貓哥使用的MyEclipse菜單新建的LoginServlet,自動生成了web.xml文件代碼和LoginServlet類及方法,貓哥為了演示更加清晰,將演示必要代碼)。
<?xml version="1.0" encoding="UTF-8"?><!-- web.xml文件內容 -->
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
</web-app>
package servlet;//在servlet包下
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
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");
}
}
task:1-3
,現在,用戶的登錄請求拋給了我們的Servlet處理,此時的邏輯應該如下設計:
1,如果用戶名或密碼為空,提示用戶輸入。
2,如果用戶名或密碼錯誤,提示用戶重新輸入(注意此處用戶名不存在也認為是輸入錯了即可)。
3,如果用戶名和密碼都正確,跳轉到相應用戶頁面。
4,因為存在校長、教師、學生三種不同的角色,不同角色登錄后頁面顯示內容不同(校長可以新增教師、學生,教師可以新增課程,學生可以提交作業,功能不同)。
根據以上討論,我們至少知道我們需要用戶的信息有:用戶名,密碼,角色,另外為了避免用戶名重復,我們需要一個唯一標識id(就像QQ上網名可以重復,但是QQ號是唯一的)。此處我們先不管數據庫(差不多什么樣心里也有數了吧),先把用戶這個實體類設計出來。
package entity;//在entity包下,注意了
public class User {
private int userId;
private String userName;
private String userPassword;
private String userRole;
//以后省略無聊的get set方法,自行補足
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserRole() {
return userRole;
}
public void setUserRole(String userRole) {
this.userRole = userRole;
}
}
此處有一點需要注意,就是userRole這個玩意,也就是角色。如果角色確定了就三種(校長、教師、學生),且每種角色對應的功能固定,那么就直接private String userRole;對應數據庫中的user_role列搞定(列值為校長、教師、學生三者之一)。如果要想系統拓展性更好,比如角色可能增加(副校長、教師又分班主任、助教..),那么可以將角色單獨設計為一張表,而用戶中的user_role指向角色表一條記錄即可。此處我們采取這種先進理念(哈哈自吹自擂),所以實體類改為:
package entity;
public class User {
private int userId;
private String userName;
private String userPassword;
private Role userRole;
//自行補足get set
}
//邪惡的分界線
package entity;
public class Role {
private int roleId;
private String roleName;
//自行補足get set
}
task:1-4
,然后我們現在需要操作數據庫了,但是貓哥想把數據庫留到最后再實現(實在是大同小異沒啥意思),那咋辦那。好辦,我們就像個八路軍指揮官一樣,三團上去干鬼子,至于三團怎么干鬼子,讓三團長自己想辦法,先把命令下去再說。我們建一個包command,用于向數據庫下令,首先我們把登錄相關的命令保存在LoginCommand類里面,代碼如下:
package command;
public class LoginCommand {//從此處向數據庫類下操作指令
}
結合task:1-3
中的需求分析,我們需要向LoginCommand 這個小團長(確實官職小,在程序設計的世界里,程序員就是最牛X的大官),下達檢查登錄指令
。這個指令描述如下:
指令:檢查登錄
動作:檢查userName和userPassword是否正確
行動結果:失敗:執行失敗原因(無此人?信息錯誤?..)
行動結果:成功:把此人帶來見我!我要根據他的能力(校長、教師、學生)給他安排工作。
這樣一看,就簡單了,這樣設計就行:
package command;
import entity.User;
public class LoginCommand {//從此處向數據庫類下操作指令
public User checkLogin(String userName,String userPassword) throws Exception{
if(userName.equals("")||userPassword.equals("")){
//拋出輸入信息異常
}
User user=null;
try{
//從數據庫中執行查詢
}catch(Exception e){
//拋出數據庫異常
}
return user;
}
}
好的,這樣一看,我們后續只需要把執行用戶查詢的語句放在//從數據庫中執行查詢
處,就可以了。此處還有幾個異常,需要處理,我們希望能把所有的異常信息統計起來,所以定義個自定義異常類如下:
package exception;
import java.util.Date;
public class MyException extends Exception{
private Date time;//記錄異常發生時間
private String message;//原始異常信息,給程序員看,記錄日志
private String info;//自定義信息,給用戶看
public MyException(){
super();
}
public MyException(Date time,String msg,String info){
super();
this.time=time;
this.message=msg;
this.info=info;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
好的,有了這個自定義異常類,我們的指令類可以修改為:
package command;
import java.util.Date;
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{
//從數據庫中執行查詢
}catch(Exception e){
throw new MyException(new Date(),e.getMessage(),"數據庫訪問異常");
}
return user;
}
}
task:1-5
,好的,此時,我們就可以在Servlet中調用LoginCommand 完成數據庫操作了,代碼如下:
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();用戶角色顯示不同內容
} catch (Exception e) {
//跳轉到錯誤提示頁面,并提示用戶錯誤信息
}
}
}
task:1-6
,根據用戶不同角色顯示不同內容,是一個比較復雜的事情,這個貓哥下一篇博客再論,我們來先來實現比較簡單的跳轉到錯誤提示頁面,并提示用戶錯誤信息
。
修改LoginServlet 為:
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();用戶角色顯示不同內容
} catch (MyException e) {
//跳轉到錯誤提示頁面,并提示用戶錯誤信息
request.setAttribute("errorInfo", e.getInfo());//設置錯誤信息
request.getRequestDispatcher("/error.jsp").forward(request,response);//跳轉到error.jsp
}
}
}
好的,最后,設計error.jsp為:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>error.jsp</title>
</head>
<body>
錯誤信息:${errorInfo}<br/>
<a href="login.jsp">點此返回登錄頁</a>
</body>
</html>
重新部署、運行后,測試輸入空的內容,提交后發現:錯誤信息:用戶名或者密碼為空
,如果隨便輸如用戶名密碼,提交后發現:錯誤信息:用戶名或者密碼錯誤
。
最后,還有個問題,錯誤信息:用戶名或者密碼為空
,這個也太生硬了把,最好改為友情提示:用戶名或者密碼不能為空
。但是貓哥就是不改了,網站要個性!
共同學習,寫下你的評論
評論加載中...
相關文章推薦