JSP

1.JSP

1.1 JSP概述

    jsp全稱java serverpages(java服務器頁面),本質是一個servlet,它是在傳統的網頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件,後綴名爲(*.jsp)。

1.2 JSP原理


1.3 JSP腳本

    JSP有三個基本的腳本元素,作用是使JAVA代碼可以直接插入到HTML代碼中

(1)聲明標籤

    格式:<%! inta = 1; %>

    作用:聲明的變量在類的成員位置上

(2)腳本片斷

    格式:<% inta = 1; out.println(a); %>

    作用:內容會生成在_jspService()方法中

(3)腳本表達式

    格式:<%="hello " + a %>

    作用:它就相當於是out.println()將內容直接輸出到頁面中,注意表達式不能以分號結尾

1.4 JSP註釋

    在jsp頁面中可以使用三種註釋

(1)可以使用html中註釋 

        <!-- html的註釋  -->

(2)可以對jsp腳本內容使用java註釋 

        //單行註釋  /* 多行註釋 */  /**文檔註釋*/

(3)可以使用jsp註釋(會被編譯系統忽略)

        <%--  jsp註釋  --%>

2. JSP指令

2.1 JSP指令概述

         JSP的編譯指令是通知JSP引擎的消息,它不直接生成輸出,用於指示JSP執行某些步驟和指示JSP表現特定行爲。

2.2 JSP指令格式

        語法:<%@ 指令的名稱 屬性名=”屬性值” 屬性名=”屬性值”%>

2.3 JSP指令分類

    JSP中有三大指令,分別是以下三個:

         Page:設置JSP的屬性

         Include:包含頁面(頁面佈局

         Taglib:引入標籤庫文件

2.4. page指令

    language  :JSP的語言的屬性.現在只能是java.

    contentType   :設置瀏覽器默認的打開的時候的編碼.

    pageEncoding    :設置JSP文件保存到硬盤,以及翻譯成Servlet保存到硬盤的編碼格式.

    import      :設置JSP中引入其他的類.import屬性可以出現多次的.

    extends   :設置JSP被翻譯成Servlet後繼承的類:默認值:org.apache.jasper.runtime.HttpJspBase.修改這個值得話一定要使這個類是一個Servlet纔可以.

     autoFlush     :設置自動刷出緩存

     buffer        :JSP的緩衝區的大小。默認8kb

     session       :默認值是true.設置JSP的頁面中是否可以直接使用session對象.

     isELIgnored   :設置JSP是否忽略EL表達式.默認值false 不忽略.可以在JSP中寫EL表達式.

     isErrorPage   :設置JSP頁面中出現錯誤信息應該如何處理的.

     errorPage     :設置JSP頁面中出現錯誤信息應該如何處理的.

 

    設置全局錯誤頁面:

     <error-page>

            <error-code>404</error-code>

            <location>/404.jsp</location>

     </error-page>

     <error-page>

            <error-code>500</error-code>

            <location>/500.jsp</location>

     </error-page>

2.5. include指令

    include指令表示靜態包含!即目的是把多個JSP合併成一個JSP文件!

    include指令只有一個屬性:file,指定要包含的頁面,例如:<%@includefile=”b.jsp”%>。

    靜態包含:當a.jsp頁面包含了b.jsp頁面後,在編譯ajsp頁面時,需要把a.jsp和b.jsp頁面合併成一個文件,然後再編譯成Servlet(Java文件)。

2.6 taglib指令

        在JSP頁面中使用第三方的標籤庫時,需要使用taglib指令來“導包”。例如:<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>,其中uri是由第三方標籤庫定義的,prefix表示標籤的前綴,這個名稱可以隨便起。

3. JSP內置對象

request             HttpServletRequest                        getParameter(),setAttribute(),getAttribute();

response           HttpServletResponse                      setStatus(),sendRedirect(),getOutputStream();

session              HttpSession                                   setAttribute(),getAttribute(),removeAttribute();

application        ServletContext                               setAttribute(),getAttribute(),removeAttribute();

page                  Object                                           toString(),wait(),

pageContext      PageContext                                  setAttribute(),getAttribute(),removeAttribute();

out                     JspWriter                                       write(),print(),

config                ServletConfig                                 getInitParamter(),getInitParameterNames(),

exception           Throwable                                      getMessage(),getCause()

 

 

* out對象:先將自身緩存區中的內容輸出到response的緩衝區中,由response向頁面作出響應.

        out  :JspWriter

        response.getWriter() :PrintWriter

* pageContext:

        一類:用pageContext對象獲得其他的8個內置對象. 用來編寫一個通用性高的或者框架的時候.

        二類:用來存取數據.向四個域中存取數據.

3.1九個內置對象及其相應類型

 

內置對象

類型

request

HttpServletRequest

response

HttpServletResponse

session

HttpSession

application

ServletContext

config

ServletConfig

page

this(Servlet)

pageContext

PageContext

exception

Throwable

out

JspWriter

3.2獲取其他內置對象

        通過pageContext對象可以獲取jsp中其他的內置對象.PageContext類中定義瞭如下八個方法:getPage()、getRequest()、getResponse()、getServletConfig()、getServletContext()、getException()、getSession()等方法,其中getOut()放是在其父類中定義的,有了這些方法,pageContext對象自然能夠獲取其他八個內置對象了。

3.3 JSP中的域對象

pageContext        pageScope               頁面範圍

request                requestScope            請求範圍

session                 sessionScope            會話範圍

application           applicationScope       應用範圍

pageContext是一個域對象,常用方法:

        void setAttribute(Stringname,Object value)

        Object getAttribute(Stringname);

        Void removeAttribute(Stringname);

操作其他域中的對象的方法:

    Object getAttribute(Stringname, int scope):

    該方法的第一個參數是域屬性的名稱,第二個參數指定是從那個域中取出域屬性;

    在PageContext中已經定義瞭如下幾個靜態常量作爲scope的可選值:

         int APPLICATION_SCOPE:表示從application域中獲取數據;

         int PAGE_SCOPE:表示從pageContext域中獲取數據;

         int REQUEST_SCOPE:表示從request域中獲取數據;

         int SESSION_SCOPE:表示從session域中獲取數據。

     void setAttribute(String name,Objectvalue,int scope):

        該方法的第一個參數指的是域屬性的名稱,第二參數指的是域屬性的值,第三個參數指定域屬性保存的域,scope的取值同上;

    void removeAttribute(Stringname,int scope):

        該方法的第一個參數指的是域屬性的名稱,第二個參數指的是將指定域屬性從哪個域中移出,scope的取值同上;

4. jsp動作標籤

4.1 jsp動作標籤概述

        JSP標籤也稱之爲Jsp Action(JSP動作)元素,它用於在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護。

4.2 常用的jsp標籤

    jsp:forward

    <jsp:forward>標籤是用來做請求轉發,它與RequestDispatcher接口的forward()方法一樣,唯一不同的是它是在jsp頁面中使用。

    jsp:include

    <jsp:include>標籤的作用使用來包含其他jsp頁面,之前學習的include指令屬於靜態包含,而include動作標籤是動態包含,它和RequestDispatcher接口的include()方法一樣,是運行級別的包含

    jsp:param

    <jsp:param>標籤作爲<jsp:forward>標籤和<jsp:include>標籤的子標籤,用來給轉發或包含的頁面傳遞數據。

靜態包含與動態包含的區別

    

include標籤與inclue指令區別:

(1)include指令是靜態包含,包含文件中包含了被包含文件的內容.

          include標籤是動態包含,它包含的是被包含文件執行後的結果.

(2)include指令不能帶參數

          include標籤是可以帶參數的

5. EL表達式

5.1 EL表達式概述

        EL是Expression Language的縮寫,它是jsp內置的表達式語言,從jsp2.0開始,就不讓再使用java腳本,而是使用el表達式或動態標籤來代替java腳本。

    EL表達式的格式:${表達式}

    EL表達式代替的是java腳本中的<%= …%>,也就是說EL表達式也是向瀏覽器端輸出數據。例如${1+2}會向瀏覽器端輸出3。

5.2 EL表達式的作用

    爲了使JSP寫起來更加簡單,更加安全,可以通過EL表達式來替換jsp頁面上的腳本

    EL主要作用:

    (1)獲取數據:

        EL表達式主要用於替換JSP頁面中的腳本表達式,以從各種類型的web域中檢索java對象、獲取數據。(某個web域中的對象,訪問javabean的屬性、訪問list集合、訪問map集合、訪問數組)

    (2)執行運算:

        利用EL表達式可以在JSP頁面中執行一些基本的關係運算、邏輯運算和算術運算,以在JSP頁面中完成一些簡單的邏輯運算。${user==null}

    (3)獲取web開發常用對象

        EL 表達式定義了一些隱式對象,利用這些隱式對象,web開發人員可以很輕鬆獲得對web常用對象的引用,從而獲得這些對象中的數據。

    (4)調用Java方法

        EL表達式允許用戶開發自定義EL函數,以在JSP頁面中通過EL表達式調用Java類的方法。

    5.3 EL表達式之域查找

        1.pageContext--------------------${pageScope.xxx}

        2.request--------------------------${requestScope.xxx}

        3.session--------------------------${sessionScope.xxx}

        4.application---------------------${applicationScope.xxx}     

        通過el獲取時,如果沒有查找到,會返回"".除了上面的獲取方式外還有一種,例如

        ${requestScope[“xxx”]}

        關於.與[]區別

         []與.在使用方式上是一樣的.但是如果名稱中包含了"."等特殊字符,就必須使用[]來獲取.         例如

         request.setAttribute("login.message","登錄失敗");

         ${requestScope.login.message}<br>錯誤的

         ${requestScope["login.message"]}正確的        

        如果沒有寫範圍,會默認從page,request,session.application依次查找

5.4 EL表達式獲取複雜數據

    獲取數組中數據

        例如:${數組名稱[索引] }

      獲取List中數據

        例如:${集合名稱[索引]}

      獲取Map中數據

        例如:${集合名稱.key名稱}

5.5 EL表達式運算

運算符

說明

範例

結果

+

${17+5}

22

-

${17-5}

12

*

${17*5}

85

/或div

${17/5}或${17 div 5}

3

%或mod

取餘

${17%5}或${17 mod 5}

2

==或eq

等於

${5==5}或${5 eq 5}

true

!=或ne

不等於

${5!=5}或${5 ne 5}

false

<或lt

小於

${3<5}或${3 lt 5}

true

>或gt

大於

${3>5}或${3 gt 5}

false

<=或le

小於等於

${3<=5}或${3 le 5}

true

>=或ge

大於等於

${3>=5}或${3 ge 5}

false

&&或and

並且

${true&&false}或${true and false}

false

!或not

${!true}或${not true}

false

||或or

或者

${true||false}或${true or false}

true

empty

是否爲空

${empty “”},可以判斷字符串、數據、集合的長度是否爲0,爲0返回true。empty還可以與not或!一起使用。${not empty “”}

true

6. EL表達式內置對象

EL隱式對象引用名稱

類型

JSP內置對象名稱

說明

pageContext

javax.servlet.jsp.PageContext

pageContext

一樣的

pageScope

java.util.Map<String,Object>

沒有對應的

pageContext範圍中存放的數據,頁面範圍

requestScope

java.util.Map<String,Object>

沒有對應的

請求範圍數據

sessionScope

java.util.Map<String,Object>

沒有對應的

會話範圍數據

applicationScope

java.util.Map<String,Object>

沒有對應的

應用範圍數據

param

java.util.Map<String,String>

沒有對應的

一個請求參數

paramValues

java.util.Map<String,String[]>

沒有對應的

重名請求參數

header

java.util.Map<String,String>

沒有對應的

一個請求消息頭

headerValues

java.util.Map<String,String[]>

沒有對應的

重名請求消息頭

initParam

java.util.Map<String,String>

沒有對應的

web.xml中全局參數

cookie

java.util.Map<String,Cookie>

沒有對應的

key:cookie對象的name


6.1pageContext內置對象

    EL表達式的11個內置對象中,有10個內置對象的類型是Map類型,只有pageContext的類型是PageContext。它的使用類似於jsp的內置對象pageContext,. 通過pageContext對象可以獲取其他內置對象的任意的屬性值。

         常用操作:${pageContext.request.contextPath}

6.2請求參數相關內置對象

請求參數相關的內置對象是:

    param:該內置對象的類型是Map<String,String>,可以用來獲取值爲單值的請求參數,其中key指的是請求參數的名稱,value指的是請求參數的值,使用param獲取請求參數與request.getParameter()方法一樣。

    paramValues:該內置對象的類型是Map<String,String[]>,可以用來獲取值爲多值的請求參數,其中key是參數名,value是多個參數值組成的字符串數組。

    注意,在使用EL獲取參數時,如果參數不存在,返回的是空字符串,而不是null。這一點與使用request.getParameter()方法是不同的。

6.3請求頭相關內置對象

    與請求頭相關的內置對象是:

        header:該內置對象的類型是Map<String,String>,用來獲取值爲單值的請求頭信息,其中key代表的是請求頭名稱,value代表的是請求頭的值;

         headerValues:該內置對象的類型是Map<String,String[]>,用來獲取值爲多值的請求頭信息,key代表的是請求頭名稱,value代表的是請求頭的多個值。

6.4全局初始化參數的內置對象

EL表達式中內置了一個與初始化參數相關的對象:

        initParam:該內置對象的類型是Map<String,String>,用來獲取web.xml文件中<context-param>標籤的參數值,其中key代表的是參數名,value代表的是參數值。

6.5 cookie相關內置對象

    EL表達式也內置一個名爲cookie的對象,該內置對象與cookie相關,如下:

    cookie:該內置對象的類型爲Map<String,Cookie>,其中key是Cookie的名字,value是Cookie對象本身。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章