最近在做java Web方面的整理,遇到些問題,發現自己印象也不是很深刻了,這里作下整理,以后遇到問題再更新。
一.<%@include file="頁面名稱"%>和<jsp:include page="頁面名稱"/>的區別
首先推薦觀看博客園的這篇文章:http://www.49028c.com/Ghost-Draw-Sign/articles/1835974.html
簡單說明一下我的理解:
<%@include file%>是jsp指令元素,效果為把目標頁面的HTML/JSP代碼在編譯時全部直接復制粘貼到這個地方。
而<jsp:include page>是編譯目標JSP頁面。并通過一個方法把編譯好的jsp文件以調用的形式生成在Servlet中。
<%@include file%>會毫無保留的把目標頁面的內容插入到當前頁面中,所以,比如說你在<body></body>中使用了<%@include file="hello.jsp">,則你的hello.jsp內容應該不要再包含<body>標簽了,換言之,就不應該是一個完整的頁面,而且不能出現重復的聲明ContentType格式。大家可以編寫兩個都帶有標準HTML格式的<html><head><body>的jsp文件,并在一個jsp文件中使用<%@include file%>包含另外一個jsp文件,編譯后打開并查看源代碼,你會發現這些HTML標簽出現了兩遍。
<jsp:include page>是JSP提供的動作標簽,其效果為對目標文件單獨進行編譯成Servlet,并在源Serlvet中通過JsPRuntimeLibrary.include方法在代碼中引入。要求兩個文件都能被單獨編譯,并且這個過程是在編譯運行階段執行的。
之前我在用Java寫自己博客時也遇到了。一般而言更喜歡用<%@include file%>,把用到的CSS/js單獨放到一個頁面中,并且把上方的導航欄和右邊的側欄以及下方的說明欄也用這種形式引入,減少了代碼的引入。<jsp:include>很少用,不過總體上效果應該都差不多。
二.<jsp:forWord page/>的用法:
通常,我們不應該直接暴露jsp頁面,而是客戶端先訪問一個URL地址,Web應用將該URL轉發給處理器處理,處理器執行完返回jsp頁面。所以,一般JSP文件應該放在WEB-INF文件夾中,這樣客戶便無法訪問了。
現在舉一個奇葩的例子:不使用WEB-INF方法:我想讓客戶直接訪問index.jsp,里面包含了必須經過處理器返回的數據,但是直接訪問index.jsp是無效的,你看,你直接訪問.jsp文件我也能取到數據庫中數據,Diao吧??梢杂幸韵罗k法:
1.把原來的hello.jsp改名(比如ok.jsp),取名index.jsp
2.index.jsp只需要有這一句<jsp:forword page="initOKJSP.servlet"/>
<!--這個initOKJSP.servlet是用于處理生成jsp的Serlvet,最后把請求轉發到ok.jsp-->
3.在瀏覽器輸入~/index.jsp即可看到ok.jsp的頁面效果
反正就是這么一個效果,在jsp頁面中使用<jsp:forword>標簽能直接把當前的請求轉發到目標文件(可以是jsp,servlet甚至action),起到了緩沖的作用。不過推薦大家還是把jsp文件放到WEB-INF中,然后可以使用MVC框架對請求進行處理。
三.4種作用域和PageContext
JSP包含四種作用域,分別是page,request,session,application,相信搞Java的一定都很熟。這四種作用范圍我分別總結如下:
page:相當與Servlet中的this,表示自身,換句話說,只在當前頁面有效。
request:請求范圍,使用請求轉發時,地址URL不會變而頁面會變,request的作用在這兩張頁面上(一般情況是兩個,只要URL不改都是同一個request)
session:只要瀏覽器不關,一直是同一個session實例。sessionId放在本機,服務端根據id獲取session內容
application:只要應用沒有掛掉,全局共享
PageContext和Page不同,PageContext包含了所有與應用相關的對象的引用。從PageContext實例可以獲取page,request,session甚至application,相反從這四個對象也可以獲得PageContext。PageContext是宏觀上的對象,對其進行set/getAttribute會依次從page,request,session,application中查找。
四.如何使用Jsp提供的變量保存數據?
以下是我個人簡單的總結,希望和大家互相補充交流,有錯誤也請指出,謝謝~~
pageScope:無啥大用,可以放全局變量。話說與其用Java實現全局變量的功能倒不如使用JavaScript
requestScope:重要屬性,包括表單提交,Service返回到頁面的數據
sessionScope:購物車,用戶在線狀態
applicationScope:數據庫連接池
cookie:用戶賬號(加密后密碼),購物車(建議用cookie),用戶偏好
接下來,看到了再慢慢補充吧......
新聞熱點
疑難解答