javascript
《Head First Servlets JSP(中文版)》书摘
這本書不錯,正在看。
文章轉自:http://gemini.iteye.com/blog/81613
一直覺得自己Servlet的基礎還有待加強,所以利用5.1七天假搞了本《Head First Servlets & JSP(中文版)》重新補一下基礎,看的過程中摘錄了一些知識點,羅列如下(括號中為知識點所在的頁號):
第4章 作為servlet:請求和響應
★ 每個請求都在一個單獨的線程中運行!
?? 容器運行多個線程來處理對一個servlet的多個請求。
?? 對應每個客戶請求,容器會生成一對新的HttpServletRequest和HttpServletResponse對象。
?? 任何特定servlet類都只有一個實例。(101)
★ 不要在servlet的構造方法中放任何東西!
?? 初始化工作應放在init()方法中。
?? servlet的構造方法只是讓它成為一個普通的對象,容器調用它的init()方法后,它才成為了一個servlet。
?? init()方法使servlet可以訪問ServletConfig和ServletContext對象。(103)
★ 每個servlet有一個ServletConfig對象,每個Web應用有一個ServletContext。(104)
★ HttpServletRequest和HttpServletResponse接口由容器來實現。
?? 具體怎么實現的不用我們操心。(107)
★ HTTP請求方法確定究竟是運行doGet()還是doPost()。
?? 客戶的請求總是包括一個特定的HTTP方法。如果這個HTTP方法是GET,service()方法就會調用doGet()。如果這個HTTP方法是POST,service()方法就會調用doPost()。
?? 當然,還有些其它的HTTP方法,包括HEAD、TRACE、OPTIONS、PUT、DELETE和CONNECT,但對于servlet開發人員,這些方法很少用到。(108)
★ GET和POST的區別除了有參數數據大小、安全性和書簽問題外,還有請求是否是冪等的問題。
?? GET請求本質上講(根據HTTP規范)是冪等的。它們應當能多次而不會對服務器產生任何副作用。GET請求不應該修改服務器上的任何東西,但是你也可以寫一個非冪等的doGet()方法(不過這是很糟糕的做法)。
?? POST本質上講不是冪等的,所以要由你來適當地設計和編寫代碼,如果客戶錯誤地把一個請求發送了兩次,你也能正確地加以處理。(111)
★ 表單的默認方法是GET。(118)
★ HttpServletRequest的getServerPort()、getLocalPort()和getRemotePort()很容易搞混!
?? 如果是一個servlet請求,就意味著客戶是遠程的,所以getRemotePort()是指“得到客戶的端口”。
?? getServerPort()說“請求原來發送到哪個端口?”,getLocalPort()則是說“請求最后發送到哪個端口?”。盡管請求要發送到一個端口(服務器所監聽的端口),但是服務器會為每個線程找一個不同的本地端口。(123)
★ 對于輸出,你有兩個選擇:字符或者字節。
?? ServletResponse接口只提供了兩個可以選擇的流:ServletOutputStream用于輸出字節,PrintWriter用于輸出字符數據。(132)
★ setHeader()和addHeader()的區別
?? 如果響應中還沒有某個首部(方法的第一個參數),setHeader()和addHeader()就會增加一個首部和相應的值。
?? 二者的區別是,如果有這樣一個首部,setHeader()會覆蓋現有的值,addHeader()會增加另外一個值(addHeader()的API DOC中提到:This method allows response headers to have multiple values)。(133)
?
第5章 作為Web應用:屬性和監聽者
★ 覆蓋init()方法
?? 容器調用的是init(ServletConfig)方法,而init(ServletConfig)方法會調用無參數的init()方法,所以如果需要覆蓋init()方法,只需覆蓋無參數的版本就行了。(151)
★ 要把初始化參數認為是部署時常量!
?? 可以在運行時得到這些初始化參數,但是不能設置。根本沒有setInitParameter()。(160)
★ 上下文屬性和會話屬性都不是線程安全的。
?? 可以對上下文或會話同步來保護它們的屬性。
?? servlet的實例變量也不是線程安全的,所以一般servlet中不要放實例變量。
?? 只有請求屬性和servlet服務方法中的局部變量是線程安全的。(192-202)
★ 如果已經提交了響應,就不能再轉發請求或重定向了!(205)
?
第6章 會話管理
★ 會話有3種死法:超時;調用會話對象的invalidate()方法;應用結束。
?? 在web.xml中指定超時是以分為單位,而在程序中調用會話對象的setMaxInactiveInterval()方法設置超時是以秒為單位!(243)
★ cookie.setMaxAge(-1)表示瀏覽器退出時cookie就會消失。
?? 而session.setMaxInactiveInterval(負數)表示session永遠不會到期。(249)
★ HttpSessionBindingListener不用在web.xml中注冊。
?? 如果一個類實現了HttpSessionBindingListener,當這個類的一個實例增加到一個會話或從會話刪除時,容器就會調用事件處理回調方法(valueBound()和valueUnbound())。(254)
★ 在分布式Web應用中,除了HttpSession對象外,所有其它對象都會在另一個VM上復制!
?? 會話對象不會復制,而只是移動。
?? 當會話對象從一個VM移動到另一個VM時,如果某個會話屬性不是Serializable(或屬性對象的某個實例變量不是Serializable),可 以讓屬性對象類實現HttpSessionActivationListener,并使用激活/鈍化回調方法來解決會話屬性的串行化問題。 (255-258)
?
第7章 使用JSP
★ JSP元素:
?? scriptlet: <% %>??
?? 表達式:??? <%= %>
?? 聲明:????? <%! %>
?? 指令:????? <%@ %>
?? 注釋:????? <%-- --%>
?? 動作:????? 標準動作如<jsp:include>,其它動作如<c:set>
?? EL表達式:? ${}???? (286,292,302,321)
★ JSP指令有3種:page、include和taglib。(285)
★ JSP隱式對象:
?????????? out --- JspWriter
?? pageContext --- PageContext (封裝了其它隱式對象,可以得到其它隱式對象的引用)
?????? request --- HttpServletRequest
????? response --- HttpServletResponse
?????? session --- HttpSession
?? application --- ServletContext
??????? config --- ServletConfig
???? exception --- JspException (只有指定為“錯誤頁面”的頁面才能使用)
????????? page --- Object???? (296)
★ 容器將JSP轉換成一個servlet,這個servlet實現了HttpJspPage接口。
?? 這個servlet中有3個關鍵方法:
?? jspInit() -- 這個方法在servlet的init()方法中調用。可以覆蓋jspInit()。
?? jspDestroy() -- 這個方法在servlet的destroy()方法中調用。可以覆蓋jspDestroy()。
?? _jspService() -- 這個方法在servlet的service()方法中調用。不能覆蓋_jspService()。(303)
★ 在JSP頁面中禁用scriptlet或EL表達式:
?? 禁用scriptlet:在web.xml中設置<scripting-invalid>。
?? 禁用EL表達式:在web.xml中設置<el-ignored>或在JSP頁面中設置page指令的isELIgnored屬性。(319-320)
?
第8章 無腳本的JSP
★ EL隱式對象:
?? pageScope
?? requestScope
?? sessionScope
?? applicationScope?? (這4個是作用域屬性的Map)
?? param
?? paramValues??????? (這2個是請求參數的Map)
?? header
?? headerValues?????? (這2個是請求首部的Map)
?? cookie???????????? (cookie的Map)
?? initParam????????? (上下文初始化參數的Map)
?? pageContext??????? (pageContext對象的實際引用,不是Map)
?? 除了pageContext外,其它都是Map。(381)
★ EL運算符和保留字:
?? 算術運算符:
???? 加法:?? +
???? 減法:?? -
???? 乘法:?? *
???? 除法:?? /和div
???? 取模:?? %和mod
?? 邏輯運算符:
???? 與:?? &&和and
???? 或:?? ||和or
???? 非:??? !和not
?? 關系運算符:
???? 等于:???? ==和eq
???? 不等于:?? !=和ne
???? 小于:????? <和lt
???? 大于:????? >和gt
???? 小于等于: <=和le
???? 大于等于: >=和ge
?? 其它保留字:
???? true
???? false
???? null
???? instanceof
???? empty???? (392)
★ EL能妥善地處理null值
?? 如果找不到EL表達式中指定名的屬性/性質/鍵,也會顯示頁面,而不會拋出異常。
?? 在算術表達式中,EL把null值看作是0。
?? 在邏輯表達式中,EL把null值看作是false。(395)
★ “[]”操作符比“.”操作符更強大
?? “.”的左邊只能是Map或bean,“[]”左邊除了可以是Map或bean外,還可以是List或數組;
?? “[]”里可以包含命名變量的表達式,而且可以做任意層次的嵌套,即如果中括號里的內容沒有用引號引起來,容器就會進行計算;
?? “[]”里的Map鍵可以是不遵循正常的Java命名規則的String,如包含點號的String。(370-376,396)
★ include指令在轉換時發生,<jsp:include>標準動作在運行時發生。(402)
?
第9章 使用JSTL
★ <c:set>有兩種不同的設置:var和target。
?? var“版本”用于設置作用域屬性,target“版本”用于設置作用域屬性的字段或Map值。(445)
★ 容器會在4個位置查找TLD:
?? 直接在WEB-INF目錄中查找
?? 直接在WEB-INF的一個子目錄中查找
?? 在WEB-INF/lib下的JAR文件中的META-INF目錄中查找
?? 在WEB-INF/lib下的JAR文件中的META-INF目錄的子目錄中查找???? (476)
?
第10章 定制標記開發
★ 容器會在4個位置查找.tag標記文件:
?? 直接在WEB-INF/tags目錄中查找
?? 在WEB-INF/tags的子目錄中查找
?? 在WEB-INF/lib下的JAR文件的META-INF/tags目錄中查找
?? 在WEB-INF/lib下的JAR文件的META-INF/tags的子目錄中查找
?? 如果標記文件部署在一個JAR中,這個標記文件必須有一個TLD,相應的TLD項只描述具體標記文件的位置。(499)
?
第11章 Web應用部署
★ 要成功地部署一個Web應用,必須遵循以下目錄結構:
?? WEB-INF一定要直接放在應用上下文之下;
?? classes目錄必須直接放在WEB-INF目錄中,classes目錄中必須是該類的包結構;
?? lib目錄要直接置于WEB-INF目錄下,JAR文件必須放在lib中;
?? META-INF目錄必須是JAR中的頂級目錄;
?? 不在JAR中的TLD必須放在WEB-INF下的某個位置,JAR中的TLD文件要放在META-INF目錄下的某個位置(可以在任何子目錄中,目錄名不必是TLDs);
?? 不在JAR中的標記文件(擴展名為.tag或.tagx的文件)必須放在WEB-INF/tags下的某個地方,JAR中的標記文件必須放在META-INF/tags下的某個地方;
?? web.xml必須直接放在WEB-INF目錄下。(576)
★ 在META-INF/MANIFEST.MF文件中指定庫依賴性
?? 將Web應用打包成WAR文件后,會生成這個文件。你的容器的類路徑(不是應用的類路徑)上可能有一些可選的包,你也許會依賴于其中某些包,或者你可能會 依賴某個特定版本的庫!有了MANIFEST.MF文件,就能告訴容器你必須訪問哪些可選的庫。如果容器無法提供這些庫,就不能成功地部署應用。 (583)
★ 在web.xml中配置servlet時,根據每個servlet加載所需的時間和使用的頻度來決定是否使用<load-on-startup>元素。(596)
?
第12章 Web應用安全
★ servlet安全的4大要素:認證、授權、機密性和數據完整性。(621,630)
★ 4種認證類型:基本(BASIC)、摘要(DIGEST)、客戶證書(CLIENT-CERT)、表單(FORM)。(645)
轉載于:https://my.oschina.net/liangzhenghui/blog/179639
總結
以上是生活随笔為你收集整理的《Head First Servlets JSP(中文版)》书摘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用异步Servlet改进应用性能
- 下一篇: MySQL innosetup_jdk,