jsp技術入門

來源:互聯網
上載者:User

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元素。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.