lgl669 2009-06-17 Servlet2.4:是sun公司提出的一個標準,作為容器提供商和我們開發(fā)人員必須按照這個標準來開發(fā)容器和 開發(fā)web應(yīng)用;開發(fā)人員實現(xiàn)Servlet的接口,service方法是由容器調(diào)用的,并且會傳進來request和 WEB應(yīng)用的目錄結(jié)構(gòu); servlet中的方法由所處的容器來調(diào)用; <form method="post" action="helloservlet"> </form> Http請求:包括請求頭和請求體 Get請求:瀏覽器提交的數(shù)據(jù)是放在請求頭部的; Post請求:瀏覽器提交的數(shù)據(jù)是放在請求體部的; Web application server: Tomcat: opt/jakarta_tomcat5.0.28 一、tomcat和servlet介紹 Tomcat的目錄結(jié)構(gòu) 1) bin:主要存放tomcat的一些可執(zhí)行文件,比如:startup.bat,shutdown.sh; 2) common:主要用來存放tomcat以及所有的web應(yīng)用都可以用的一些類或則.jar文件; 3) conf:其中包含著Tomcat的配置文件,主要是server.xml、web.xml和tomcat-users.xml等; conf/server.xml:修改Tomcat的端口 conf/web.xml:設(shè)置默認主頁 conf/tomcat-users.xml:添加Tomcat的Admin和Manager用戶 conf/Catalina/../新建xml文件,指定docBase,可以設(shè)定Tomcat應(yīng)用的 路徑,默認是在Tomcat/webapps目錄 4) logs:包含著Tomcat的日志文件以及應(yīng)用的日志文件; 5) server:存放只有tomcat能使用的類或者jar文件以及tomcat自帶的web應(yīng)用,包含著運行Catalina 容器所需要的文件以及類庫; 6) shared:存放所有的web應(yīng)用共享的.class和.jar,但是tomcat不能使用; 7) temp:用來存放臨時文件; 8) webapps:存放我們開發(fā)的web應(yīng)用; 9) work:通過jsp生成的servlet類存放的目錄; ------------------------------------------------------------------------------------------- 在windows下配置tomcat: CATALINA_HOME= ------------------------------------------------------------------------------------------- home目錄下: 1.打開控制臺; 2.vi .bashrc 3.export JAVAHOME=/opt/java/jdk/jdk1.5.0_06 export CATALINA_HOME=/opt/jakarta-tomcat-5.0.28 4.保存配置文件; 5.source .bashrc; ------------------------------------------------------------------------------------------- 啟動tomcat 1、在命令行窗口啟動;需要配置環(huán)境變量;JAVA_HOME(必須),CATALINA_HOME(必須), PATH(可選) 執(zhí)行%CARALINA_HOME%\bin下startup.bat啟動tomcat,shutdown.bat關(guān)閉tomcat; 2、在eclipse中啟動;無須配置系統(tǒng)環(huán)境變量;通過myeclipse插件集成tomcat; ------------------------------------------------------------------------------------------- WEB應(yīng)用的目錄結(jié)構(gòu): Servlet --WEB-INF --classes存放開發(fā)的java類,比如說是servlet類 --lib 存放第三方的jar包,比如說ojdbc14.jar --web.xml 對servlet進行描述 --.htm .html .jsp 就編寫好的上述程序放入%CATALINA-HOME\webapps\中; url-pattern <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> ---------------------------------------------------------------------------------------------------------------------------------- Http協(xié)議:是應(yīng)用層的協(xié)議,他是無狀態(tài)的。它是架在tcp/ip傳輸層協(xié)議之上的,對傳輸數(shù)據(jù)的格式做 了一個定義。 ------------------------------------------------------------------------------------------- CGI和Servlet的優(yōu)缺點: CGI程序可以有多種語言編寫,但是服務(wù)器端處理請求使用進程,消耗服務(wù)器端資源; Servlet只能由java編寫,服務(wù)器端處理請求使用線程,移植性好; ------------------------------------------------------------------------------------------- 什么是Servlet? JEE規(guī)范的一部份,是用java語言編寫的服務(wù)器端程序, 用于創(chuàng)建動態(tài)web頁面,不依賴于具體的協(xié)議,必須運行于web容器中。 ------------------------------------------------------------------------------------------- 在tomcat根目錄下的conf目錄下修改: 配置tomcat-users.xml <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="manager"/> <role rolename="admin"/> <user username="tomcat" password="tomcat" roles="admin,manager"/> </tomcat-users> ------------------------------------------------------------------------------------------- 配置server.xml <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" /> ------------------------------------------------------------------------------------------- 在CATALINA/localhost下面配置一個新的文件:admin.xml 其中path里面填寫的是你的工程名字,docBase里面填寫的是WEB-INF的路徑; <Context path="/admin" docBase="/home/briup/works/Servlet/WebRoot" debug="0" privileged="true"> <Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_admin_log." suffix=".txt" timestamp="true"/> </Context> ------------------------------------------------------------------------------------------- 本來面目: <url-pattern>/hello</url-pattern> 訪問時在地址欄只能寫 http://127.0.0.1:8080/Servlet/hello 為了加強靈活性和易用性,方法如下: 后通配: <url-pattern>/hello/*</url-pattern> 訪問時在地址欄里寫 http://127.0.0.1:8080/Servlet/hello/asdasd/asdasd/asdasd 都是可以的; 前統(tǒng)配: <url-pattern>*.hello</url-pattern> http://127.0.0.1:8080/Servlet/*.hello http://127.0.0.1:8080/Servlet/a.hello http://127.0.0.1:8080/Servlet/abc/a.hello 都是可以的; ------------------------------------------------------------------------------------------- HttpServlet繼承自GenericServlet,其中的service方法自動實現(xiàn); GenericServlet的調(diào)用方法: 容器 ——————>service(ServletRequest req,ServletResponse res) ————>service(HttpServletRequest req,HttpServletResponse res) ——METHOD="GET"——>doGet(HttpServletRequest req,HttpServletResponse res) ——METHOD="POST"——>doPost(HttpServletRequest req,HttpServletResponse res) ------------------------------------------------------------------------------------------- 表單的處理: <FROM METHOD="POST" ACTION="servlet/FormServlet"> ------------------------------------------------------------------------------------------- 獲取客戶端提交的信息: 1)HttpServletRequest.getParameterNames():獲取所有表單信息 2)HttpServletRequest.getParameter(key):獲取指定key的信息 3)HttpServletRequest.getParameterValues(key):表單項有多個值,用此方法 客戶端向服務(wù)器端提交信息 1)使用表單,即<form> 2)在URL后追加 ?name=value&name=value 獲取HTTP請求的頭部信息: 1)HttpServletRequest.getHeaderNames() 2)HttpServletRequest.getHeader(...) 如referer可以取到上一個網(wǎng)頁的URL localhost:8888/servletjd0710/ch2/RequestServlet?name=briup&age=10 request.getContextPath():/servletjd0710 request.getQueryString():name=briup&age=10 request.getRequestURI():/servletjd0710/ch2/RequestServlet request.getRequestURL():http://localhost:8888/servletjd0710/ch2/ request.getServletPath():/ch2/RequestServlet 二、servlet的生命周期 1)由容器裝載并實例化,產(chǎn)生一個實例 2)由容器調(diào)用init()方法,不需要考慮多線程 只被調(diào)用一次 init(ServletConfig config)先被調(diào)用 nit()后被調(diào)用 設(shè)置初始化參數(shù): 1, 全局的 <context-param> <param-name>age</param-name> <param-value>20</param-value> </context-param> 通過ServeltConfig.getServletContext().getInitParameter(...)取 2,局部的 <servlet> <servlet-name>helloservlet</servlet-name> <servlet-class>com.briup.ch3.HelloServlet</servlet-class> <init-param> <param-name>name</param-name> <param-value>zhangsan</param-value> </init-param> </servlet> 通過ServletConfig.getInitParameter(...)取 3)根據(jù)用戶的每一次請求,調(diào)用一次服務(wù)方法doGet/doPost等,需要考慮多線程 service(ServletRequest,ServletResponse) service(HttpServletRequest,HttpServletResponse) doGet()/doPost() 多線程處理 1)implements SingleThreadModel 每個請求創(chuàng)建一個Servlet實例為其服務(wù),性能低,不建議使用 2)建議在servlet類用不要使用實例變量, 如果用,使用synchornized進行同步 4)由容器調(diào)用destroy()方法,不需要考慮多線程 只被調(diào)用一次 clean shutdown(無損關(guān)機) ------------------------------------------------------------------------------------------- 容器實例化servlet的順序: 1.當load-on-startup為負數(shù)的時候,servlet會在第一次訪問的時候被實例化,默認情況下load-on-startup為-1; 2.當load-on-startup為正數(shù)的時候,在tomcat裝載web應(yīng)用的時候servlet就會被實例化; 3.load-on-startup為0的時候,最晚被實例化; 4.load-on-startup>0的時候,值越小就越早被實例化; ------------------------------------------------------------------------------------------- GenericServlet:重載有參的init()方法,調(diào)用無參的init()方法.無參的init()方法用于初始化程序. ------------------------------------------------------------------------------------------- request范圍: ------------------------------------------------------------------------------------------- 三、資源跳轉(zhuǎn)的方式 (內(nèi)部跳轉(zhuǎn):forward和include,外部跳轉(zhuǎn):sendRedirect) 1)forward forward后的響應(yīng)內(nèi)容由所請求的資源給出 RequestDispatcher rd=request.getRequestDispatcher("SuccessServlet"); request.setAttribute("userinfo", "new User()"); rd.forward(request, response); 2)include inclue后的響應(yīng)內(nèi)容由其本身給出 out.println("<html><body>"); RequestDispatcher rd = request.getRequestDispatcher("/ch04/header"); rd.include(request,response); out.println("</body></html>"); forward和include的相同點: 絕對路徑中/都是web應(yīng)用 服務(wù)器內(nèi)跳轉(zhuǎn),客戶端地址欄無變化 都是同一個請求 3) sendRedirect 客戶端地址欄發(fā)生變化 兩次請求,request范圍內(nèi)設(shè)置的所有屬性將失效 response.sendRedirect("ShowInfo"); /指代 響應(yīng)內(nèi)容 地址欄 請求 跨應(yīng)用 forward web應(yīng)用 請求資源 不變 一次 不能 include web應(yīng)用 本身 不變 一次 不能 sendRedirect 服務(wù)器 請求資源 變化 兩次 能 web應(yīng)用: http://localhost:8080/hello 服務(wù)器: http://localhost:8080 <form action="/...">,<a href="/...">:"/"指代服務(wù)器 注:能用forward方式,就不要用sendRedirect 1)從性能 2)從對服務(wù)器內(nèi)部資源的保護(地址欄內(nèi)能否顯示服務(wù)器資源URL) 考慮 保護服務(wù)器資源 1)使用Filter對請求進行過濾 2)把要保護的資源方到WEB-INF下,客戶端瀏覽器不能直接訪問該目錄下 的資源,我們可以通過Servlet等訪問 設(shè)置屬性的四個范圍: 范圍 對應(yīng)類 Jsp內(nèi)建對象 javax.servlet.ServletContext application 應(yīng)用級別 針對整個web應(yīng)用 javax.servlet.http.HttpSession session 會話級別 針對一次會話 javax.servlet.http.HttpServletRequest request 請求級別 針對一次請求 javax.servlet.jsp.PageContext page 頁面級別 針對一個頁面 注:一個application可以跨越多個session,一個session可以跨越多個request, 一個request可以跨越多個page; 實際項目開發(fā)中,從性能、占用資源角度考慮,優(yōu)先使用小級別的; 獲取RequestDispatcher 1)HttpServletRequest.getRequestDispatcher(...):相對/絕對路徑 2)ServletContext.getRequestDispatcher(...):絕對路徑 注:這里的相對是絕對,/表示web應(yīng)用(如http://localhost:8080/hello) 3)ServletContext.getNamedDispatcher(...):根據(jù)servlet的名字獲取 ------------------------------------------------------------------------------------------ forward之前不能pw.flush(); ------------------------------------------------------------------------------------------ 外部跳轉(zhuǎn):讓瀏覽器重新發(fā)送一個新的請求,跳轉(zhuǎn)前后不是同一個請求;訪問前后路徑不同; ------------------------------------------------------------------------------------------ 總結(jié): forward:內(nèi)部跳轉(zhuǎn)或則是服務(wù)器內(nèi)部重定向; servlet1-------forward-----servlet2 servlet1和servlet2中的request對象是同一個。 sendRedirect:外部跳轉(zhuǎn)或則服務(wù)器外部重定向; servlet1-------sendredirect-----servlet2 servlet1和servlet2中的request對象不是同一個。 作外部跳轉(zhuǎn)調(diào)用response的sendRedirect方法,這個方法中傳入的路徑可以是相對的,也可以是絕對的; 相對的跟forward相同; 絕對的:應(yīng)用路徑+servlet url-pattern(這點和內(nèi)部跳轉(zhuǎn)是不同的); ------------------------------------------------------------------------------------------ 四、在tomcat中配置數(shù)據(jù)源 1)Admin登錄,找到項目 2)創(chuàng)建Data Source JNDI Name: jdbc/oracle URL: jdbc:oracle:thin:@192.168.1.200:1521:briupdb Driver: oracle.jdbc.driver.OracleDriver User: briup Password: briup 3)web.xml中配置資源引用(可選,新版本的tomcat不需要配置) <resource-ref> <description> Oracle Datasource example </description> <res-ref-name>jdbc/oracle</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> 4)Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oracle"); 注:配置數(shù)據(jù)源之后,在Tomcat/config/Catalina/..目錄下會新建一個xml文件, 里面存放數(shù)據(jù)源相關(guān)的信息 五、持久化狀態(tài):Cookie,Session HTTP協(xié)議是無狀態(tài)的,為了保存會話狀態(tài),我們有兩種解決方案: 1、Cookie,把會話狀態(tài)信息保存在客戶端 2、Session,把會話狀態(tài)信息保存在服務(wù)器端 Cookie:保存一些鍵/值對,到客戶端瀏覽器 name:briup password:briup 使用Cookie: 1)創(chuàng)建Cookie Cookie cookie = new Cookie("name","value"); 2)將Cookie加到客戶端瀏覽器 HttpServletResponse.addCookie(cookie); 3)在服務(wù)器端取出Cookie(返回Cookie[ ]) HttpServletRequest.getCookies(); Cookie.getName(); Cookie.getValue(); 會話Cookie:只在當前會話起作用的Cookie 持久Cookie:保存在客戶本地一段時間的Cookie 設(shè)置Cookie的時長:Cookie.setMaxAge(int second),單位秒 設(shè)置Cookie的有效路徑:Cookie.setPath(...) Cookie:由服務(wù)器創(chuàng)建,但是存放在客戶端; Cookie cookie=new Cookie(name,value); cookie.setMaxAge(timeout); 當timeout<0時,意味著這個cookie只要瀏覽器關(guān)閉就會消失; 當timeout=n(n>0)時,意味著cookie將會在客戶端被保存n秒; 當timeout=0時,意味著這個cookie將會被刪除; name相同的cookie會被覆蓋. response.addCookie(cookie); 服務(wù)器端獲得客戶端傳過來的cookie:Cookie[] cookies=request.getCookies(); Session: 獲取Session的方法: HttpServletRequest.getSession()<==>HttpServletRequest.getSession(true) 如果客戶和服務(wù)器已經(jīng)建立起會話,直接使用已有的Session對象, 如果沒有建立,就新建一個Session對象 HttpServletRequest.getSession(false); 設(shè)置屬性:HttpSession.setAttribute("name",Object); 獲取屬性:HttpSession.getAttribute("name"); 刪除屬性:HttpSession.removeAttribute("name"); 使用Session來保存會話信息,在客戶端也要留下一個標識,一般用JSESSION表示 在用戶禁用Cookie時使用Session方式在服務(wù)器端維持會話狀態(tài),在客戶端要留一個Session的id號, 優(yōu)先使用Cookie的JSESSIONID存放,如果禁用了Cookie,URL重寫的Session id號會被追加到 瀏覽器地址中URL的后面,用jsessionid表示 (http://localhost:8888/servlet/ch5/urlcounter;jsessionid=9FFA9CCB7D86134E0256E94D05E6DC44) 重寫:String encodedURL = response.encodeURL("/servletjd0710/ch05/UrlBasedCounterServlet"); Session什么時候失效? 1:程序中調(diào)用HttpSession.invalidate()方法 2:Session過期,在Session的最大有效時間以外 3:關(guān)閉應(yīng)用服務(wù)器 設(shè)置Session的有效時間: 1:HttpSession.setMaxInactiveIntervale(int second) 單位秒 2:在web.xml中進行配置 <session-conf> <session-timeout>...</session-timeout><!-- 單位分鐘 --> </session-conf> 注意:當程序中和web.xml中都設(shè)置了Session的有效時間時,以程序中的設(shè)置為準 復(fù)習: 1.創(chuàng)建servlet對象(通過load-on-startup來決定在什么時候被創(chuàng)建); 2.當servlet對象被創(chuàng)建成功以后,容器馬上會調(diào)用它的有參的init方法---init只被調(diào)用一次; 3.服務(wù)客戶端請求,客戶端發(fā)起一個請求,容器就會調(diào)用servlet的service方法,并且傳入ServletRequest, ServletResponse對象;------service方法可以被調(diào)用多次; 4.當容器關(guān)閉或則應(yīng)用被卸載的時候,servlet對象會被銷毀,在銷毀之前容器會調(diào)用destroy方法, ----destroy只被調(diào)用一次; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Datasource中存放的是collection;可以通過new來新建一個,也可以在目錄服務(wù)器中通過JNDI獲取; 跳轉(zhuǎn):內(nèi)部跳轉(zhuǎn)和外部跳轉(zhuǎn);最大區(qū)別:請求是否是同一個; cookie&session:記錄用戶相關(guān)狀態(tài);最大區(qū)別:存放的位置不同;session可以存放對象.cookie不可以; JSESSIONID一般是通過cookie寫入客戶端,如果關(guān)閉cookie則不能使用session;所以還有另外的方法; URL重寫: <a href=state/modifyRelease;jsessionid=XXXXXXXX>modifyRelease</a> ------------------------------------------------------------------------------------------ req.getSession() 從request對象中獲取jsessionid,如果根據(jù)這個jsessionid找不到一個對應(yīng)的session 對象,則創(chuàng)建一個新的session對象返回,如果能找到則返回找到的session對象; req.getSession(boolean create) 如果create為true,等價于req.getSession(); 如果create為false,根據(jù)request對象傳過來的jsessionId查找對應(yīng)的session對象,如果能找到則返回 找不到則返回null; 六、request、session、application request生命周期:生于容器接收到請求,死于servlet產(chǎn)生響應(yīng); session生命周期公司 創(chuàng)建:客戶端訪問一個servlet,在servlet中調(diào)用了req.getSession方法; 銷毀:1.關(guān)閉瀏覽器進程; 2.session過期;(在web.xml中指定<session-timeout>10</session-timeout>10鐘后過期) 3.調(diào)用session.invalidate()方法; 不建議將大量數(shù)據(jù)放在內(nèi)存中,這樣會比較消耗服務(wù)器內(nèi)存的; requestScope=====>HttpServletRequest對象 (Scope:作用范圍) request.setAttribute(name,value) Object value=request.getAttribute(name); request.removeAttribute(name) sessionScope=====>HttpSession對象 session.setAttribute(name,value) Object value=session.getAttribute(name) session.removeAttribute(name) applicationScope=====>ServletContext對象 對于一個應(yīng)用來說ServletContext對象是唯一的,存放所有用戶登陸的共用信息; 創(chuàng)建:應(yīng)用裝載的時候 銷毀:應(yīng)用卸載的時候 sc.setAttribute(name,value) Object value=sc.getAttribute(name) sc.removeAttribute(name) 七、Filter:過濾器 對服務(wù)器上的特定資源采取措施,進行限制 Filter的應(yīng)用:延遲登錄、編碼轉(zhuǎn)換、審計...... Filter的使用步驟: 1)寫Filter類 implements javax.servlet.Filter接口 重寫Filter接口中的方法init(FilterConfig), doFilter(ServletRequest,ServletResponse,FilterChain) , destroy() 2)在web.xml中進行配置 <filter> <filter-name> 自己取,但要和<filter-mapping>中的對應(yīng) <filter-name> <filter-class> Filter類的全限定名 </filter-class> <init-param> <param-name>...</param-name> <param-value>...</param-value> <init-param> </filter> 在程序中通過FilterConfig.getInitParameter("name")取 <filter-mapping> <filter-name> 和<filter>中的對應(yīng) </filter-name> <url-pattern> Filter所限制訪問的資源路徑 </url-pattern> </filter-mapping> 比如我們將<url-pattern>設(shè)為/ch5/*,那么我們在瀏覽器中訪問/ch5下的 資源時Filter就會自動被調(diào)用 Filter的生命周期: 1)init(FilterConfig) 由容器調(diào)用,并且只調(diào)用一次 2)doFilter(ServletRequest,ServletResponse,FilterChain) 訪問限定資源時,被調(diào)用,會被調(diào)用多次,注意考慮多線程問題, 處理方式和Servlet中的一樣 3)destroy() 由容器調(diào)用,并且只調(diào)用一次 FilterChain.doFilter(ServletRequest,ServletResponse):可以認為是處理請求和 響應(yīng)的分界限,在chain.doFilter(...)之前處理請求,在chain.doFilter(...)之后 處理響應(yīng) 注意:一旦寫了Filter一定要在Filter.doFilter(...)中調(diào)用FilterChain.doFilter() 方法,將請求交由其他資源繼續(xù)處理 編碼轉(zhuǎn)換: request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); response.setCharacterEncoding("UTF-8"); 過濾的url: /* 相同的資源可以被多個Filter過濾,F(xiàn)ilter的執(zhí)行順序取決于web.xml中配置的 <filter-mapping>的順序 八、監(jiān)聽器 監(jiān)聽器,對特定事件所采取的控制 常見事件:應(yīng)用服務(wù)器的啟動/關(guān)閉,會話的創(chuàng)建/刪除,請求的創(chuàng)建/刪除,屬性的增加、替換、刪 除等 Listener分類 應(yīng)用級別: ServletContextListener: void contextDestroyed(ServletContextEvent sce):監(jiān)聽應(yīng)用服務(wù)器的關(guān)閉 void contextInitialized(ServletContextEvent sce): 監(jiān)聽應(yīng)用服務(wù)器的啟動 ServletContextAttributeListener: void attributeAdded(ServletContextAttributeEvent scab): 監(jiān)聽應(yīng)用級別屬性的增加,即ServletContext.setAttribute("user","briup") void attributeRemoved(ServletContextAttributeEvent scab): 監(jiān)聽應(yīng)用級別屬性的刪除,即ServletContext.removeAttribute(...) void attributeReplaced(ServletContextAttributeEvent scab): 監(jiān)聽應(yīng)用級別屬性的替換,即使ServletContext.setAttribute("user","ibm") 會話級別: HttpSessionListener void sessionCreated(HttpSessionEvent se):監(jiān)聽會話的創(chuàng)建 如,HttpServletRequest.getSession() void sessionDestroyed(HttpSessionEvent se):監(jiān)聽會話的刪除 如,HttpSession.invalidate() HttpSessionAttributeListener void attributeAdded(HttpSessionBindingEvent se) 監(jiān)聽會話級別屬性的增加,即HttpSession.setAttribute(...,...) void attributeRemoved(HttpSessionBindingEvent se) 監(jiān)聽會話級別屬性的刪除,即HttpSession.removeAttribute(...) void attributeReplaced(HttpSessionBindingEvent se) 監(jiān)聽會話級別屬性的替換,即HttpSession.setAttribute(...,...) 請求級別: ServletRequestListener void requestDestroyed(ServletRequestEvent sre):監(jiān)聽請求的刪除 void requestInitialized(ServletRequestEvent sre):監(jiān)聽請求的創(chuàng)建 ServletRequestAttributeListener void attributeAdded(ServletRequestAttributeEvent srae) 監(jiān)聽請求級別屬性的增加,即HttpServletRequest.setAttribute(...,...) void attributeRemoved(ServletRequestAttributeEvent srae) 監(jiān)聽請求級別屬性的刪除,即HttpServletRequest.removeAttribute(...) void attributeReplaced(ServletRequestAttributeEvent srae) 監(jiān)聽請求級別屬性的替換,即HttpServletRequest.setAttribute(...) 注:Listener程序不需要我們?nèi)フ{(diào)用,它由相應(yīng)的事件觸發(fā)執(zhí)行 配置文件中:<listener> <listener-class>ch07.ContextListener</listener-class> </listener> |
聯(lián)系客服