雖然servlet可以用來擴展任何允許Java的服務(wù)器功能,但它最常用的擴展Web服務(wù)器,為CGI腳本的提供強大高效的替代品。
servlet是普通服務(wù)器的擴展,即一個可被動態(tài)載入以提高服務(wù)器功能的Java類。servlet多用于Web服務(wù)器以替CGI腳本。
運行servlet,需要一個servletrunner(或稱servlet容器,有時叫servlet引擎,如tomcat等)。
servlet的優(yōu)勢包括:可移植,功能強大,高效,耐久,安全,簡潔,集成化,可擴展性,靈活性。
第二章 HTTPservlet基礎(chǔ)
HelloWorld程序:
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {//擴展HttpServlet類
public voiddoGet(HttpServletRequest request, HttpServletResponseresponse)
throws IOException, ServletException //重載doGet()方法
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>HelloWorld</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>HelloWorld</h1>");
out.println("</body>");
out.println("</html>");
}
}
HttpServletRequest代表了客戶端請求。HttpServletResponse代表了servlet的響應(yīng)。
PrintWriter將Java的Unicode字符轉(zhuǎn)換為區(qū)域(locale)特有的編碼。
運行HelloWorld.java
1.首先將源碼放在server_root/web_apps/test/WEB-INF/classes目錄下(server_roots是安裝tomcat的目錄)
2.用javac將其編譯。首先得確保servletAPI在目錄中,有效的方法是在環(huán)境變量ClassPath中添加屬性"server_rootcommonlibservlet-api.jar;"。
3.啟動tomcat服務(wù)器。(默認根地址是:http://localhost:8080,8080為監(jiān)聽端口)
4.配置web.xml。在server_root/web_apps/test/WEB-INF目錄下添加web.xml文件,此文件的內(nèi)容為:
<?xml version="1.0"encoding="ISO-8859-1"?>
<web-appxmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
5.訪問地址http://localhost:8080/test/hello,即能運行程序。
處理表單數(shù)據(jù)
例如:
HTML表單含有<INPUT TYPE=TEXTNAME="name">
在servlet中得到name的信息可以通過 String name =req.getParameter("name");
WEB-INF目錄
WEB-INF目錄很特殊。該目錄中的文件不直接為客戶端服務(wù);它們?yōu)榉?wù)器保存Java類和配置信息。這個目錄類似JAR文件的META-INF目錄:包含存檔文件內(nèi)容信息。
web.xml文件十一個配置描述富。這個文件包含本地服務(wù)的配置信息。它的結(jié)構(gòu)本身并不是重點。重點在于該文件可以在與服務(wù)器無關(guān)的方式下來進行配置信息的確定。
第三章servlet的生命周期
servlet的選擇
servlet容器唯一必須嚴格遵守的規(guī)則就是以下生命周期的約定:
1.生成并初始化servlet。
2.除了客戶服務(wù)呼叫。
3.卸載servlet并進行無用存儲單元收集。
實例的持續(xù)性
當servlet的代碼被載入時,服務(wù)器生成一個實例,這個實例處理該servlet的所有請求。它在三個方面提高了性能:
1.它使內(nèi)存消耗變少
2.它節(jié)省了生成一個servlet對象所需要的資源。
3.它能夠保證持續(xù)性。
init和destory
服務(wù)器在構(gòu)造完servlet實例和處理任何請求之前運行servlet的init()方法,而在servlet不用服務(wù)了或所有掛起的請求處理完畢或超時使調(diào)用destory()方法。
init()方法用于servlet的初始化:產(chǎn)生或載入servlet處理請求使需要用到的對象。一個servlet的初始化參數(shù)可以配置在web.xml中。
在配置描述符中設(shè)置初始化參數(shù)
<web-app>
<servlet>
<servlet-name>
counter
</servlet-name>
<servlet-class>
InitCounter
</servlet-class>
<init-param>
<param-name>
initial
</param-name>
<param-value>
1000
</param-value>
<description>
The initial value for the counter<!-- optional -->
</description>
</init-param>
</servlet>
<web-app>
在destroy()方法中,一個servlet應(yīng)釋放它所占有的無法回收的所有存儲單元。destroy()方法也可用于寫所有未保存的信息,或為了保持持續(xù)性而要寫入init()方法中以供下次初始化時讀入的信息。
一個帶初始化參數(shù)的計數(shù)器示例
public void init() throws ServletException{
Stringinitial = getInitParameter("initial");
try {
count = Integer.parseInt(initial);
}
catch(NumberFormatException e) {
count = 0;
}
}
單線程模式
根據(jù)Servlet API文檔,一個載入了SingelThreadModelservlet的服務(wù)器必須保證在servlet的service方法中沒有同時執(zhí)行的兩個線程。即每個線程使用池中的一個實例。
使用方法是:
public class SingleThreadConnection extends HttpServlet
implements SingleThreadModel
{ ... }
后臺處理
任何一個由servlet開始的線程能在響應(yīng)發(fā)送出去之后繼續(xù)執(zhí)行。
啟動時載入
可以配置servlet的Web應(yīng)用程序,使服務(wù)器一開始就載入該程序。這可以通過將<load-on-startup>標簽添加到配置描述符中的<servlet>中來實現(xiàn),例如
<servlet>
<servlet-name>
ps
</servlet-name>
<servlet-class>
PrimeSearcher
</servlet-class>
<load-on-startup/>
</servlet>
在<load-on-startup>中可以包含一個正整數(shù),以表明這個servlet和其他servlet在載入是的順序。servlet按數(shù)字從小到大被載入。帶有負數(shù)或非整數(shù)的servlet可在啟動的任何時刻被載入,取決于服務(wù)器規(guī)定的順序。
第四章獲取信息
CGI環(huán)境變量和對應(yīng)的servlet方法
---------------------------------------------------------------------------
CGI環(huán)境變量|HTTP servlet方法
---------------------------------------------------------------------------
SERVER_NAME|req.getServerName()
---------------------------------------------------------------------------
SERVER_SOFTWARE|req.getServletContext().getServerInfo()
---------------------------------------------------------------------------
SERVER_PROTOCOL|req.getProtocol()
---------------------------------------------------------------------------
SERVER_PORT|req.getServerPort()
---------------------------------------------------------------------------
REQUEST_METHOD|req.getMethod()
---------------------------------------------------------------------------
PATH_INFO|req.getPathInfo()
---------------------------------------------------------------------------
PATH_TRANSLATED|req.getPathTranslated()
---------------------------------------------------------------------------
SCRIPT_NAME|req.getServletPath()
---------------------------------------------------------------------------
DOCUMENT_ROOT|req.getServletContext().getRealPath("/")
---------------------------------------------------------------------------
QUERY_STRING|req.getQueryString()
---------------------------------------------------------------------------
REMOTE_HOST|req.getRemoteHost()
---------------------------------------------------------------------------
REMOTE_ADDR|req.getRemoteAddr()
---------------------------------------------------------------------------
AUTH_TYPE|req.getAuthType()
---------------------------------------------------------------------------
REMOTE_USER|req.getRemoteUser()
---------------------------------------------------------------------------
CONTENT_TYPE|req.getContentType()
---------------------------------------------------------------------------
CONTENT_LENGTH|req.getContentLength()
![[轉(zhuǎn)載]別人的SERVERLET筆記 公眾號轉(zhuǎn)載別人的文章](http://img.aihuau.com/images/02111102/02051829t017e01583b9a036607.png)
---------------------------------------------------------------------------
HTTP_ACCEPT|req.getHeader("Accept")
---------------------------------------------------------------------------
HTTP_USER_AGENT|req.getHeader("User-Agent")
---------------------------------------------------------------------------
HTTP_REFERER|req.getHeader("Referer")
---------------------------------------------------------------------------
取得servlet初始化參數(shù)
public String servletConfig.getInitParameter(String name)
取得servlet初始化參數(shù)名
public Enumeration servletConfig.getInitParameterNames()
這個方法以列舉字符串的方式返回servlet的所有初始化參數(shù),如果沒有參數(shù)則返回空隊列。
取得servlet名稱
public String ServletConfig.getServletName()
如果該servlet未注冊,則該方法返回servlet類名。
確定servlet版本
public int ServletContext.getMajorVersion()
public int ServletContext.getMinorVersion()
如果版本是2.1,則MajorVersion返回2,MinorVersion返回1
第五章 發(fā)送HTML信息
發(fā)送自定義響應(yīng)
設(shè)置響應(yīng)的內(nèi)容類型: public void ServletResponse.setContentType(Stringtype)
重定向請求
res.setStatus(res.SC_MOVED_TEMPORARILY); 設(shè)置狀態(tài)碼以表示重定向開始
res.setHeader("Location",site); 給出了行的位置
也可以簡化為
res.sendRedirect(site);
配置錯誤頁
<web-app>
<error-page>
<error-code>
400
</error-code>
<location>
/400.html
</location>
</error-page>
<error-page>
<error-code>
404
</error-code>
<location>
/404.html
</location>
</error-page>
</web-app>
異常
servlet只能將IOException、ServletException、RuntimeException的子類中的錯誤傳給服務(wù)器
ServletException
ServletException是專門為servlet設(shè)計的java.lang.Exception的子類。這個類在javax.servlet包中定義。這個異常由servlet拋出,表明一個通常的servlet錯誤。
javax.servlet.servletException()
javax.servlet.servletException(String msg)
ServletException可支持一個“根本原因”的Throwable對象。這使ServletException成為任何類型異常和錯誤的包裝。
javax.servlet.servletException(Throwable rootCause)
javax.servlet.servletException(String msg, ThrowablerootCause)
使用這樣的功能可以傳遞任何底層的錯誤和異常:
try {
thread.sleep(60000);
}
catch (InterruptedException e) {
throw newservletException(e);//包括所有異常
}
服務(wù)器可以通過調(diào)用getRootCause()檢索和檢查底層異常、堆棧軌跡等:
public Throwable ServletException.getRootCause()
如果沒有嵌套的異常返回null。
配置異常網(wǎng)頁
<error-page>
<exception-type>
javax.servlet.ServletException
</exception-type>
<location>
/servlet/ErrorDisplay
</location>
</error-page>
第六章會話跟蹤
使用cookie
servletAPI提供了javax.servlet.http.Cookie類來運行cookie。cookie的HTTP首部有關(guān)細節(jié)處理由ServletAPI進行??梢杂肅ookie構(gòu)造函數(shù)來生成一個cookie:
public Cookie(String name, String value)
servlet可通過把一個cookie對象傳給HttpServletResponse的AddCookie()方法來向客戶端發(fā)送一個cookie。
public void HttpServletResponse.addCookie(Cookie cookie)
例:
Cookie cookie = new Cookie("ID","123");
res.addCookie(cookie);
servlet通過調(diào)用HttpServletRequest()的getCookies()方法來檢索cookie。
public Cookie[] HttpServletRequest.getCookies()
取得cookie的代碼如下:
Cookie[] cookies = req.getCookies();
if(cookies != null) {
for(inti=0;i<cookies.length;i++)
{
String name = cookies[i].getName();
String value = cookies[i].getValue();
}
}
設(shè)置cookie的版本
public void Cookie.setVersion(int v)
指定區(qū)域限制模式
public void Cookie.setDomain(String pattern)
在cookie結(jié)束前以秒數(shù)指定最大壽命
public void Cookie.setMaxAge(int expiry)
指定cookie路徑,這個路徑應(yīng)是cookie發(fā)送目標URL的子集
public void Cookie.setPath(String uri)
表示cookie是否通過安全通道發(fā)送,例如SSL,默認為false
public void Cookie.setSecure(boolean flag)
設(shè)置cookie的注釋字段。版本0的cookie不支持這項內(nèi)容
public void Cookie.setComment(String comment)
為cookie指定新值
public void Cookie.setValue(String newValue)
會話跟蹤API
servlet使用它的請求對象的getSession()方法來檢索現(xiàn)有的HttpSession對象:
public HttpSession HttpServletRequest.getSession(booleancreate)
這個方法返回作出請求的用戶關(guān)聯(lián)的當前對話。
getSession()必須在響應(yīng)發(fā)送前被調(diào)用
向HttpSession對象添加數(shù)據(jù):
public void HttpSession.setAttribute(String name, Objectvalue)
檢索會話對象:
public Object HttpSession.getAttribute(String name)
取得綁定在會話上所有的對象名:
public Enumeration HttpSession.getAttributeNames()
從對話中刪除某一對象:
public void HttpSession.removeAttribute(String name)
設(shè)定會話的超時值:
public void HttpSession.setMaxInactiveInterval(int secs)
返回當前超時值:
public int HttpSession.getMaxInactiveInterval()
判斷是否為新會話:
public boolean HttpSession.isNew()
立即結(jié)束會話:
public void HttpSession.invalidate()
返回會話生成的時間:
public long HttpSession.getCreationTime()
返回客戶端上次發(fā)送請求的時間:
public long HttpSession.getLastAccessedTime()
取得會話的ID:
public String HttpSession.getId()
愛華網(wǎng)



