為了賬號安全,請及時綁定郵箱和手機立即綁定

JSP+Servlet培訓班作業管理系統[1]

2017.01.23 16:17 4631瀏覽

按照貓哥的一般習慣,做一個項目的順序如下:

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>

重新部署、運行后,測試輸入空的內容,提交后發現:錯誤信息:用戶名或者密碼為空,如果隨便輸如用戶名密碼,提交后發現:錯誤信息:用戶名或者密碼錯誤

最后,還有個問題,錯誤信息:用戶名或者密碼為空,這個也太生硬了把,最好改為友情提示:用戶名或者密碼不能為空。但是貓哥就是不改了,網站要個性!

點擊查看更多內容

本文原創發布于慕課網 ,轉載請注明出處,謝謝合作

18人點贊

若覺得本文不錯,就分享一下吧!

評論

相關文章推薦

正在加載中
意見反饋 幫助中心 APP下載
官方微信

舉報

0/150
提交
取消
lpl竞猜