Servlet詳解-轉

Servlet詳解-轉

Servlet第一天   2007年6月21日
                                 
一、簡述
1、Servlet,服務器端的小程序,它是相對於Applet而言的,Applet是客戶端小程序。
   Servlet,是接受來自網絡的請求(form表單,以及其他的請求),並對不同請求作出不同的響應
   Servlet,是基於Http協議的,是運行在web服務器中的程序。這裏要提出一個容器的概念。
   servlet是運行在web容器中,在後面會詳細地講解,這個web容器可以控制Servlet對象的生命週期,控制請求由Servlet對象處理。

2、web服務器,這裏的服務器不是硬件概念,而是軟件,常用的web服務器有 Tomcat,Jboss等,我們所用到的Tomcat是一個開源的服務器,
   Tomcat是一個用java語言編寫的web服務器,所以需要有相應的java運行環境,也就是JVM,還要配置tomcat的具體路徑。

二、Tomcat的配置

JAVA_HOME=/XXX/XXX/(JDK路徑,bin的上一層目錄)
CATALINA_HOME=/XXXX/XXX(tomcat的絕對路徑 windows中 X:/xxx/xxx)

在啓動Tomcat時,是運行Tomcat的bin目錄下的startup.sh(windows中使用startup.bat)
判斷Tomcat是否啓動成功,可以在瀏覽器的地址欄中使用http://localhost:8080/http://127.0.0.1:8080/可以訪問到tomcat的主頁就是啓動成功了。
要想停止tomcat服務器要使用shutdown.sh(windows中使用shutdown.bat),如果直接關閉啓動窗口,就會造成8080端口占用錯誤,這時可以在使用
shutdown.sh關閉一下服務器。

startup.sh,shutdown.sh,shutdown.bat,startup.bat這些文件其實是一些腳本文件用來執行大量的命令,也就是大量java命令。

tomcat的默認監聽端口是8080端口,當接受到每一個連接請求,就會爲其分配一個線程。

tomcat可以識別的資源只有在webapps文件夾下,webapps也就是web應用文件夾,webapps下的文件夾這些文件夾中存放的就是web應用,
web應用是有格式規範的,每個web應用的文件夾下都要有
WEB-INF文件夾,WEB-INF文件夾下有classes,和lib文件夾,以及一個web.xml文件,一些使用到的類文件放在classes中,一些使用到
的相應的jar文件。

注意:使用完有限的資源要進行釋放。
tomcat中配置了root缺省應用,也就是在不指定的情況下會默認訪問這個應用。

web.xml文件的寫法
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

</web-app>

在tomcat服務器中,訪問應用下的資源可以在端口號後架上web應用文件夾得名字就可以看到資源
http://localhost:8080/xxxxx/xxxx.html,靜態頁面只能放在web應用的文件夾下,不能夠放在
WEB-INF文件夾下,WEB-INF文件夾中的資源是受保護的,不能夠通過網絡訪問到。


三、Servlet基礎

Servlet,可以實現動態的頁面,可以針對不同的請求作出不同的響應,可以實現頁面的流轉,Servlet可以充當MVC模式中的Ctrl模塊,他可以控制信息的流向。
web服務器會web應用在WEB-INF文件夾下的classes文件夾搜索要加載的class文件,所以我們寫的class文件要放在web應用中的WEB-INF文件夾下的classes文件夾下。

設置servlet的類和訪問的方式

web.xml文件的配置,一個web.xml中可以配置多個Servlet
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<servlet>
<servlet-name>servlet的名字</servlet-name>
<servlet-class>servlet類全名</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet的名字1</servlet-name>
<servlet-class>servlet類全名1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet的名字(要和servlet標籤中的相同)</servlet-name>
<url-pattern>指定servlet相對於應用目錄的路徑</url-pattern>
</servlet-mapping>
servlet-mapping>
<servlet-name>servlet的名字1</servlet-name>
<url-pattern>指定servlet相對於應用目錄的路徑</url-pattern>

<!--如/servletName,相當於把這個servlet映射到應用的根目錄下,使用serclet的時候可以假設它就在應用的根目錄下-->

<!--url-pattern標記的功能就是設置sevlet的訪問路徑-->
</servlet-mapping>
</web-app>

catalina.sh run 帶控制檯啓動tomcat服務器。


四、Servlet的調用過程

1,用戶通過瀏覽器向web服務器發送請求
   http://serverip:port/apppath
2,服務器爲用戶定位資源
   靜態資源:/a.html /a/b.html (這裏的路徑是針對web應用文件夾目錄)讀文件並把內容發 送到客戶端
   動態資源:解析web.xml定位Servlet類的名字
             裝載類(WEB-INF/classes|WEB-INF/lib/*.jar)
             創建該對象的實例
             Servlet ser=(Servlet)(Class.forName("servle的類名")).newInstance();
     //我們寫的Servlet一定要實現Servlet接口或者繼承實現了Servlet接口的類
     ser.service(request,response);

<servlet-mapping>
<servlet-name>servlet的名字(要和servlet標籤中的相同)</servlet-name>
<url-pattern>指定servlet相對於應用目錄的路徑</url-pattern>
</servlet-mapping>
url-parttern的配置,這個url就是Servlet的虛擬路徑,可以使用相對路徑或者是絕對路徑。
/xxx/xxx(絕對路徑) ,xxx(相對路徑),儘量使用絕對路徑。
訪問servlet的方法
http://serverip:port/應用文件夾名/url-pattern

http的請求
get請求,post請求。
get請求在發出請求時會把參數寫在地址欄上,而post請求不會把要發送的參數顯示在地址欄上。

<form method="get" action="應用名/url-pattern">
......
</form>

我們可以通過ServletRequest對象的方法來獲取請求中傳送的參數。
getParameter(String name)方法,可以獲得form表單中指定名字的參數,多參數同名時,只取一個。
getParameterNames(),可以獲得一個迭代器Enumeration,通過這個迭代器,來獲得form表單中參數的名字。
getParameterValues(String name)獲得指定的所有同名參數的值。

 

 

==============================================

                               Servlet第二天     2007年6月22日

一、複習
servlet接口的實現類中的service()方法,在繼承HttpServlet類時,如果沒有覆蓋父類的service()方法,
那麼父類的service()方法會根據請求類型不同的會分別調用覆蓋的doGet(),doPost()方法,如果響應兩
種請求的動作相同,那麼可以直接覆蓋service()方法。如果覆蓋了
doGet(),doPost()方法之一,那麼就會只對一種請求作出相應。在瀏覽器的地址欄操作按回車鍵,或者是
熱連接,都是get請求,form的method屬性如果不指定,默認爲get請求。

我們可以通過ServletRequest對象或HttpServletRequest對象的方法來獲取請求中傳送的參數。
getParameter(String name)方法,可以獲得form表單中指定名字的參數,多參數同名時,只取一個。
getParameterNames(),可以獲得一個迭代器Enumeration,通過這個迭代器,來獲得form表單中參數的名字。
getParameterValues(String name)獲得指定的所有同名參數的值。

get請求,會將參數顯示在瀏覽器的地址欄上,其顯示格式,在地址之後會以問號開始,以'&'分隔參數,
可以通過HttpServletRequest對象的getQueryString()方法來獲得get請求的參數值。

ServletRequest對象的getInputStream()方法可以獲得一個由Socket得來的輸入流,可以使用這個流來
實現文件的上傳。getReader()方法可以直接獲取post請求的參數。

注意:getParameter()與getReader()方法不能同時調用

ServletContext對象是Servlet的上下文對象,這個對象是在服務器啓動時創建的,他可以看作是
一個應用的對象,他可以看作是包含Servlet,管理Servlet的對象。


二、servlet的生命週期

遵守servlet規範的類,就可以通過服務器產生對象(反射機制),並處理請求。

servlet接口中的方法
所有的servlet都必須實現javax.servlet.Servlet接口

public class TestServlet implements Servlet {
ServletConfig config;
public void init(ServletConfig config) throws ServletException {//任務是初始化
this.config=config;
//這個ServletConfig對象是由服務器生成,也就是有系統提供的,通過他可以獲得啓動信息。ServletConfig對象和Servlet是一一對應的。
//這個方法是在Servlet創建後調用的。如果要是用到ServletConfig對象是一定要爲對象賦值。
}

public ServletConfig getServletConfig() {
return this.config;
}

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {//爲了幹活
...;//這個方法是用來處理請求的核心方法
}

public String getServletInfo() {
return "....";//這個是用來寫Servlet信息的,用來寫作者,以及版本信息
}

public void destroy() {
...;//這個方法是用來銷燬Servlet對象的
}

}

HttpServlet和GenericServlet都實現了Servlet接口。
HttpServlet中的service(HttpServletRequest request,HttpServletResponse response)方法是通過service(ServletRequest request,ServletResponse response)方法的調用

來實現對請求的處理。

1、Servlet的生命週期分爲四個階段
(1)創建Servlet對象,通過服務器反射機制創建Servlet對象,第一次請求時纔會創建。(默認)
(2)調用Servlet對象的init()方法,初始化Servlet的信息,init()方法只會在創建後被調用一次
(3)響應請求,調用service()或者是doGet(),doPost()方法來處理請求,這些方法是運行的在多線程狀態下的。
(4)在長時間沒有被調用或者是服務器關閉時,會調用destroy()方法來銷燬Servlet對象。


2、servlet創建時機:
(1)第一個請求到來的時候創建
(2)在web.xml中<servlet>標籤下添加<load-on-startup>2</load-on-startup>,則在服務器啓動的時候就創建
     標籤體是正數的時候,啓動服務器,即創建servlet
     並且當多個<servlet>標籤都定義了這個時,數字小的先加載

3、初始化參數
可以通過<init-param>標籤來配置初始化參數,可以用ServletConfig對象的
getInitParameter(String name)方法來得到參數。

<init-param>初始化參數
<param-name>...</param-name>
<param-value>...</param-value>
</init-param>

三、多線程下的操作
多線程下所操作的變量,如果操作的是一個變量,且兼有讀寫操作,就要考慮加上同步,但同步不能亂加,否則會造成死鎖問題。
init()和destroy()方法都是運行在單線程下的。

四、分佈式模型
把系統部署在不同的地址空間執行
在有限的硬件條件下,服務更多的用戶
在Servlet中可以訪問,JDBC,RMI(遠程方法調用),以及跨語言平臺的組件等資源。
在Servlet中是用JDBC很容易,也就是在Servlet中調用JDBC中的方法,就可以實現對數據庫的訪問

五、有參和無參的init方法。
public void init(ServletConfig config)throws ServletException
{
        this.config = config;
        init();
}

public void init()throws ServletException
{
.....;//覆蓋了的無參的init()方法,會在Servlet創建,調用有參的init方法時
也會被調用。
}

先覆蓋init(),有父類調init(config)
init()方法可拋異常,初始化成功才進入service()方法中


六、war文件
擴展名爲“.war”的文件放在tomcat的webapps下,當服務器啓動的時候,自動把文件解壓開
注意:文件名字,就是將來訪問時應用的名字


=================================================================================


                              
                               Servlet第三天     2007年6月25日
                              
一、連接池
在應用的META-INF文件夾下context.xml文件中
<Context>
   <Resource
      name="jdbc/oracle" 配置JDNI的名字
      type="javax.sql.DataSource" 綁定資源的類型
      password="sd0605"
      driverClassName="oracle.jdbc.driver.OracleDriver" 驅動名
      maxIdle="1"最大連接數
      maxWait="-1"等待時間,配置爲-1就是無限等待,只到有空閒連接爲止
      username="sd0605"
      url="jdbc:oracle:thin:@192.168.0.39:1521:TARENADB"
      maxActive="3" 最大活動連接數/>
</Context>     

以下是從連接池去取數據庫連接的代碼

public static Connection getConnection(String JNDIName){
Connection conn = null;
try{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env"); //這個是在tomcat下默認綁定Context的JNDIname
DataSource ds = (DataSource) envCtx.lookup(JNDIName);
conn = ds.getConnection();
} catch (NamingException ne){
ne.printStackTrace();
} catch (SQLException se){
se.printStackTrace();
}
return conn;
}


二、Java EE編程分層
   表現層,業務層,數據層。
表現層,也就算用來顯示數據,接受數據的。JSP,Servlet
業務層,是處理核心業務的程序 EJB,JDBC(Hibernate)
數據層,也就是數據庫,用來存放數據。Oracle,SQLServer

   MVC框架
Model,模型層,這一層一般是進行數據庫訪問,並且封裝對象,這一層中也存放在訪問數據庫取出信息封裝成對象的類,也就是實體類的信息,
      可以使用JDBC或者Hibernate實現這一層的功能。
Ctrl,控制曾,用來相應請求和調用寫好的相應的訪問數據庫的方法,這一層是用來控制請求的響應的,現在我們是使用Servlet來實現這一層,
      不過一般是會用開源的MVC框架來實現這層,例如struts,或者是Spring的MVC框架。
View,表現層,他只用來顯示數據和收集必要數據,收集數據的一般是form表單,不過要保證數據的正確性要是用JavaScript驗證信息,以後我
      們會學到的JSP(java server page)就是用來表現、顯示數據的。
     
三、Servlet的控制流轉
ServletContext,Servlet上下文對象,在每個Servlet中都會有一個ServletContext的引用,這個ServletContext是一個全局的對象,每個應用
               中只有一個ServletContext對象。
HttpServlet中的getServletContext()方法,獲得ServletContext對象。
ServletContext類的getRequestDispatcher(String path)方法獲得一個RequestDispatcher對象,並且跳轉到指定的Servlet,
              getRequestDispatcher(String path)方法中的參數就是path,就是指定跳轉的Servlet的url-pattern。
RequestDispatcher類的forward(ServletRequest request, ServletResponse response) 方法,可以把請求對象轉發給其他的Servlet。
     
include用在v層
forward用在c層

ServletRequest.getRequestDispatcher(); //relative     
ServletContext.getRequestDispatcher(); //absolute

一個Servlet對應一個Config,不能互相讀取
要想讓所有的Serlvet都能讀到參數:配置Context初始化參數,或者配置JNDI Naming的初始化參數                    

(1)配置Context容器的初始化參數
<context-param>
   <param-name>email</param-name>
   <param-vlaue>[email protected]</param-vlaue>
</context-param>

在servlet的使用
getSevletContext().getInitParameter("email");

(2)配置JNDI Naming的初始化參數
<env-entry>
   <env-entry-name>email<env-entry-name>
   <env-entry-type>java.lang.String<env-entry-type>
   <env-entry-value>[email protected]<env-entry-value>
</env-entry>

使用,得到初始化參數
Context ctx = new InitialContext();
String email = (String)ctx.lookup("java:comp/env/email");


四、會話
會話是可以保存狀態的

Session(會話)和Cookie(會話跟蹤機制)

Session對象用來解決客戶端發送多個請求時來用戶請求信息的存儲問題,但是他和ServletRequest對象是不同的,他會在有需要時創建,
但是他的生命週期會比請求對象要長。Session對象的生命週期也是有限制的,如果長時間的沒有訪問,就會銷燬掉Session對象,可以通
過Session對象的
setAttribute(String name, Object o) 和getAttribute(String name)來存取數據信息。Session是用戶級的對象。

public void service(ServletRequest request,ServletResponse response){

String user = request.getParameter("user");
        String pass = request.getParameter("pass");
HttpSession session = request.getSession(true);//使用請求對象來創建Session
        session.setAttribute("username", user);
        session.setAttribute("passwd", pass);
}


getSession(true)就表示如果Session不存在就創建一個新的Session,並把Session的標識SessionID寫到Cookie中,如果存在就是用這個
Session。getSession(false)就是在Session不存在時不會創建新Session而是返回null。如果使用getSession()方法,就等同於getSession(true)。

注意:ServletRequest對象適用於傳輸大量的數據,因爲其生命週期比較短,可以有效的節省內存資源。
大數據量的傳輸或保存不適合使用Session空間。

Cookie,是記錄用戶的Session信息,也可以記錄用戶的請求信息,也就是SessionID,來分辨哪一個用戶是否登陸過。在每次登陸時,
還會將Cookie發送回服務器端,Cookie是用來跟蹤Session的。

public void service(ServletRequest request,ServletResponse response){

String user = request.getParameter("user");
        String pass = request.getParameter("pass");
Cookie userCookie = new Cookie("user", user);
        userCookie.setMaxAge(60 * 60 * 24 * 365);//設置Cookie的最大有效期,秒爲單位
        Cookie passCookie = new Cookie("pass", pass);
        passCookie.setMaxAge(60 * 60 * 24 * 365);
        response.addCookie(userCookie);
        response.addCookie(passCookie);

}

 

 

=================================================================================


                               Servlet第四天     2007年6月26日

一、複習
1、連接池
2、MVC
3、cookie  

二、會話 session
Session是基於Cookie來跟蹤的,即:沒有Cookies的支持,Session是不能運行起來的。

Session對象用來解決客戶端發送多個請求時來用戶請求信息的存儲問題,但是他和ServletRequest對象是不同的,他會在有需要時創建,
但是他的生命週期會比請求對象要長。Session對象的生命週期也是有限制的,如果長時間的沒有訪問,就會銷燬掉Session對象,可以通
過Session對象的

setAttribute(String name, Object o) 和getAttribute(String name)來存取數據信息。Session是用戶級的對象。

Session是存在於服務器內存中的,用於存用戶多個請求的信息的;同時也要求客戶端發送個Session的標誌:SessionID (地址欄或封裝在
請求的Header中)。

getSession(true)就表示如果Session不存在就創建一個新的Session,並把Session的標識SessionID寫到Cookie中,如果存在就是用這個
Session。getSession(false)就是在Session不存在時不會創建新Session而是返回null。如果使用getSession()方法,就等同於getSession(true)。

注意:ServletRequest對象適用於傳輸大量的數據,因爲其生命週期比較短,可以有效的節省內存資源。
大數據量的傳輸或保存不適合使用Session空間。
用戶身份認證
登錄時,創建session
訪問資源頁面時,先判斷session是否存在
退出時清除session:session. invalidate(),接着可以將用戶引導到登錄頁面

IE中一個窗口代表一個會話,Mozilla firefox不一樣
多個窗口可通過Cookies來識別Seesion。

Sssion第二種跟蹤機制:URLRewriting
Response.sendRediret(Response.encodeRedirectURL(/serv-app/student/ctrl“))
把在地址欄後加上SessionID地址地址參數
out.println(”<a href=”+response.encodeURL(url)”
<form actioin=”response.encodeURL(url)”>
Forward也是encodeURL
特殊一個:Response.sendRedirect(response.encodeRedirectURL(url));
每一個URL都要加上sessionID,但它不能跨越靜態頁面。
所以一般默認針對Cookies可用編寫程序。

1、session.invalidate()   --- session被立即銷燬
   session.setMaxInactiveInterval(int interval)   --- 設置最大的超時時間,以秒爲單位
2、會話的空間不是系統自動創建的,是程序創建的
   request.getSession(false);    判斷請求中是否存在session,以確保服務中資源的保護  
  
三、重定向
產生新的請求,其中不包含原請求的session信息,只包含cookie信息

四、Session跟蹤機制
1、cookie機制
2、URL回寫機制:把sessionid綁定在地址欄中
   response.sendRedirect(response.encodeRedirectURL(url));  

  
五、Servlet過濾器(Filter)
應用:Sessioin logging encoding
過濾器是用於過濾Servlet的請求和響應,過濾器是存在於請求和被請求資源之間的。
過濾器就像當於一箇中間件,請求要經過過濾器,然後過濾器纔去掉用Servlet,Servlet的響應也會被過濾器截獲並作相應的處理。

Filter是一個接口,要寫一個自己的Filter就只能實現Filter接口。
Filter也有自己的生命週期,他的生命週期和Servlet比較相似,也是會先調用init()方法,然後再調用核心的處理過濾的方法doFilter(),這個方法中可定義了過濾規則,然後是

destory()方法銷燬Filter對象。

dofilter(ServletRequest request,ServletResponse response,FilterChain chain)
這個是過濾的核心方法,FilterChain的方法doFilter(ServletRequest request, ServletResponse response)也就是用過濾後的請求調用資源的方法,如果不寫這個方法,也就算

不會去調用相應的資源。

Filter的配置

Filter的配置和Servlet相似。
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>alan.filter.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/protected/*</url-pattern>
<!--這裏的url-pattern就是要過濾的Servlet的url-pattern-->
<dispatcher>request</dispatcher>
<dispatcher>forward</dispatcher>
<dispatcher>include</dispatcher>
<!--上面的三個是過濾的範圍-->
</filter-mapping>

CharArrayWriter類,是一個將數據保存在字符數組中的輸出流,我們可以使用它來構造一個PrintWriter對象,也就實現了向內存輸出。
CharArrayWriter類的toString()和toCharArray()方法就可以取得寫入內存中的數據。
注意:CharArrayWriter類是一個不會真正輸出的類,他的write()方法只會將內容寫入字符數組,而且這個字符數組是會自動增長的。


六、Servlet的url-pattern

url-pattern可以使用以下三種方式
1,確切路徑匹配,也就是給出確定的路徑 xxx/xxxx
2,模糊路徑匹配,也就是指給出一部分路徑,xxxx/*,他會匹配確定路徑,也就是xxxx/a 或者是xxxx/b都是可以匹配的
3,擴展名匹配,也就是會匹配擴展名,只要是擴展名相同就匹配,xxx.xxx *.xx

注意:擴展名匹配和確切路徑匹配不能放在一起使用,也就是不能寫成 xxxx/xxxx/xxx.xx,但是可以用
*.xxx。

ServletRequest對象的三個返回路徑的方法
getContextPath()獲得應用的路徑,用動態獲取應用路徑
getServletPath()獲得Servlet路徑,也就是form中的action,如果使用確切路徑那麼就會是這個Servlet配置的url-pattern。
getPathInfo()使用模糊路徑匹配時會返回匹配模糊部分。

注意:在html的form表單的action中,如果使用了擴展名匹配,一定要寫明/xxxxx/xxx.xx,不要寫成/xxxx/*.xx,在form的action中要儘量使用絕對路徑,也就是要用 應用

名/xxx.xx或者應用名/xxx。

SingleThreadModel接口
1) 如果希望禁止多線程訪問,可以讓Servlet使用SingleThreadModel接口:      
   public class YourServlet extends HttpServlet implements SingleThreadModel{       ...       }
2) 使用此接口,系統將保證不會存在多個請求線程同時訪問Servlet的單個實例。但是仍然需要同步對存儲在Servlet外部的類變量或共享字段的訪問。
3) 如Servlet頻繁被訪問,則Servlet訪問的同步將嚴重影響性能(延時)。

ServletRequest對象的生命週期就是在service()方法中,除了forward(...,...)方法將這個請求對象轉發給其他的Servlet。  


=================================================================================


                               Servlet第五天     2007年6月27日

一、監聽器
以下是3個Listener接口。
ServletRequestListener
HttpSessionListener
ServletContextListener
這三個監聽器接口,分別監聽Servlet中3種比較中要的對象的創建和銷燬。這三個接口中分別有監聽該對象創建和銷燬事件的方法,服務器本身就是事件源。

listener的配置
<listener>
<listener-class>alan.servlet.listener.AlanContextListener</listener-class>
        <!--listener-class也就是實現Listener接口的類-->
</listener>

Servlet中的重要對象(只針對應用)


                     數量                生命週期                  是否線程安全                          方法
-------------------------------------------------------------------------------------------------------------------------------------------                  


ServletContext        1                   (天)全局的                不安全                     setAttribute(String,Object) 全局屬性
                                   只有在應用關閉時才銷燬         需要加同步訪問                 Object getAttribute(String) 任何Session
                                                                                                 void removeAttibute(String) 都可以取到  
-------------------------------------------------------------------------------------------------------------------------------------------                  


HttpSession        和用戶的               (分/小時)局部的           不安全                     setAttribute(String,Object) 存儲用戶級
                   數量相同         只在有效時間內存在             可以不加同步訪問              Object getAttribute(String) 的屬性
                                                             synchronized(session){......}       void removeAttibute(String)
-------------------------------------------------------------------------------------------------------------------------------------------                  


ServletRequest       多個                 (秒)局部的               線程安全                    setAttribute(String,Object) 可以傳遞
(HttpServletRequest)                 只在servic()和doGet()                                       Object getAttribute(String) 大量信息
                                      doPost()中存在                                             void removeAttibute(String) 只使用一次
-------------------------------------------------------------------------------------------------------------------------------------------        

二、作用
1、主要對ServletContext、HttpSession、ServletRequest等對象行爲的監聽
2、必須要實現一個或多個listener interface
3、有兩類監聽器:聲明週期監聽器 ServletContextListener             HttpSessionListener              ServletRequestListener (2.4版本之後)
                 對象狀態監聽器 ServletContextAttributeListener    HttpSessionAttributeListener     ServletRequestAttributeListener
4、ServletContextListener中不能取得請求中的參數                
                
                
========================   ====       ====================  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章