Servlet技術:
1. 什么是servlet?
Servlet是一個java類,是一個提供基于協議請求和響應的java類;
2. 它的生命周期
1. 啟動服務器時就會實例化并加載servlet實例;
2. 進行初始化:自動調用init(ServletConfig servletConfig)方法;
3. Servlet就緒:調用service(HttpServletRequest request,HttpServletResponse response)方法(其 中 service 就是dopost()或doget()方法),這是客戶提交時,自動調用的;
4. Servlet銷毀:自動調用調用distory() ;
注意:在實例化并加載servlet后,步驟二和四只調用一次,而步驟三,是在每次客戶端發出請求時都調用;
3. 怎樣部署一個servlet?
Servlet類是必須在web.xml中注冊才能使用的,例如,我有一個MyServlet類:
必須在web.xml中注冊:
<web-app>
//-----------------------Servlet聲明----------------------
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>servletPakage.MyServlet</servlet-class>
</servlet>
//------------------------Servlet注冊(鏡像)---------------
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>myServletURL</ url-pattern >
</servlet-mapping>
</web-app>
這樣你在提交時的Url地址就是/myServletURL了;
4. 什么是service(HttpServletRequest request,HttpServletResponse response)方法?
其中service(HttpServletRequest request,HttpServletResponse response)方法包括兩種:
1. doget(HttpServletRequest request,HttpServletResponse response)方法:
這種方法被稱為顯式提交方法,主要原因是它的得到的參數放在url中,可以被看到,所以稱為顯示提 交;
例如:有個表單:
<form action=”/myServletURL?name=todd” method=”get”>
</form>
這種方法其request獲得的參數就是你看到的name=todd;
例如:String s=request.getParameter(“name”);
其結果s=”todd”;
2. dopost(HttpServletRequest request,HttpServletResponse response)方法:
這種方法被稱為隱式提交方法,它的參數不會在url里得到,而是在請求數據體得到參數;
例如:有個表單:
<form action=”/myServletURL” method=”post”>
<input type=”text” name=”name” value=”todd”>
</form>
這種方法其request獲得的參數就是表單體的name=todd;
例如:String s=request.getParameter(“name”);
其結果s=”todd”;
5. 什么是ServletContext?
ServletContext是一個接口,是WebApplication的視圖,它的作用域時Application,它能訪問Application中的初始化參數和屬性,它不局限域一個Servlet,它屬于整個Application;
ServletContext的初始化參數:
在web.xml中:
<web-app>
<context-param>
<param-name>myBlog</param-name>
<param-value>www.tkk7.com/todd841026</param-value>
</context-param>
</web-app>
這樣在application中任意一個Servlet中可以得到這個參數,
例如:ServletContext sc = getServletContext ();
String s = sc.getInitParameter(“myBlog”);
那么結果s就是”www.tkk7.com/todd841026”
6. 什么是ServletConfig?
是單獨的Servlet初始化配置;
例如:在web.xml中
<web-app>
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>servletPakage.MyServlet</servlet-class>
</servlet>
<init-param>
<param-name>cache</param-name>
<param-value>off</param-value>
</init-param>
</web-app>
在這個Servlet中:ServletConfig sc = getServletConfig();
String s = sc.getInitParameter(“cache”);
那么結果s就是”off”;
7. Servlet怎樣處理多線程
在默認的情況下,單個Servlet實例是可以處理多個并發請求的,所以要考慮到多線程的共享同一對象的問題,例如:
//做個Servlet中產生了多少個object對象一個變量的例子
Private int count = 0 ;
Public void dopost(HttpServletRequest request,HttpServletResponse response){
Object object = new Object() ;
count++ ;
System.out.println(“count = ” + count) ;
}
當有5個用戶提交數據時,因為Servlet是處理多線程的,所以可能出現,第四個用戶的程序已經執行了count++,而第五個用戶剛執行完Object object = new Object() ,就會出現數據不一致性,因為當前有5個object對象,但是count卻是4;
解決方案一:
Private boolean flag = false ;
Private int count = 0 ;
Public void dopost(HttpServletRequest request,HttpServletResponse response){
synchronized(flag){
Object object = new Object() ;
count++ ;
}
System.out.println(“count = ” + count) ;
}
用同步程序塊解決多線程的問題,這樣在同一時刻就只能有一個訪問該程序塊了;
解決方案二:
Private int count = 0 ;
Public void dopost(HttpServletRequest request,HttpServletResponse response)
Implements SingleThreadModel{
Object object = new Object() ;
count++ ;
System.out.println(“count = ” + count) ;
}
實現SingleThreadModel接口,可以解決多線程問題;
8. 什么是servlet過濾器?
也是一個java類,只是它實現了Filter這個接口;
9. servlet過濾器的生命周期;
初始化:自動調用init(FilterConfig config)方法
執行:自動調用doFilter()方法;
銷毀:自動調用destory()方法;
10. servlet過濾器有什么用途?
個人認為目前自己用到的Servlet過濾器的主要用途:是安全性檢查
當然過濾器在Servlet之前也可以修改請求,要是在Servlet之后,也可以修改響應;
11. servlet過濾器怎樣部署?
在web.xml中:
<web-app>
<filter>
<filter-name>myFilter</filter-name>
<filter-class>filterPage.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/Todd/*</url-pattern>
</filter-mapping>
</web-app>
這樣就是說要訪問WEB-INF下的Todd包下的jsp或Servlet的話,就必須要先通過myFilter這個類;