前天去面試,遇到一個搞技術的面試官。問了好多問題,好多沒答上來,不是不會而是掌握的不夠紮實,沒有進行歸納和總結。最典型的是集合類的階層,Jsp內建對象之間的關係。這些問題不能說不會,而是不夠紮實,沒有站在一個系統的高度來看這些問題。雖然面試的不成功,但收穫的還是挺大的。使我看到了自己學的還是很不夠,很多東西要學習。面試主要是搞Web開發,使用三大架構:Struts,Spring,Hibernate。這半年都在搞安全了,搞的也是傳統型應用程式,沒有做Web開發,Java主要的優勢還在於Web開發。面試回來後打算把三打架構好好看看。我相信我的學習能力,遺憾沒有在面試官面前表現出來。下面是我照著張孝祥老師編寫的《深入體會Javaweb開發內幕》寫的。
Servelt就是由兩個包組成javax.servlet和javax.servelt.http
前者裝是基本的servet類,後者是與http有關的類。後者中大部分類都實現了前者的類。我們在寫Servelt時很多都直接使用後者中的類。
GenericServlet實現了Servlet和ServletConfig介面。
HttpServlet繼承了GenericServlet類
我們在寫Servlet時繼承HttpServlet。
ServletConfig對象可以獲得Servlet的配置參數:如Web.xml中設定的初始化參數等通過Servlet.getServletConfig()獲得ServletConfig對象。
ServletConfig對象中包括對ServletContext的引用。
ServletContext是Web應用程式中所有的Servelt共用,通過getServletContext()獲得serveltContext對象。它的範圍是整個Web應用程式。所以它可以訪問資源檔,可以使用相對路徑。可以獲得虛擬路徑所映射的本地路徑。
HttpServletResponse是ServletResponse子介面,用於響應請求。代表用於Http協議的響應訊息對象。可以產生響應狀態行、構造響應訊息頭(設定字元集編碼)、建立響應本文等。
cookie的增加使用方法:HttpServletResponse.addCookie(Cookie)。
Servelt中文輸出問題可以用下面語句解決:
response.setCharacterEncoding("GB2312");
response.setContentType("text/html;GB2312");
response.setLocale(new java.util.Locale("zh","CN"));
讓瀏覽器定時重新整理網頁或跳轉至其他頁面
response.setHeader("Refresh","2");
response.setHeader("Refresh","2;URL=http://www.it315.org");
禁止緩衝當前文檔的內容可以用
response.setDateHeader("Expires",0);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
建立響應本文:response.getOutputStream()和getWriter()
分別得到ServletOutputStream和PrintWriter對象,可以看到一個是位元組流,一個是字元流。
請求重新導向和請求轉寄:
請求重新導向用RequestDispatcher.forward(),請求轉寄用HttpServletResponse.sendRedirect()。 RequestDispatcher通過ServletContext介面中的getRequestDispatcher方法獲得。
區別在於重新導向是調用別的Servlet來處理,對使用者是透明的,而sendRedirect() 是將請求轉寄給到別的頁面。重新導向只能在同一個Web應用程式內資源內轉寄請求,而sendRedirect()可以在任意頁面間轉寄。
區別RequestDispatcher.indlude()和RequestDispatcher.forward()。
indlude被調用者不能改變響應訊息的狀態代碼和訊息頭。forward方法中調用者和被調用者之間共用相同的 request對象和response對象。
RequestDispatcher.forward和HttpServletResponse.sendRedirect方法在調用它們之前都不能有緩衝區輸出到用戶端。緩衝區的內容會被清空。
HttpServletRequest是ServletRequest的子介面,它代表請求訊息。
通過它的方法可以獲得請求行的相關資訊、網路連接資訊、要求標頭資訊、傳遞的參數等。
請求行:對於如下請求:
http://localhost:8080/it315/controller/one.jsp?param1=abc
下面方法可以得到如下資訊:
request.getMethod() :GET
request.getRequestURI() :/it315/controller/one.jsp
request.getQueryString():param1=abc
request.getProtocol():http/1.1
request.getContextPath:/it315
request.getPathInfo:/one.jsp
request.getPathTranslated:C:\tomcat-5.5.4\webapps\it315\one.jsp
request.getServletPath: /controller
網路連接就是些IP地址,連接埠什麼的,不看了。
要求標頭資訊:可以獲得指定名稱的頭欄位的值,日期,Content-Type頭欄位,請求訊息的實體部分的字元集編碼等。
防盜鏈技術:
防止被人直接超連結內容,判斷要求標頭referer欄位是否來自本站。
擷取請求參數:getParameter(String)
擷取請求訊息實體內容:與response對應,有擷取請求訊息實體內容的方法。request.getInputStream()和getReader()方法。分別表示位元組流和字元流
利用請求域傳遞屬性資訊。方法是request.setAttribute()。然後將請求重新導向forward到別的處理模組。
會話和狀態管理
有兩種方式Cookie和Session。Cookie儲存在用戶端,Session儲存在服務端。形象的比喻是Cookie是商場發放的優惠卡,優惠卡上記錄優惠政策。Session比喻為病曆卡,醫院為每個病人保留病曆檔案。病曆卡上只填寫了卡號。
Cookie是一個類,它通過new Cookie(String name,String value)執行個體化。request.getCookies()返回所有的Cookie。response.addCookie(Cookie cookie)。HttpSession是介面。Request.getSession()的到Session對象。
JSP
Jsp內建對象與Servlet中的類對應關係
application----> ServletContext
config -----> ServletConfig
session ----->HttpSession
request ----->HttpServletRequest
response ----->HttpServletResponse
page是Jsp被翻譯成Servlet對象自身
out是JspWriter的執行個體,調用ServletResponse.getWriter()的到的PrintWriter將out對象的緩衝區內容寫入到Servlet引擎提供的緩衝區中。
pageContext是javax.servlet.jsp.JspContext的子類,pageContext對象封裝了當前JSP頁面的運行資訊,它提供了返回JSP頁面的其他內建對象的方法。
由servelt中的關係,可以得到內建對象之間的關係。通過config可以獲得application,通過session可以獲得application。通過request可以獲得session。通過pageContext可以獲得所有的內建對象。