Jsp的簡稱:java server pagehtml
html: 靜態web資源,DefaultServlet讀取html文件,經過response輸出給IE瀏覽器java
Servlet: 動態web資源,web容器(Servlet引擎)解析web.xml文件,找到url對應的java類web
經過反射建立Servlet對象,調用service方法面試
Class.forName(「cn.itcast.servlet.Servlet1」).newInstance();設計模式
jsp: 動態web資源api
jsp頁面在第一次被訪問的時候,web容器(jsp引擎)會將jsp翻譯成一個Servlet,而後調用servlet的瀏覽器
service方法 因此第一次訪問的時候比較慢。tomcat
jsp 翻譯後的Servlet會被放到服務器
%tomcat安裝目錄%\work\Catalina\localhost\webcontextsession
當jsp頁面被再次訪問的時候,web容器會去直接調用Servlet的 service方法,因此一般來說 jsp 只是在第一次被訪問的時候比較慢
若是jsp頁面作了修改,此時web容器會從新翻譯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
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 頁面中全部的 html 標籤部分被稱做模板元素,用於對整個網頁進行佈局
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 {
.......
}
%>
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 文件中一樣能夠配置錯誤頁面
可根據異常類型或錯誤編碼進行配置
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程序存在有與Servlet程序徹底相同的中文亂碼問題
輸出響應正文時出現的中文亂碼問題 contentType=「text/html;charset=UTF-8」
二、讀取瀏覽器傳遞的參數信息時出現的中文亂碼問題
三、JSP引擎將JSP頁面翻譯成Servlet源文件時也可能致使中文亂碼問題
JSP引擎將JSP源文件翻譯成的Servlet源文件默認採用ISO8859-1編碼,而JSP開發人員能夠採用各類字符集編碼來編寫JSP源文件,所以,JSP引擎將JSP源文件翻譯成Servlet源文件時,須要進行字符編碼轉換。
若是JSP文件中沒有說明它採用的字符集編碼,JSP引擎將把它看成默認的ISO8859-1字符集編碼處理。
四、如何解決JSP引擎翻譯JSP頁面時的中文亂碼問題
經過page指令的contentType屬性說明JSP源文件的字符集編碼
page指令的pageEncoding屬性說明JSP源文件的字符集編碼
通知客戶端編碼方式爲contentType
列舉出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內置對象
JspWriter類型, 帶緩衝的字符流 (包裝流) BufferedWriter
寫入該流的數據最終會被刷新到 response , 調用response.getWriter().write(buffer) 方法
什麼狀況下 JspWriter 會將數據刷新
1) 緩衝區寫滿(默認大小爲8kb, 能夠在page指令中經過 buffer屬性設置緩衝區大小)
2) jsp 頁面結束
注意:
1)jsp中輸出數據儘可能使用 out 不要使用response直接得到流輸出
緣由在於, 寫入 out 的數據會進緩衝區 再刷新到response, 若是兩個都用,會致使後寫的數據顯示在前面
2)jsp 頁面結束時會自動調用 response.getWriter() 將數據刷新
主要功能,用於得到其餘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()
範圍由小到大: 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);
}
}
因此在jsp中不要調用 getOutputStream()
固然也不方便作文件下載
結論: 在jsp中用out輸出數據
page: 只在當前jsp頁面有效
request: 只在當前請求有效, 每次請求分別對應不一樣的request域對象
// session: 默認狀況下,同一個瀏覽器來訪問有效(發送同一個sessionid)
session : 只在一次會話中有效,會話結束就沒法取到數據了 (特殊狀況,發送Cookie)
application : 在一個web應用中有效 (只要服務器不關,web應用不移除就能夠取數據)
四個域對象的範圍由小到大排列依次爲: page request session application
原則: 四個域對象在選擇的時候,能用範圍小的毫不用範圍大的
page: 數據只是暫時存在集合,在jsp頁面的其餘地方要用,用page(頁面中自定義的map)
何時須要用map了,就用page
request:數據只是作顯示的,看完了就沒用了,就存request域
請求轉發, Servlet 產生的處理結果(數據) 交給jsp顯示,
session: 數據給用戶看完了,一會還要用,會話結束了就沒用了
用戶登錄,用戶信息發給客戶端看,看完了,一會訪問別的頁面還要看用戶信息
購物車,購物成功了,給用戶看購物車,待會隨時能夠查看購物車
請求重定向,由於是兩次請求,第一次請求的數據,第二次請求還要看
application : 數據給一個用戶用完了,別人還要用
聊天室,聊天記錄,須要給全部的用戶看
統計網站在線人數,全部人看到的應該是一個數
總結: 須要定義Map不如用page,請求轉發Servlet帶給jsp的數據存request
請求重定向帶過去的數據存Session,全局的數據存application
只有當jsp頁面指定的page指令isErrorPage爲true時,纔有exception隱式對象
Session對象 不是每一個jsp頁面都能用的 前提是 page指令的session屬性爲true
Jsp註釋:
1.sp 出錯
1) 被翻譯的Servlet不能編譯,語法錯,這時會報告是由於jsp中的哪行致使不能編譯
2) 翻譯的Servlet 在運行期間出現異常, 報告是jsp的哪行致使的異常
此時會進一步報告致使異常的緣由,在Servlet中的哪行出現異常
2. jsp 映射 也是經過servlet 元素
固定寫法的java類
1)必須有無參構造函數
2)屬性必須私有, 咱們稱爲字段
3)提供標準的getter和setter
例: name 字段 的getter: String getName() settter: void setName(String name)
內省: 經過反射的方式訪問javabean
Jdk中的api : PropertyDescriptor類操做Bean的屬性
Apache組織開發了一套用於操做JavaBean的API(內省)
核心類 BeanUtils
setProperty(bean, name, value)
copyProperties(target, source);
能夠支持String到8中基本數據類型轉換
其餘引用數據類型都須要註冊轉換器 ConvertUtils.register(Converter, Class)
實現任何request提交的表單封裝到對應的javabean
重點:
1. jsp運行原理(會被翻譯成servlet)
2. jsp腳本表達式和腳本片斷
3. jsp九大隱式對象
4. web開發的四個域對象
5. 內省
beanUtils工具的使用
使用
爲了移除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> 得到屬性值
8、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元素。