Jsp的簡稱:java server page
1. web資源的運行原理
html: 靜態web資源,DefaultServlet讀取html檔案,通過response輸出給IE瀏覽器
Servlet: 動態web資源,web容器(Servlet引擎)解析web.xml檔案,找到url對應的java類
通過反射建立Servlet對象,調用service方法
Class.forName(“cn.itcast.servlet.Servlet1”).newInstance();
jsp: 動態web資源
jsp頁面在第一次被訪問的時候,web容器(jsp引擎)會將jsp翻譯成一個Servlet,然後調用servlet的
service方法 所以第一次訪問的時候比較慢。
jsp 翻譯後的Servlet會被放到
%tomcat安裝目錄%\work\Catalina\localhost\webcontext
當jsp頁面被再次訪問的時候,web容器會去直接調用Servlet的 service方法,所以通常來講 jsp 只是在第一次被訪問的時候比較慢
如果jsp頁面做了修改,此時web容器會重新翻譯jsp
2. jsp 是什麼
實際上 jsp 就是 Servlet , 只是提供了一種比較直觀的書寫方式,因為寫jsp就像在寫Html
jsp中可以寫 java 代碼, 有兩種寫法
1) jsp 指令碼運算式
內容會被放到 out.print() 裡面 輸出個瀏覽器
<%=new Date() %>
Jsp指令碼運算式,等號後面跟一行java代碼,注意不能以分號結束。
您的ip是:<%=request.getRemoteAddr() %>
面試題:
如何把一個數字轉換成字串?
String.valueof
Integer
String.valueof和to string有什麼區別?
都是一樣的。屬於互相調用
2) jsp指令碼片段
可以大量的寫入java代碼,輸入多行java代碼
Jsp指令碼片段內容會原封不動地被翻譯到 Servlet 的service方法中
<%
// java 代碼
%>
Jsp運行原理:ie訪問一個jsp時,web容器會將jsp首先翻譯成一個servlet,餘下的過程和訪問一個servlet完全一樣。
運算式被翻譯到service方法中的out.print
J
3. jsp 和 Servlet的區別
1) Servlet 適合寫java代碼,因為Servlet就是一個java類
在開發中使用Servlet對使用者發送的請求進行處理並做出響應
2) jsp 適合做資料美化,作為 資料顯示模板
因為jsp頁面直接書寫HTML標籤
3) 項目中的web層通常使用mvc設計模式 Servlet+jsp+javabean
其中, Servlet做控制器,處理使用者請求
jsp作為顯示模板
javabean 作為封裝資料的實體
4) 如何養成一種良好的編碼風格
在Servlet中應避免做任何的資料輸出
在 jsp 中應避免去直接書寫java代碼, 而實際上要做到這點很難, 所以需要用到 el 和 jstl
(jsp 中必須要寫的java代碼,從域對象中取出資料)
二、 jsp文法1. 模板元素
在 jsp 頁面中所有的 html 標籤部分被稱作模板元素,用於對整個網頁進行布局
2. jsp指令碼
jsp中的java代碼被稱作jsp指令碼
有三種形式
1) 指令碼運算式
被翻譯到 out.print() 方法中
<%=new Date() %>
2) 指令碼片段
被翻譯到 service 方法中
<%
for(int i=0; i<10; i++) {
System.out.println(i);
}
%>
3) jsp 聲明
被翻譯到 service 方法外面
寫成員變數\成員方法\靜態代碼塊
<%!
private String name;
static {
.......
}
%>
3. jsp指令
include指令 用於包含一個頁面
taglib 指令用於引入標籤庫檔案
page指令 用於向jsp引擎說明jsp的頁面情況
page指令一般都放在頁面的開頭,但是不管放在哪都對整個頁面起作用
page指令 常用的主要有一下幾個:
1) import 導包, 匯入多個包時需要以“,”隔開 也可以分作多條指令書寫
例如:<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
在這裡自動導包的方法時,在單詞的後面,點擊alt+/,然後選擇導包
就ok了
2) session 說明是否使用session
預設值為true,被翻譯的Serlvet中會自動獲得Session
如果將該值指定為false 被翻譯的Servlet的service方法中將不擷取session
3) errorPage 指定錯誤跳轉的頁面
在 web.xml 檔案中同樣可以配置錯誤頁面
可根據異常類型或錯誤編碼進行配置
error-page
為了防止英文報錯,直接把英文顯示給使用者,那麼就配置錯誤提示頁面:
如果出錯:為所有的jsp頁面配置錯誤的跳轉頁面,在web.xml裡面配置
配置內容為:
1.抓異常錯誤的
<error-page>
<exception-type>java.lang.ArithmeticException </exception-type>
<location>/error.jsp</location>
</error-page>
1. 錯誤碼
<error-page>
<error-code>404</error-code>
<location>404.jsp</location>
</error-page>
*isErrorPage:true|false。指示是不是錯誤處理頁面。是否產生exception對象
*contentType="mimeType;charset=UTF-8":等同於response.setContentType();
*pageEncoding:通知引擎在翻譯jsp--》Servlet時使用的編碼
*isELIgnored:是否忽略EL運算式true|false。預設值false。true是忽略EL運算式
4) pagaEncoding
通知jsp引擎在翻譯jsp的過程中以什麼編碼方式來解碼jsp檔案
通知 Servlet引擎 response編碼方式,相當於 response.setContentType()
說白了
只要給jsp指定了 pageEncoding=”utf-8”
jsp引擎在翻譯jsp時, 就會自動加上一句
response.setContentType(“text/html;charset=utf-8”)
擴充 : jsp 亂碼問題
在 tomcat6 以後jsp就沒有亂碼問題了, 如果是使用tomcat5 才會出現亂碼問題
jsp 亂碼解決 告訴jsp引擎jsp頁面是什麼碼,這樣翻譯才不會錯
告訴response用什麼碼編碼再發給瀏覽器
產生亂碼的原因
1、JSP程式存在有與Servlet程式完全相同的中文亂碼問題
輸出響應本文時出現的中文亂碼問題 contentType=“text/html;charset=UTF-8”
2、讀取瀏覽器傳遞的參數資訊時出現的中文亂碼問題
3、JSP引擎將JSP頁面翻譯成Servlet源檔案時也可能導致中文亂碼問題
JSP引擎將JSP源檔案翻譯成的Servlet源檔案預設採用ISO8859-1編碼,而JSP開發人員可以採用各種字元集編碼來編寫JSP源檔案,因此,JSP引擎將JSP源檔案翻譯成Servlet源檔案時,需要進行字元編碼轉換。
如果JSP檔案中沒有說明它採用的字元集編碼,JSP引擎將把它當作預設的ISO8859-1字元集編碼處理。
4、如何解決JSP引擎翻譯JSP頁面時的中文亂碼問題
通過page指令的contentType屬性說明JSP源檔案的字元集編碼
page指令的pageEncoding屬性說明JSP源檔案的字元集編碼
通知用戶端編碼方式為contentType
三、 jsp 九個隱式對象 (筆試)1. 面試題:
列舉出jsp頁面的九個隱式對象,並加以說明
物件變數名,可直接在jsp中使用 |
物件類型 |
config |
ServletConfig |
application |
ServletContext |
response |
HttpServletResponse |
request |
HttpServletRequest |
session |
HttpSession |
out |
JspWriter |
page |
this(當前servlet對象) |
exception |
Throwable |
pageContext |
PageContext |
注意:
exception對象不是每個頁面都有 只有是錯誤頁面(errorPage),並且 isErrorPage屬性設定為true
session 對象也不是每個頁面都有 預設情況下有,但是如果將page指令的 session=”false”,則沒有session內建對象
2. out 對象
JspWriter類型, 帶緩衝的字元流 (封裝流) BufferedWriter
寫入該流的資料最終會被重新整理到 response , 調用response.getWriter().write(buffer) 方法
什麼情況下 JspWriter 會將資料重新整理
1) 緩衝區寫滿(預設大小為8kb, 可以在page指令中通過 buffer屬性設定緩衝區大小)
2) jsp 頁面結束
注意:
1)jsp中輸出資料盡量使用 out 不要使用response直接獲得流輸出
原因在於, 寫入 out 的資料會進緩衝區 再重新整理到response, 如果兩個都用,會導致後寫的資料顯示在前面
2)jsp 頁面結束時會自動調用 response.getWriter() 將資料重新整理
所以在jsp中不要調用 getOutputStream()
當然也不方便做檔案下載
結論: 在jsp中用out輸出資料
3. pageContext對象
主要功能,用於獲得其他8大隱式對象
這樣做的意義:
需要移除jsp中的java代碼,就需要將java代碼寫到一個java類的成員方法中,然後想辦法在jsp
頁面中調用該方法,以達到代碼複用的目的
由於在jsp中的java代碼難免會訪問8個隱式對象,因為這些對象都是和web開發相關的對象
要移除這部分java代碼就需要將8個對象傳遞給java類的方法,為了方便,我們通常的做法是只傳遞一個
pageContext對象過去,這樣在方法中就可以通過該對象很輕鬆地獲得其他8個對象了
pageContext 也是一個域對象,但只是在當前jsp頁面有效
重點:
1) 默寫9個對象, (具體描述9個對象怎麼用)
2) 理解pageContext對象的意義 (獲得其他8個對象)
pageContext 有個特殊的方法 findAttribute()
四、 web開發中的四個域(重點)
範圍由小到大: page(jsp有效) request(一次請求) session(一次會話) application(當前web應用)
page : PageContext對象
request : HttpServletRequest對象
session : HttpSession對象
application : ServletContext對象
class Request {private Map<String, Object> attributes = new HashMap();public void setAttribute(String name, Object value) {attributes.put(name,value); }public Object getAttribute(String name) {return attributes.get(name);}public void removeAttribute(String name) {attributes.remove(name); }}
1. 這4個對象的生命週期?
生命週期就是指對象的建立到銷毀的期間
page: jsp 頁面被執行,生命週期開始,jsp 頁面執行完畢 ,生命週期結束
request : 使用者發送一個請求,開始,伺服器返迴響應,請求結束,生命週期結束
session : 使用者開啟瀏覽器訪問,建立session(開始),session逾時或被聲明失效,該對象生命週期結束
application: web應用載入的時候建立(開始), web應用被移除或伺服器關閉,對象銷毀(結束)
2. 四個域的作用範圍
什麼是域?為什麼把這4個對象叫做域對象呢?
域: 即範圍的意思
web中的域對象,可以儲存物件,在作用範圍內都可以取到
內部是Map集合的實現 Map<String, Object>
class PageContext { private Map attributes = new HashMap(); private HttpSession session; public void setAttribute(String name, Object value) { attributes.put(name, value); } public Object getAttribute(String name) { attributes.get(name); } public void removeAttribute(String name) { attributes.remove(name); } } }
page: 只在當前jsp頁面有效
request: 只在當前請求有效, 每次請求分別對應不同的request域對象
// session: 預設情況下,同一個瀏覽器來訪問有效(發送同一個sessionid)
session : 只在一次會話中有效,會話結束就無法取到資料了 (特殊情況,發送Cookie)
application : 在一個web應用中有效 (只要伺服器不關,web應用不移除就可以取資料)
四個域對象的範圍由小到大排列依次為: page request session application
3. 哪種情況下用哪種域對象。
原則: 四個域對象在選擇的時候,能用範圍小的絕不用範圍大的
page: 資料只是暫時存在集合,在jsp頁面的其他地方要用,用page(頁面中自訂的map)
什麼時候需要用map了,就用page
request:資料只是做顯示的,看完了就沒用了,就存request域
請求轉寄, Servlet 產生的處理結果(資料) 交給jsp顯示,
session: 資料給使用者看完了,一會還要用,會話結束了就沒用了
使用者登陸,使用者資訊發給用戶端看,看完了,一會訪問別的頁面還要看使用者資訊
購物車,購物成功了,給使用者看購物車,待會隨時可以查看購物車
請求重新導向,因為是兩次請求,第一次請求的資料,第二次請求還要看
application : 資料給一個使用者用完了,別人還要用
聊天室,聊天記錄,需要給所有的使用者看
統計網站線上人數,所有人看到的應該是一個數
總結: 需要定義Map不如用page,請求轉寄Servlet帶給jsp的資料存request
請求重新導向帶過去的資料存Session,全域的資料存application
五、 jsp 細節
只有當jsp頁面指定的page指令isErrorPage為true時,才有exception隱式對象
Session對象 不是每個jsp頁面都能用的 前提是 page指令的session屬性為true
Jsp注釋:
1.sp 出錯
1) 被翻譯的Servlet不能編譯,文法錯,這時會報告是因為jsp中的哪行導致不能編譯
2) 翻譯的Servlet 在運行期間出現異常, 報告是jsp的哪行導致的異常
此時會進一步報告導致異常的原因,在Servlet中的哪行出現異常
2. jsp 映射 也是通過servlet 元素
六、內省(neixing)1. javabean
固定寫法的java類
1)必須有無參建構函式
2)屬性必須私人, 我們稱為欄位
3)提供標準的getter和setter
例: name 欄位 的getter: String getName() settter: void setName(String name)
2. 什麼是內省
內省: 通過反射的方式訪問javabean
Jdk中的api : PropertyDescriptor類操作Bean的屬性
3.BeanUtils工具包
Apache組織開發了一套用於操作JavaBean的API(內省)
核心類 BeanUtils
setProperty(bean, name, value)
copyProperties(target, source);
可以支援String到8中基礎資料型別 (Elementary Data Type)轉換
其他引用資料類型都需要註冊轉換器 ConvertUtils.register(Converter, Class)
3. WebUtils 工具類
實現任何request提交的表單封裝到對應的javabean
重點:
1. jsp運行原理(會被翻譯成servlet)
2. jsp指令碼運算式和指令碼片段
3. jsp九大隱式對象
4. web開發的四個域對象
5. 內省
beanUtils工具的使用
使用
七、 jsp標籤(可選)
為了移除jsp頁面的java代碼,sun公司提供了一些內建的標籤
我們稱為jsp標籤,或jsp動作元素
1. <jsp:include> 相當於 RequestDispatcher 對象的頁面引入
dispatcher.include 實現 Servlet包含
dispatcher.forward 實現servlet轉寄
forward 在轉寄時 web容器會清空response中的資料
在轉寄之後就無法向response寫入資料
動態引入方式,在程式運行期間引入,jsp被翻譯成兩個
include指令也能實現頁面的引入,靜態引入,將兩個jsp翻譯成一個Servlet
包含和被包含的jsp頁面指令不能發生衝突
其中,import和pageEncoding可以衝突
2. <jsp:forward> 實現請求轉寄
結合 <jsp:param> 標籤傳參,自動進行url編碼,編碼的方式參照request編碼
3. <jsp:useBean id class scope> 內省
反射建立javabean,以id作為key存入指定的域
其實在建立之前,會先去域中找,找到了則不建立
4. <jsp:setProperty> 設定屬性值
<jsp:setProperty name=”user” property=”username” value=”zs” />
<jsp:setProperty name=”user” property=”username” param=”username” />
<jsp:setProperty name=”user” property=”*” /> 批量
5. <jsp:getProperty> 獲得屬性值
八、web開發模式
Sun公司針對web開發提供了兩種模式
Model1: jsp+javabean 只適合小型應用
Model2: servlet+jsp+javabean mvc
-------------------------------------------------------------------------------
Jsp的一些常用功能:
1.您的ip是:<%=request.getRemoteAddr() %>
2.滾動功能:<marquee behavior="scroll" direction="left"> </marquee>
使用<div>的功能,ap元素。