??
監(jiān)聽器的概述
1、什么是監(jiān)聽器監(jiān)聽器就是一個(gè)實(shí)現(xiàn)了特定接口的Java類,這個(gè)Java類用于監(jiān)聽另一個(gè)Java類的方法調(diào)用,或者屬性的改變。當(dāng)被監(jiān)聽對(duì)象發(fā)生上述事件后,監(jiān)聽器某個(gè)方法將會(huì)立即被執(zhí)行
2、監(jiān)聽器的用途用來監(jiān)聽其他對(duì)象的變化的,主要應(yīng)用在圖形化界面的開發(fā)上例如Java中的GUI、Android等,都有大量的監(jiān)聽器的使用
3、監(jiān)聽器的術(shù)語事件源:指的是被監(jiān)聽對(duì)象(汽車)監(jiān)聽器:指的是監(jiān)聽的對(duì)象(報(bào)警器)事件源和監(jiān)聽器綁定:在汽車上安裝報(bào)警器事件:指的是事件源對(duì)象的改變(踹了汽車一腳),主要功能是獲得事件源對(duì)象
(二)監(jiān)聽器的入門
1、監(jiān)聽器的入門程序
2、監(jiān)聽器的執(zhí)行過程
(三)Servlet中的監(jiān)聽器
一、Servlet中的監(jiān)聽器簡(jiǎn)介在Servlet中定義了多種類型的監(jiān)聽器,它們用于監(jiān)聽的事件源分別是ServletContext、HttpSession和ServletRequest這三個(gè)域?qū)ο?/p>
二、Servlet中的監(jiān)聽器的分類
1、一類:監(jiān)聽三個(gè)域?qū)ο蟮膭?chuàng)建和銷毀的監(jiān)聽器(三個(gè))
2、二類:監(jiān)聽三個(gè)域?qū)ο蟮膶傩宰兏▽傩蕴砑?、移除、替換)的監(jiān)聽器(三個(gè))
3、三類:監(jiān)聽HttpSession中JavaBean的狀態(tài)改變(鈍化、活化、綁定、解除綁定)的監(jiān)聽(兩個(gè))
(四)ServletContextListener監(jiān)聽器的使用
一、ServletContextListener監(jiān)聽器的作用用來監(jiān)聽ServletContext域?qū)ο蟮膭?chuàng)建和銷毀的監(jiān)聽器
二、ServletContext創(chuàng)建和銷毀
1、創(chuàng)建:在服務(wù)器啟動(dòng)的時(shí)候,為每個(gè)Web應(yīng)用創(chuàng)建單獨(dú)的ServletContext對(duì)象
2、銷毀:在服務(wù)器關(guān)閉的時(shí)候,或者項(xiàng)目從Web服務(wù)器中移除的時(shí)候
三、ServletContextListener監(jiān)聽器的方法
1、監(jiān)聽ServletContext對(duì)象的創(chuàng)建contextInitialized(ServletContextEvent sce)
2
、監(jiān)聽ServletContext對(duì)象的銷毀ontextDestroyed(ServletContextEvent sce)
四、編寫監(jiān)聽器
1、監(jiān)聽器的代碼
2、監(jiān)聽器的配置
五、ServletContextListener的企業(yè)用途
1、加載框架的配置文件Spring框架提供了一個(gè)核心監(jiān)聽器叫ContextLoaderListener
2、定時(shí)任務(wù)調(diào)度
(五)HttpSessionListener監(jiān)聽器的使用
一、HttpSessionListener監(jiān)聽器作用用來監(jiān)聽HttpSession對(duì)象的創(chuàng)建和銷毀
二、HttpSession創(chuàng)建和銷毀創(chuàng)建:服務(wù)器端第一次調(diào)用getSession()方法的時(shí)候銷毀:非正常關(guān)閉服務(wù)器(正常關(guān)閉服務(wù)器Session會(huì)被序列化)Session過期(默認(rèn)過期時(shí)間30分鐘)手動(dòng)調(diào)用session.invalidate()方法
三、HttpSessionListener監(jiān)聽器的方法
1、監(jiān)聽HttpSession對(duì)象創(chuàng)建sessionCreated(HttpSessionEvent se)
2、監(jiān)聽HttpSession對(duì)象銷毀sessionDestroyed(HttpSessionEvent se)
四、編寫監(jiān)聽器監(jiān)聽HttpSession對(duì)象創(chuàng)建和銷毀
1、監(jiān)聽器的代碼
2、監(jiān)聽器的配置
3、問題:訪問HTML是否會(huì)創(chuàng)建Session?不會(huì)訪問JSP是否會(huì)創(chuàng)建Session?會(huì)訪問Servlet是否會(huì)創(chuàng)建Session?不會(huì)(默認(rèn)沒有調(diào)用getSession方法)
(六)ServletRequestListener監(jiān)聽器的使用
一、ServletRequestListener監(jiān)聽器的作用用于監(jiān)聽ServletRequest對(duì)象的創(chuàng)建和銷毀
二、ServletRequest對(duì)象的創(chuàng)建和銷毀創(chuàng)建:從客戶端向服務(wù)器發(fā)送一次請(qǐng)求,服務(wù)器就會(huì)創(chuàng)建Request對(duì)象銷毀:服務(wù)器對(duì)這次請(qǐng)求作出了響應(yīng)之后,
Request對(duì)象就銷毀了
三、ServletRequestListener監(jiān)聽器的方法
1、監(jiān)聽ServletRequest對(duì)象的創(chuàng)建requestInitialized(ServletRequestEvent sre)
2、監(jiān)聽ServletRequest對(duì)象的銷毀requestDestroyed(ServletRequestEvent sre)
四、編寫監(jiān)聽器代碼
1、監(jiān)聽器代碼在服務(wù)器啟動(dòng)的時(shí)候需要有一個(gè)初始值為零。當(dāng)瀏覽器訪問服務(wù)器上的某個(gè)JSP了,就會(huì)創(chuàng)建Session,此時(shí)獲取初始值,進(jìn)行+1操作。如果Session銷毀了,獲取該值進(jìn)行-1操作
二、代碼實(shí)現(xiàn)
1、創(chuàng)建ServletContextListener進(jìn)行初始化
2、創(chuàng)建HttpSessionListener
3、配置監(jiān)聽器
4、創(chuàng)建JSP頁面八)監(jiān)聽三個(gè)域?qū)ο蟮膶傩宰兏谋O(jiān)聽器一、三類監(jiān)聽器
1、ServletContextAttributeListener監(jiān)聽ServletContext對(duì)象中的屬性變更(屬性添加、移除、替換)的監(jiān)聽器attributeAdded(ServletContextAttributeEvent event)attributeRemoved(ServletContextAttributeEvent event)attributeReplaced(ServletContextAttributeEvent event)
2、HttpSessionAttributeListener監(jiān)聽HttpSession對(duì)象中的屬性變更(屬性添加、移除、替換)的監(jiān)聽器attributeAdded(HttpSessionBindingEvent event)attributeRemoved(HttpSessionBindingEvent event)attributeReplaced(HttpSessionBindingEvent event)
3、ServletRequestAttributeListener監(jiān)聽ServletRequest對(duì)象中的屬性變更(屬性添加、移除、替換)的監(jiān)聽器attributeAdded(ServletRequestAttributeEvent srae)attributeRemoved(ServletRequestAttributeEvent srae)attributeReplaced(ServletRequestAttributeEvent srae)
二、演示第二類監(jiān)聽器
1、演示HttpSessionAttributeListener
2、配置監(jiān)聽器
3、編寫測(cè)試的JSP
(九)監(jiān)聽HttpSession中Java類狀態(tài)改變的監(jiān)聽器
一、第三類監(jiān)聽器概述
1、保存在Session域中的Java類可以有多種狀態(tài):綁定到Session中、從Session中解除綁定、隨Session對(duì)象持久化到一個(gè)存儲(chǔ)設(shè)備中(鈍化)、隨Session對(duì)象從一個(gè)存儲(chǔ)設(shè)備中恢復(fù)(活化)
2、Servlet規(guī)范中中定義了兩個(gè)特殊的監(jiān)聽的接口,來幫助Java類了解自己在Session域中的狀態(tài),分別是:HttpSessionBindingListener接口HttpSessionActivationListener接口實(shí)現(xiàn)了這兩個(gè)接口的類,是不需要在web.xml中進(jìn)行配置的
二、HttpSessionBindingListener監(jiān)聽器
1、監(jiān)聽Java類在HttpSession中的綁定和解除綁定的狀態(tài)的監(jiān)聽器valueBound(HttpSessionBindingEvent event)valueUnbound(HttpSessionBindingEvent event)
2、測(cè)試代碼
三、HttpSessionActivationListener監(jiān)聽器
1、監(jiān)聽HttpSession中Java類的鈍化和活化的監(jiān)聽器sessionDidActivate(HttpSessionEvent se)sessionWillPassivate(HttpSessionEvent se)
2、測(cè)試代碼
3、配置完成Session的序列化和反序列化Context標(biāo)簽可以配置在:Tomcat/conf/context.xml:所有Tomcat下虛擬主機(jī)和虛擬目錄下的工程都會(huì)序列SessionTomcat/conf/Catalina? ?/local host/context.xml:只有l(wèi)ocal host虛擬主機(jī)下的所有項(xiàng)目會(huì)序列化Session工程/METAINF/context.xml:只有當(dāng)前工程才會(huì)序列化Session
(十)Filter
一、Filter的概述
1、什么是FilterFilter稱為過濾器,它是Servlet技術(shù)中最實(shí)用的技術(shù),Web開發(fā)人員通過Filter技術(shù),對(duì)Web服務(wù)器所管理的資源(JSP、Servlet、靜態(tài)圖片、靜態(tài)html文件等)進(jìn)行攔截,從而實(shí)現(xiàn)一些特殊的功能Filte就是過濾從客戶端向服務(wù)器發(fā)送請(qǐng)求
2、為什么學(xué)習(xí)過濾器
二、Filter的入門
1、第一步:編寫一個(gè)類實(shí)現(xiàn)Filter接口
2、第二步:對(duì)過濾器進(jìn)行配置
三、FilterC hain對(duì)象的概述
1、什么是FilterC hainFilterC hain過濾器鏈:在一個(gè)Web應(yīng)用中,可以開發(fā)編寫多個(gè)Filter,這些Filter組合起來稱為是一個(gè)過濾器鏈Web服務(wù)器根據(jù)Filter在web.xml文件中的注冊(cè)順序(mapping的配置順序)決定先調(diào)用哪個(gè)Filter,依次調(diào)用后的過濾器,如果沒有下一個(gè)過濾器,則調(diào)用目標(biāo)資源
2、FilterC hain的演示
四、Filter的生命周期
1、Filter的生命周期描述Filter的創(chuàng)建和銷毀是由web服務(wù)器負(fù)責(zé)。Web應(yīng)用程序啟動(dòng)的時(shí)候,Web服務(wù)器創(chuàng)建Filter的實(shí)例對(duì)象,并調(diào)用其init方法進(jìn)行初始化的操作
(Filter對(duì)象只會(huì)創(chuàng)建一次,init方法也只會(huì)執(zhí)行一次)每次Filter進(jìn)行攔截的時(shí)候,都會(huì)執(zhí)行doFilter的方法當(dāng)服務(wù)器關(guān)閉的時(shí)候,或者應(yīng)用從服務(wù)器中移除的時(shí)候,服務(wù)器會(huì)銷毀Filter對(duì)象
2、FilterCon? ?fig對(duì)象的概述
(1)FilterCon? ?fig對(duì)象的作用:用來獲得Filter的相關(guān)的配置的對(duì)象
(2)FilterCon? ?fig對(duì)象的APIgetFilter Name()getInitParameter(String name)getInitParameterNames()getServletContext()
3、FilterCon? ?fig的演示
五、過濾器的相關(guān)配置
1、<url-pattern >的配置完全路徑匹配:以/開始,例如/aaa/aaa/bbb目錄匹配:以/開始,例如/*/aaa/*/aaa/bbb/*擴(kuò)展名匹配:不能以/開始,以*開始,例如*.jsp *.do*.action
2、<servlet -name>的配置專門以Servlet的配置的名稱攔截Servlet
3、<dispatc her>的配置默認(rèn)的情況下,過濾器會(huì)攔截請(qǐng)求,如果進(jìn)行轉(zhuǎn)發(fā)(需要攔截這次轉(zhuǎn)發(fā))dispatc her的取值有四個(gè)REQUEST:默認(rèn)值。默認(rèn)過濾器攔截的就是請(qǐng)求FORWARD:轉(zhuǎn)發(fā)INCLUDE:頁面包含的時(shí)候進(jìn)行攔ERROR:頁面出現(xiàn)全局錯(cuò)誤頁面跳轉(zhuǎn)的時(shí)候進(jìn)行攔截(十一)權(quán)限驗(yàn)證過濾器
一、案例需求現(xiàn)在一個(gè)網(wǎng)站上需要有登錄的功能,在登錄成功后,重定向到后臺(tái)的成功頁面(后臺(tái)的頁面有很多)。如果現(xiàn)在沒有登錄,直接在地址欄上輸入后頁面地址編寫一過濾器,可以對(duì)沒有登錄的用戶進(jìn)行攔截(沒有登錄,回到登錄頁面;如果已經(jīng)登錄,放行)二、案例登錄功能
1、創(chuàng)建表(MySQL執(zhí)行如下語句)create databaseweb05charset utf8;use web0
5;create table user(id int primarykey auto _increment,userna me varchar(20),password varchar(20))charset ut f8;insert into user values (null,'aaa','123');
2、搭建項(xiàng)目的環(huán)境
3、代碼實(shí)現(xiàn)
三、權(quán)限驗(yàn)證的過濾器實(shí)現(xiàn)
(十二)通用的字符集編碼過濾器的分析
一、案例需求假設(shè)網(wǎng)站需要向后臺(tái)提交中文的數(shù)據(jù)(有可能是GET,也有可能是POST),中文處理根據(jù)不同的請(qǐng)求方式,處理的方式也是不同的需要調(diào)用request.getParameter() ;方法接收數(shù)據(jù),但是這時(shí)存在亂碼,如果想調(diào)用request.getParameter()方法,無是get還是post請(qǐng)求,提交的中文都沒有亂碼
二、增強(qiáng)一個(gè)類的方法
1、通過上面的分析,現(xiàn)在要增強(qiáng)request的getParameter方法,增強(qiáng)的過程要寫在過濾器當(dāng)中
(1)如何增強(qiáng)一個(gè)類中的方法?
1)繼承必須要能夠控制這個(gè)類的構(gòu)造
2)裝飾者被增強(qiáng)的類和增強(qiáng)的類需要實(shí)現(xiàn)相同的接口在增強(qiáng)的類中獲得被增強(qiáng)的類的引用缺點(diǎn):接口中的方法過多,會(huì)導(dǎo)致要重寫很多其他的方法
3)動(dòng)態(tài)代理類需要實(shí)現(xiàn)接口
三、通用的字符集編碼過濾器的代碼實(shí)現(xiàn)
1、過濾器的代碼
2、增強(qiáng)類的代碼
package com.good.domain;
public class User {
? private Integer id;
? private String username;
? private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.good.controller;
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 com.good.domain.User;
import com.good.model.UserModel;
/**
* Servlet implementation class UserServlet
*/
@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = new User();
user.setUsername(username);
user.setPassword(password);
UserModel userModel = new UserModel();
User existUser = userModel.login(user);
if(existUser == null) {
request.setAttribute("msg", "用戶名或密碼錯(cuò)誤");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}else {
request.getSession().setAttribute("exisetUser", existUser);
response.sendRedirect(request.getContextPath() + "/jsp/success.jsp");
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.good.model;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.good.domain.User;
import com.good.utils.Utils;
/**
*
* @author 趙藝
*
*/
public class UserModel {
public User login(User user) throws SQLException {
QueryRunner queryRunner = new QueryRunner(Utils.getDataSource());
String sql = "select * from user where username=? and password=?";
User existUser = queryRunner.query(sql, new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());
return existUser;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
? ? pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
登錄頁面</h1>
<h3><font color="red">${ msg }</font></h3>
<form action="${ pageContext.request.contextPath }/UserServlet" method="post">
? ? <table border="1" width="400">
? <tr>
用戶名</td>
? ? ? <td><input type="text" name="username"></td>
? ? </tr>
? ? <tr>
密碼</td>
? ? ? ? <td><input type="password" name="password"></td>
? ? ? ? </tr>
? ? ? ? <tr>
</tr>
? </table>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
? ? pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
您已經(jīng)登錄程序!歡迎:${ existUser.username }</h1>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
? ? pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1></h1>
<form action="${ pageContext.request.contextPath }/ServletDemo1" method="get">
姓名:<input type="text" name="name"><br>
</form>
<h1></h1>
<form action="${ pageContext.request.contextPath }/ServletDemo1" method="get">
姓名:<input type="text" name="name"><br>
</form>
</body>
package com.good.controller;
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;
/**
* Servlet implementation class ServletDemo1
*/
@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
? String name = request.getParameter("name");
System.out.println("GET方式接收的名稱:" + name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
System.out.println("POST方式接收的名稱:" + name);
}
}
package com.good.filter;
import java.io.UnsupportedEncodingException;
import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class MyHttpServletRequest extends HttpServletRequestWrapper{
? ? private HttpServletRequest request;
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
? @Override
public String getParameter(String name) {
? ? ? String method = request.getMethod();
? ? ? if("GET".equals(method)) {
? ? ? String value = super.getParameter(name);
? ? ? try {
//? ? ? value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
? ? ? value = new String(value.getBytes("UTF-8"),"UTF-8");
? ? ? }catch(UnsupportedEncodingException e) {
? ? ? e.printStackTrace();
? ? ? }
? ? ? return value;
? ? ? }else if("POST".equals(method)) {
? ? ? try {
? ? ? request.setCharacterEncoding("UTF-8");
? ? ? }catch(UnsupportedEncodingException e) {
? ? ? e.printStackTrace();
? ? ? }
? ? ? }
? return super.getParameter(name);
}
}
package com.good.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;
public class GenericEncodingFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
? ? MyHttpServletRequest myReq = new MyHttpServletRequest(req);
? ? chain.doFilter(myReq, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
package com.good.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 com.good.domain.User;
public class MyPrivilegeFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain Chain)
throws IOException, ServletException {
? HttpServletRequest req = (HttpServletRequest) request;
? User existUser = (User) req.getSession().getAttribute("existUser");
? if(existUser == null) {
req.setAttribute("msg", "您還沒有登錄!沒有權(quán)限訪問!");
? req.getRequestDispatcher("/login.jsp").forward(request, response);
? }else {
? Chain.doFilter(request,response);
? }
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}