jsp技術入門


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 才會出現亂碼問題

1

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM