Servlet 方面
75
、說一說
Servlet
的生命周期
?
答
:
servlet
有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由
javax.servlet.Servlet
接口的
init,service
和
destroy
方法表達。
Servlet
被服務器實例化后,容器運行其
init
方法,請求到達時運行其
service
方法,
service
方法自動派遣運行與請求對應的
doXXX
方法(
doGet
,
doPost
)等,當服務器決定將實例銷毀的時候調用其
destroy
方法。
與
cgi
的區別在于
servlet
處于服務器進程中,它通過多線程方式運行其
service
方法,一個實例可以服務于多個請求,并且其實例一般不會銷毀,而
CGI
對每個請求都產生新的進程,服務完成后就銷毀,所以效率上低于
servlet
。
76
、
JAVA SERVLET API
中
forward()
與
redirect()
的區別?
答
:
前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址;后者則是完全的跳轉,瀏覽器將會得到跳轉的地址,并重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用
forward()
方法,并且,這樣也有助于隱藏實際的鏈接。在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用
sendRedirect()
方法。
77
、
Servlet
的基本架構
答:
public class ServletName extends HttpServlet {
? public void doPost(HttpServletRequest request, HttpServletResponse response) throws
????? ServletException, IOException? {
????? }
? public void doGet(HttpServletRequest request, HttpServletResponse response) throws
????? ServletException, IOException? {
????? }
}
78
、什么情況下調用
doGet()
和
doPost()
?
答:
Jsp
頁面中的
form
標簽里的
method
屬性為
get
時調用
doGet()
,為
post
時調用
doPost()
。
79
、
servlet
的生命周期
答:
web
容器加載
servlet
,生命周期開始。通過調用
servlet
的
init()
方法進行
servlet
的初始化。通過調用
service()
方法實現,根據請求的不同調用不同的
do***()
方法。結束服務,
web
容器調用
servlet
的
destroy()
方法。
80
、如何現實
servlet
的單線程模式
答:
<%@?page?isThreadSafe="false"%>
81
、頁面間對象傳遞的方法
答:
request
,
session
,
application
,
cookie
等
82
、
JSP
和
Servlet
有哪些相同點和不同點,他們之間的聯系是什么?
?
答:
JSP
是
Servlet
技術的擴展,本質上是
Servlet
的簡易方式,更強調應用的外表表達。
JSP
編譯后是
"
類
servlet"
。
Servlet
和
JSP
最主要的不同點在于,
Servlet
的應用邏輯是在
Java
文件中,并且完全從表示層中的
HTML
里分離開來。而
JSP
的情況是
Java
和
HTML
可以組合成一個擴展名為
.jsp
的文件。
JSP
側重于視圖,
Servlet
主要用于控制邏輯。
83
、四種會話跟蹤技術
答:
會話作用域
ServletsJSP?
頁面描述
page
否是代表與一個頁面相關的對象和屬性。一個頁面由一個編譯好的
?Java?servlet?
類(可以帶有任何的
?include?
指令,但是沒有
?include?
動作)表示。這既包括
?servlet?
又包括被編譯成
?servlet?
的
?JSP?
頁面
request
是是代表與
?Web?
客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個
?Web?
組件(由于
?forward?
指令和
?include?
動作的關系)
session
是是代表與用于某個
?Web?
客戶機的一個用戶體驗相關的對象和屬性。一個
?Web?
會話可以也經常會跨越多個客戶機請求
application
是是代表與整個
?Web?
應用程序相關的對象和屬性。這實質上是跨越整個
?Web?
應用程序,包括多個頁面、請求和會話的一個全局作用域
84
、
Request
對象的主要方法
答:
setAttribute(String?name,Object)
:設置名字為
name
的
request
的參數值
getAttribute(String?name)
:返回由
name
指定的屬性值
getAttributeNames()
:返回
request
對象所有屬性的名字集合,結果是一個枚舉的實例
getCookies()
:返回客戶端的所有
Cookie
對象,結果是一個
Cookie
數組
getCharacterEncoding()
:返回請求中的字符編碼方式
getContentLength()
:返回請求的
Body
的長度
getHeader(String?name)
:獲得
HTTP
協議定義的文件頭信息
getHeaders(String?name)
:返回指定名字的
request?Header
的所有值,結果是一個枚舉的實例
getHeaderNames()
:返回所以
request?Header
的名字,結果是一個枚舉的實例
getInputStream()
:返回請求的輸入流,用于獲得請求中的數據
getMethod()
:獲得客戶端向服務器端傳送數據的方法
getParameter(String?name)
:獲得客戶端傳送給服務器端的有
name
指定的參數值
getParameterNames()
:獲得客戶端傳送給服務器端的所有參數的名字,結果是一個枚舉的實例
getParameterValues(String?name)
:獲得有
name
指定的參數的所有值
getProtocol()
:獲取客戶端向服務器端傳送數據所依據的協議名稱
getQueryString()
:獲得查詢字符串
getRequestURI()
:獲取發出請求字符串的客戶端地址
getRemoteAddr()
:獲取客戶端的
IP
地址
getRemoteHost()
:獲取客戶端的名字
getSession([Boolean?create])
:返回和請求相關
Session
getServerName()
:獲取服務器的名字
getServletPath()
:獲取客戶端所請求的腳本文件的路徑
getServerPort()
:獲取服務器的端口號
removeAttribute(String?name)
:刪除請求中的一個屬性
85
、我們在
web
應用開發過程中經常遇到輸出某種編碼的字符,如
iso8859-1
等,如何輸出
一
個某種編碼的字符串?
答:
??Public?String?translate?(String?str)?{
????String?tempStr?=?"";
????try?{
??????tempStr?=?new?String(str.getBytes("ISO-8859-1"),?"GBK");
??????tempStr?=?tempStr.trim();
????}
????catch?(Exception?e)?{
??????System.err.println(e.getMessage());
????}
????return?tempStr;
??}
86
、
Servlet
執行時一般實現哪幾個方法?
答:
public?void?init(ServletConfig?config)
public?ServletConfig?getServletConfig()
public?String?getServletInfo()
public?void?service(ServletRequest?request,ServletResponse?response)
public?void?destroy()
|