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中基本數據類型轉換
其他引用數據類型都需要注冊轉換器 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元素。