過濾器(Filter)和監聽器(listener)

轉載地址:[http://blog.csdn.net/qq1131410679/article/details/75151080]

一、過濾器

Filter(過濾器)並不是一個標準的Servlet ,它不能處理用戶請求,也不能對客戶端生成響應。通過Filter技術,開發人員可以實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞彙、壓縮響應信息等一些高級功能。
這裏寫圖片描述
過濾器在執行過程中任何時候都可以打斷,只要不執chain.doFilter()方法就不會再執行後面的過濾器和請求的內容。因此,要特別注意過濾鏈的執行順序問題。假如在邏輯出現兩次doFilter會導致有些頁面會執行兩次。
這裏寫圖片描述


(一)Filter開發步驟

1、編寫java類實現Filter接口,並重寫其方法

例如:字符編碼的 Filter

package filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
 * Description:
 * 設置編碼格式的filter
 * @author lee
 */
public class ContentType implements Filter{
    private String charset;
    private boolean enabled;

    @Override
    public void destroy() {}

    /**
     * Description:
     * 設置編碼格式
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        //設置編碼格式
        if(enabled && charset!=null)
            resp.setCharacterEncoding(charset);

        //執行doFilter方法,放行,進入目標資源或下一個過濾器
        chain.doFilter(req, resp);
    }
    @Override
    public void init(FilterConfig config) throws ServletException {
        charset = config.getInitParameter("charset");
        enabled = "ture".equals(config.getInitParameter("enabled"));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42


2、在 web.xml 文件中使用和元素對過濾器進行註冊,並指定攔截資源。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
            id="WebApp_ID" 
            version="3.1">
  <display-name>web</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <!-- 註冊監聽器 -->

  <filter>
    <!-- 監聽器名稱 -->
    <filter-name>charset</filter-name>
    <!-- 監聽器的class全稱,包名+類名 -->
    <filter-class>filter.ContentType</filter-class>
    <!-- 初始化參數 -->
    <init-param>
        <param-name>charset</param-name>
        <param-value>utf-8</param-value>
    </init-param>
    <init-param>
        <param-name>enabled</param-name>
        <param-value>true</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>charset</filter-name>
    <!-- 
    設置 filter 所攔截的請求路徑(過濾器關聯的URL樣式)
    值要與瀏覽器輸入的地址相匹配,通過url-pattern查找指定的資源
    寫法:
    1.完全匹配  要求以/開始,名稱與url一致.
    2.使用通配符 *
    1.目錄匹配   以/開始,以*結束.
    2.擴展名匹配 不能以/開始,以*.xxx對束
    (目錄匹配和擴展名匹配不能同時使用,例如 /*.jsp) 
    -->
    <!-- /*意味着攔截所有資源 -->
    <url-pattern>/*</url-pattern>

    <!-- 根據servlet的內部名稱攔截,攔截名內部名稱爲Servlet的servlet -->
    <servlet-name>Servlet</servlet-name>

    <!-- 
    指定過濾器所攔截的資源被 Servlet 容器調用的方式。用戶可以設置多個<dispatcher> 子元素用來指定 Filter 對資源的多種調用方式進行攔截。
    REQUEST:當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,那麼該過濾器就不會被調用。
    INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時,那麼該過濾器將被調用。除此之外,該過濾器不會被調用。
    FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時,那麼該過濾器將被調用,除此之外,該過濾器不會被調用。
    ERROR:如果目標資源是通過聲明式異常處理機制調用時,那麼該過濾器將被調用。除此之外,過濾器不會被調用 
    -->
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

</web-app>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

Filter鏈
多個Filter的訪問先後順序由 配置在前面的Filter 執行要早於配置在後面的Filter決定 。
(關於在<url-pattern> 元素中,的匹配方式可以參考另外一篇博客Servlet編程基礎 中的映射路徑)

這裏也可以通過註解在註冊過濾器,例如

@WebFilter(filterName="過濾器名稱",urlPattern="需要進行過濾的url")
  • 1
  • 1



(二)Filter的生命週期

過濾器是服務器啓動的時候創建和初始化,當有請求訪問時就會調用過濾器的doFilter方法,當關閉服務器的時候就會調用destroy方法銷燬過濾器。

public void init(FilterConfig filterConfig) throws ServletException;
//1、Filter的創建和銷燬由WEB服務器負責。web應用程序啓動時創建Filter 的實例對象,並調用其init方法,讀取web.xml配置,完成對象的初始化功能。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
//2、當客戶請求訪問與過濾器關聯的URL的時候,將先執行doFilter方法。

public void destroy();//銷燬
//3、Filter對象創建後會駐留在內存,當web應用移除或服務器停止時才銷燬。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9



(三)FilterConfig對象

在web.xml配置文件可以爲filter配置一些初始化參數,當web容器實例化Filter對象,調用其init方法時,會把封裝了filter初始化參數的filterConfig對象傳遞進來。因此開發人員在編寫filter時,通過filterConfig對象的方法,初始化參數。
例如在web.xml文件中,配置filter初始化參數:

<!-- 部分代碼 -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
            id="WebApp_ID" 
            version="3.1">
  <display-name>web</display-name>

  <filter>
    <filter-name>charset</filter-name>
    <filter-class>filter.ContentType</filter-class>
    <!-- 初始化參數 -->
    <init-param>
        <param-name>name1</param-name>
        <param-value>value1</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>charset</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

然後,我們就可以在filter中使用FilterConfig獲取這些初始化參數:

//部分代碼

public class ContentType implements Filter{
    FilterConfig config;
    @Override
    public void destroy() {
        config=null;}

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        //獲取初始化參數
        Enumeration e = config.getInitParameterNames();
        while(e.hasMoreElement){
            paramName = e.nextElement();
            paramValue = e.getInitParameter(paramName);
        }
    }
    @Override
    public void init(FilterConfig config) throws ServletException {
        this.config = config;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22



(四)過濾器案例

1、執行公用業務代碼
2、無效數據過濾(引入ckeditor客戶端組件)
3、登陸權限的判斷
這裏寫鏈接內容






二、監聽器

監聽器就是一個實現特定接口的普通Java程序,這個程序專門用於監聽另一個java對象的方法調用或屬性改變,當被監聽對象觸發某些事件後,監聽器某個方法將立即被執行。
在Servlet規範中定義了多種類型的監聽器,它們用於監聽的事件源分別爲 ServletContext, HttpSession 和 ServletRequest 這三個域對象。
監聽器劃分爲三種類型:

  • 監聽三個域對象創建和銷燬的事件監聽器
  • 監聽域對象中屬性的增加和刪除的事件監聽器
  • 監聽綁定到 HttpSession 域中的某個對象的狀態的事件監聽器。

這裏寫圖片描述


(一)監聽器的分類

1、監聽對象創建/銷燬的監聽器接口

Interface ServletRequestListener
//用於監聽ServletRequest對象的創建和銷燬。
//主要方法有:
void    requestDestroyed(ServletRequestEvent sre)
void    requestInitialized(ServletRequestEvent sre)

Interface HttpSessionListener
//用於監聽HttpSession對象的創建和銷燬
//主要方法有:
void    sessionCreated(HttpSessionEvent se)
void    sessionDestroyed(HttpSessionEvent se)

//用於監聽 ServletContext 對象的創建和銷燬事件。
//主要方法有:
void    contextDestroyed(ServletContextEvent sce)
void    contextInitialized(ServletContextEvent sce)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17


2、監聽對象屬性的變化

Servlet規範定義了監聽 ServletContext, HttpSession, HttpServletRequest 這三個對象中的屬性變更信息事件的監聽器。這三個接口中都定義了三個方法來處理被監聽對象中的屬性的增加,刪除和替換的事件,同一個事件在這三個接口中對應的方法名稱完全相同,只是接受的參數類型不同。

Interface ServletRequestAttributeListener
//主要方法有:
void    attributeAdded(ServletRequestAttributeEvent srae)
void    attributeRemoved(ServletRequestAttributeEvent srae)
void    attributeReplaced(ServletRequestAttributeEvent srae)

Interface HttpSessionAttributeListener
//主要方法有:
void    attributeAdded(HttpSessionBindingEvent event)
void    attributeRemoved(HttpSessionBindingEvent event)
void    attributeReplaced(HttpSessionBindingEvent event)

Interface ServletContextAttributeListener
//主要方法有:
void    attributeAdded(ServletContextAttributeEvent event)
void    attributeRemoved(ServletContextAttributeEvent event)
void    attributeReplaced(ServletContextAttributeEvent event) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18


3、監聽綁定到 HttpSession 域中的某個對象的變化

Servlet 規範中定義了兩個特殊的監聽器接口來幫助 JavaBean 對象瞭解自己在 Session 域中的這些狀態,實現這兩個接口的類不需要 web.xml 文件中進行註冊。

保存在 Session 域中的可以有多種狀態:
1、綁定到 Session 域中;從 Session 域中解除綁定;
2、隨 Session 對象持久化到一個存儲設備中(鈍化);隨 Session 對象從一個存儲設備中恢復(活化)
Interface HttpSessionBindingListene
//監聽對象綁定/解綁到session上的事件,即是將對象保存到session當中就會調用該對象實現該監聽器類方法
Interface HttpSessionActivationListener
//實現了該接口的 JavaBean 對象可以感知自己被活化和鈍化的事件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

這裏寫圖片描述



(二)監聽器的的實現步驟

1、實現相應監聽器的類

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
 * Description:
 * @author lee
 */
public class SessionListener implements HttpSessionListener{

    /**
     * Description:
     */
    @Override
    public void sessionCreated(HttpSessionEvent event) {
    }

    /**
     * Description:
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24


2、web.xml文件中配置監聽器

開發人員只需在web.xml文件中使用標籤配置好監聽器,web容器就會自動把監聽器註冊到事件源中。一個 web.xml 文件中可以配置多個事件監聽器,web 服務器按照它們在 web.xml 文件中的註冊順序來加載和註冊這些 Serlvet 事件監聽器。(這裏不包括不用註冊的兩個監聽器。)

<!-- web.xml文件部分 -->
<listener>
    <!-- 這裏就是把listener包下的Listener類註冊成爲監聽器 -->
    <lisntener-class>listener.Listener</listener-class>
</listener>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

在Servlet3.0下,也可以通過註解@WebListener就可以實現監聽器的註冊,不需要在web.xml中進行配置。



(三)監聽器案例

1、統計在線人數






三、過濾器和監聽器的實例

(一)實例描述

一個網頁,存儲有員工信息。可以進行管理員的登陸,管理員可以瀏覽、修改員工信息。管理員可以看得到其他管理員的是否在線。實現步驟:

1、建立數據庫

管理員:編號、名稱、密碼
員工:編號、名稱

2、編寫實體類

用於封裝管理員和員工的信息
Admin.java、Employee.java

3、數據訪問層

實現對數據的處理
IAdminDao.java 接口、IEmployeeDao.java 接口、AdminDao.java、EmployeeDao.java

4、數據庫連接

實現連接數據庫,獲取數據。
JdbcUtils

5、Servlet

LoginServlet.java 登陸處理
IndexServlet.java 首頁列表查詢Servlet
LogoutServlet.java 退出處理

6、Jsp頁面

Login.jsp
登陸成功, 提交到登陸Servlet處理其業務,跳轉到員工列表
登陸失敗,跳轉到登陸!
List.jsp 退出功能,跳轉到登陸頁面

7、過濾器

只有登陸後,纔可以訪問員工列表。如果沒有登陸,直接訪問首頁列表,要跳轉到登陸!
LoginFilter.java 登陸驗證過濾器
ContentType.java 編碼過濾

8、監聽器

監聽servletContext對象的創建,儲存在線管理員。登陸功能:用戶登陸時候,把數據保存到servletContext中。退出功能;監聽session銷燬,把當前登陸用戶從onlineuserlist移除!
ContextListener.java 監聽整個的項目的啓動,啓動時就創建在線管理員列表。
SessionListener.java 監聽管理員的登陸


描述圖:
這裏寫圖片描述

程序結構圖:
這裏寫圖片描述
這裏寫圖片描述

注:這裏使用了MySQL數據庫,引用C3P0連接池、dbutil、jstl標籤,以上這些都需要導入jar包。這裏在這個網站中找到對應的jar包



(二)數據庫設計

1、管理員數據庫
這裏寫圖片描述
2、員工數據庫
這裏寫圖片描述


(三)實體類

1、封裝管理員信息的實體類

package entity;

/**
 * Description:
 * 一個用來封裝管理員信息的實體類
 * 
 * @author lee
 * */
public class Admin {
    private int id;
    private String adName;
    private String password;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public String getAdName() {
        return adName;
    }
    public void setAdName(String adName) {
        this.adName = adName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

2、封裝員工信息的實體類

package entity;

/**
 * Description:
 * 封裝則員工信息的實體類
 * 
 * @author lee
 *
 */
public class Employee {
    private int id;
    private String empName;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28



(四)數據庫連接

package utils;

import javax.sql.DataSource;

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
 * Description:
 * 這裏使用C3P0的JDBC連接池,來實現數據源和JNDI(標準的Java命名系統接口)綁定
 * 實現連接數據庫,獲取數據。
 * 
 * @author lee
 */
public class JdbcUtils {

    /**
     * C3P0連接池的核心工具類
     */
    private static DataSource dataSource;
    //靜態初始化連接池
    //C3P0連接池會自動加載src目錄下的c3p0-config.xml配置文件,來連接mysql數據庫
    static{
        dataSource = new ComboPooledDataSource();
    }

    /**
     * Description:
     * 初始化DbUtils核心工具類對象,並返回
     * 
     * @return 返回DbUtils核心工具類對象
     */
    @Test 
    public static QueryRunner getQueryRunner(){
        //返回創建的QueryRuuner對象,並傳入連接池對象
        return new QueryRunner(dataSource);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

c3p0-config.xml配置文件的編寫

<c3p0-config>
  <default-config>
    <!-- mysql數據庫的url地址 -->
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/data</property>
    <!-- mysql數據庫的驅動 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <!-- 數據庫的用戶名稱 -->
    <property name="user">root</property>
    <!-- 數據庫的用戶的密碼 -->
    <property name="password">123456</property>
    <!-- 連接池保持的最小連接數 -->
    <property name="initialPoolSize">3</property>
    <!-- 鏈接池保持的最大連接數 -->
    <property name="maxPoolSize">6</property>
    <!-- 最大空閒時間,600秒內未使用則連接被丟棄。若爲0則永不丟棄。默認爲0  -->
    <property name="maxIdleTime">600</property>
  </default-config>
</c3p0-config>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19



(五)數據訪問層

1、管理員數據訪問層接口

package dao;
import entity.Admin;
/*
 * Description:
 * 管理員數據訪問層接口
 * 
 * @author lee
 */
public interface IAdminDao {
    /**
     * Description:
     * 根據管理員名稱來獲取管理員信息
     * 
     * @param adName 管理員的名稱
     * @return 返回封裝着管理員信息的Admin類
     */
    Admin findByName(String adName);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2、員工數據訪問層的接口

package dao;
import java.util.List;
import entity.Employee;

/*
 * Description:
 * 員工數據訪問層的接口
 * 
 * @author lee
 */
public interface IEmployeeDao {
    /**
     * Description:
     * 返回一個包含所有着員工信息集合
     * 
     * @return 返回一個包含所有着員工信息集合
     */
    List<Employee> findAll();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

3、管理員數據訪問層接口的實現類

package dao.impl;

import java.sql.SQLException;

import org.apache.commons.dbutils.handlers.BeanHandler;

import dao.IAdminDao;
import entity.Admin;
import utils.JdbcUtils;

/**
 * Description:
 * 管理員數據訪問層接口的實現類
 * 
 * @author lee
 *
 */
public class AdminDao implements IAdminDao{

    /**
     * Description:
     * 調用JdbcUtils的方法執行sql的查詢語句,根據指定的管理員名稱來獲取管理員信息。
     * 如果找不到對應名稱的管理員,則返回null
     * 
     * public T BeanHandler.handle(ResultSet rs) throws SQLException
     * An initialized JavaBean or null if there were no rows in the ResultSet
     * 
     * @param adName 管理員的名稱
     * @return 返回封裝着管理員信息的Admin類
     */
    @Override
    public Admin findByName(String adName) {
        //sql查詢語句
        String sql = "select * from admin where adName=?";

        try {
            //執行sql查詢語句,使用dbUtil工具類,
            //將查詢語句返回的數據表(ResultSet)第一行的封裝成一個JavaBean(即是封裝管理員信息實體類Admin)
            //that converts the first ResultSet row into a JavaBean. 
            return JdbcUtils.getQueryRunner()
                    .query(sql,new BeanHandler<Admin>(Admin.class),adName);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args){
        Admin admin = new AdminDao().findByName("lee");
        if(admin!=null)
            System.out.println(admin.getAdName()+","+admin.getPassword());

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

4、員工數據訪問層接口的實現類

package dao.impl;

import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import dao.IEmployeeDao;
import entity.Employee;
import utils.JdbcUtils;

/**
 * Description:
 * 員工數據訪問層接口的實現類
 * 
 * @author lee
 *
 */
public class EmployeeDao implements IEmployeeDao{

    /**
     * Description:
     * 同過調用JdbcUtils的方法執行sql查詢語句,來獲取所有員工的數據。
     * 
     * @return List<Employee>一個包含所有員工信息的集合,假如沒有則返回null
     */
    @Override
    public List<Employee> findAll() {
        //sql查詢語句
        String sql = "select * from employee";
        try {
            //執行sql查詢語句,使用dbUtil工具類,
            //將查詢語句返回的數據庫結果集的數據表(ResultSet)封裝成一個JavaBean的集合
            //that converts the first ResultSet 
            return JdbcUtils.getQueryRunner()
                    .query(sql,new BeanListHandler<Employee>(Employee.class));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41



(六)Servlet

1、LoginServlet.java 登陸處理

package servlet;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


import dao.impl.AdminDao;
import entity.Admin;

/**
 * Description:
 * 管理員的登陸驗證
 * 
 * @author lee
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    /**
     * Description:
     * 轉發的uri
     * 
     */
    String uri;

    /**
     * Description:
     * 管理員的登陸驗證。從表單中獲取管理員的名稱和密碼,並與數據庫中的管理員信息相比較。
     * 如果名稱和密碼相匹配,則登陸成功,轉發到員工列表頁面。
     * 否則轉發進入登陸頁面。
     * 
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //獲取表單的提交的管理員名稱和密碼
        String userName = request.getParameter("userName");
        String password = request.getParameter("password");

        //從數據庫中差查找指定的名稱的管理員的信息,由Admin封裝着
        Admin admin = new AdminDao().findByName(userName);

        //當密碼相匹配,則轉發員工列表頁面,否則轉發進入登陸頁面
        if(admin!=null&&password.equals(admin.getPassword())){
            //獲取session
            HttpSession session = request.getSession();
            //設置session的最大保留時間
            session.setMaxInactiveInterval(60);

            //假如session沒有管理員的信息,則將該管理員的信息保存在session域當中
            if(session.getAttribute("admin")==null){
                //將封裝管理員信息的admin保存在session域中
                session.setAttribute("admin", admin);

                //獲取在線管理員列表
                @SuppressWarnings("unchecked")
                List<Admin> admins = (List<Admin>)request.getServletContext().getAttribute("admins");
                if(admins!=null){
                    //將管理員信息添加到在線管理員列表
                    admins.add(admin);
                }
            }

            uri = "/IndexServlet";
        }else{
            uri = "login.jsp";
        }

        //轉發頁面
        request.getRequestDispatcher(uri).forward(request,response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

2、IndexServlet.java 首頁列表查詢Servlet

package servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import dao.impl.EmployeeDao;
import entity.Admin;
import entity.Employee;

/**
 * Description:
 * 獲取所有員工信息
 * 
 * @author lee
 */
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
    /**
     * Description:
     * 轉發的uri
     * 
     */
    String uri;

    /**
     * Description:
     * 獲取所有員工信息,並將其保存在session域中
     * 
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //獲取所有裝載員工信息實體的集合
        List<Employee> list = new EmployeeDao().findAll();

        //假如能獲取所有員工信息則將其保存在session域,否則轉發進入錯誤頁面
        if(list!=null){
            HttpSession session = request.getSession(false);
            session.setAttribute("list",list);

            uri="list.jsp";
        }else{
            uri="error.jsp";
        }

//      @SuppressWarnings("unchecked")
//      List<Admin> admins = (List<Admin>)request.getServletContext().getAttribute("admins");
//      if(admins!=null){
//          Iterator<Admin> i = admins.iterator();
//          while(i.hasNext()){
//              Admin admin = (Admin)i.next();
//              System.out.println(admin.getAdName());
//          }
//      }else{
//          System.out.println("該在線列表不存在");
//      }


        //轉發
        request.getRequestDispatcher(uri).forward(request,response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

3、LogoutServlet.java 退出處理

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Description:
 * 銷燬管理員的session
 * 
 * Servlet implementation class LogoutServlet
 */
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {

    /**
     * Description:
     * 當管理員點擊退出時,銷燬管理員的session
     * 
     * Invalidates this session then unbinds any objects bound to it.
     * 
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //獲取session,銷燬session
        HttpSession session = request.getSession();
        if(session!=null){
            session.invalidate();
        }

        //重定向到登陸頁面
        response.sendRedirect("login.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43



(八)Jsp頁面

1、Login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>登錄頁面</title>
</head>
<body>

    <!-- 將表單提交到LoginServle處理 -->
    <form align="center" style="position:relative;top:100px" 
                    name="form" 
                    action="${pageContext.request.contextPath}/LoginServlet" 
                    method="post">

        <h2 style="margin:25px">歡迎登陸</h2>
        <!-- 假如session有保存管理員的信息,則名稱和密碼的值爲管理員對應的名稱和密碼  -->
        用戶名:<input type="text" name="userName" value="${admin.adName}"><br>
        密碼:&nbsp;&nbsp;&nbsp;&nbsp;<input type="password" name="password"  value="${admin.password}"><br>
        <input align= "center" type="submit" name="登陸">
    </form>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

2、List.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!-- 導入Admin實體類 -->
<%@ page language="java" import="entity.Admin" %>
<!-- 導入jstl核心標籤 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>員工列表</title>
</head>
<body>
    <h3 align="center">歡迎管理員${admin.adName}登陸!</h3><br><br>

    <!-- 循環員工列表 -->
    <h3 align="center">員工列表</h3>
    <table align="center" border="1">
            <tr>
                <td>員工編號</td>
                <td>員工名稱</td>
            </tr>
        <c:forEach items="${list}" var="var">
            <tr>
                <td>${var.id}</td>
                <td>${var.empName}</td>
            </tr>
        </c:forEach>
    </table>

    <br><br>
    <c:if test="${not empty admins}">
        <p align="right" style="position:relative;right:10px;font-size:20px">
            當前在線管理員:<br>
            <c:forEach items="${admins}" var="var">
                ${var.adName}&nbsp;&nbsp;
            </c:forEach>
        </p>
    </c:if>
    <div align="right" style="position:relative;right:30px;font-size:20px"><a href="${pageContext.request.contextPath }/LogoutServlet" >退出</a></div>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43



(九)過濾器

1、ContentType.java 編碼過濾

package filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


/**
 * Description:
 * 設置編碼格式
 * 
 * @author lee
 */
public class ContentType implements Filter{
    FilterConfig config;
    @Override
    public void destroy() {
        config=null;

    }

    /**
     * Description:
     * 設置編碼格式
     * 
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        //設置編碼格式
        resp.setContentType("text/html;charset=utf-8");
        chain.doFilter(req, resp);
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

2、LoginFilter.java 登陸驗證過濾器

package filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Description:
 * 攔截沒有登陸的管理員進入查看員工列表頁面
 * 
 * @author lee
 */
public class LoginFilter implements Filter {
    FilterConfig  config;

    @Override
    public void destroy() { 
        config = null;
    }

    /*
     * Description:
     * 當用戶直接訪問員工列表頁面時,需要通過session保存的信息來判斷是否已經登陸,
     * 假如已經登陸後,則直接進入員工列表,假如沒有登陸則轉入登陸頁面
     * 
     * (non-Javadoc)
     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest res = (HttpServletRequest)request;
        HttpServletResponse resp = (HttpServletResponse)response;

        //獲取請求的uri
        String uri = res.getRequestURI();

        //請求直接訪問員工列表頁面時
        if("/web/list.jsp".equals(uri)
                ||"/web/IndexServlet".equals(uri)){
            //獲取session
            HttpSession session = res.getSession(false);

            //判斷session是否保存有登陸信息,已經登陸(即是session保存有其管理員的信息)
            //則可以直接訪問員工列表
            //否則,則重定向登陸頁面
            if(session!=null
                    &&session.getAttribute("admin")!=null)
                chain.doFilter(res, resp);
            else
                resp.sendRedirect("login.jsp");
        }else{
            //訪問其他頁面,則直接通過
            chain.doFilter(res, resp);
        }

    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72



(十)監聽器

1、ContextListener

package listener;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import entity.Admin;

/**
 * Decsription:
 * 監聽整個當前項目,維護一個當前用戶登陸列表。
 * 
 * @author lee
 *
 */
public class ContextListener implements ServletContextListener{

    public static List<Admin> admins = new ArrayList<Admin>();


    /**
     * Decsription:
     * 當真個項目銷燬是,銷燬該用戶登陸列表
     * 
     */
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        Object admins = event.getServletContext().getAttribute("admins");
        if(admins!=null)
            event.getServletContext().removeAttribute("admins");

    }

    /**
     * Description:
     * 當整個項目被創建時,初試化一個當前用戶登陸列表
     * 
     */
    @Override
    public void contextInitialized(ServletContextEvent event) {
        System.out.println("初始化在線用戶列表..");
        event.getServletContext().setAttribute("admins",admins);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

2、SessionListener.java

package listener;

import java.util.List;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import entity.Admin;

/**
 * Description:
 * 記錄session保存的用戶
 * 
 * @author lee
 *
 */
public class SessionListener implements HttpSessionListener{

    /**
     * Description:
     * 當記錄用戶的session別創建時,則將其保存在在線用戶列表
     */
    @Override
    public void sessionCreated(HttpSessionEvent event) {
//      HttpSession session = event.getSession();
//      System.out.println("初始化session");
//      @SuppressWarnings("unchecked")
//      List<Admin> admins = (List<Admin>) session.getServletContext().getAttribute("admins");
//      if(admins!=null){
//          Admin admin  = (Admin)session.getAttribute("admin");
//          if(admin!=null){
//              System.out.println(admin.getAdName());
//              admins.add(admin);
//          }
//      }
    }

    /**
     * Description:
     * 當記錄用戶的session被銷燬是,則將其從在線用戶列表中移除
     * 
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        //獲取session
        HttpSession session = event.getSession();

        //獲取在線用戶列表
        @SuppressWarnings("unchecked")
        List<Admin> admins = (List<Admin>) event.getSession().getServletContext().getAttribute("admins");
        if(admins!=null){
            //獲取session的用戶信息
            Admin admin  = (Admin)session.getAttribute("admin");
            //將用戶從在線列表中移除
            admins.remove(admin);
        }

    }


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62



(十一)web.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
            id="WebApp_ID" 
            version="3.1">
  <display-name>web</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>servlet.LoginServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

  <filter>
    <filter-name>charset</filter-name>
    <filter-class>filter.ContentType</filter-class>
  </filter>
  <filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>filter.LoginFilter</filter-class>

  </filter>

  <filter-mapping>
    <filter-name>charset</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

  <listener>
    <listener-class>listener.ContextListener</listener-class>
  </listener>
  <listener>
    <listener-class>listener.SessionListener</listener-class>
  </listener>

  <error-page>
    <error-code>404</error-code>
    <location>/notFound.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/error.jsp</location>
  </error-page>
</web-app>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61



(十二)效果

這裏寫圖片描述
這裏寫圖片描述

發佈了39 篇原創文章 · 獲贊 15 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章