關於jsp的知識

一、jsp簡介

  jsp是一種特殊的servlet,是一種動態的網頁技術標準,它可以在傳統的html頁面中插入Java程序,在服務器端執行,但是最終返回的是HTML頁面。jsp最終在程序中生成一個.java文件,這個Java中可以看出jsp繼承於JspServlet,而JSPServlet則是繼承於HttpServlet的。

  Jsp頁面的目的就是是的前端展示和後端邏輯servlet分離,所以一般不推薦在jsp中寫Java代碼。jsp在整個執行的過程中,用戶通過瀏覽器請求到達服務器,服務器調用jsp引擎(一個Java程序)jsp引擎會將jsp翻譯爲一個servet,所以第一次訪問這個jsp的時候會略微慢一些,之後如果jsp引擎發現這個jsp沒有發生變化就會直接調用之前生成的servlet

二、jspJava腳本的書寫方式

1Java小腳本

<%

Java語句

%>

  在這裏面的語句,翻譯成servlet之後會直接放入,servletservice方法中,並且在這裏面是不能定義方法的。注意小腳本中可以使不完整的,只要保證多個小腳本連一起是完整的就行。

2、聲明元素

<%!

聲明

%>

      聲明中可以定義一些變量、方法,這裏面的內容是放在service方法之外的。

3、表達式

<%=EL %>

     表達式中是不能以”;”結尾的。表達式是一個簡化的了的out.println語句。

三、jsp指令

     jsp指令是爲了JSP引擎設計的,不會直接產出任何輸出,但是可以用來告訴jsp引擎一些jsp頁面其他的處理過程。

JSP2.0中指令一共有三種:pageincludetaglib,其語法格式一般爲<%@ %>

1page指令

     其作用主要是用於指定頁面的各種實行,常用的實行如下:

<%@page

[language="java" ] 語言

[extends="package.class" ]

[import="{package.class | package.*}, ..." ] 導包

[session="true | false" ]

[buffer="none | 8kb | sizekb" ]

[autoFlush="true | false" ]

[isThreadSafe="true | false" ]

[info="text" ]

[errorPage="relative_url" ]

[isErrorPage="true | false" ]

[contentType="mimeType [ ;charset=characterSet ]" |"text/html ; charset=ISO-8859-1" ]

[pageEncoding="characterSet | ISO-8859-1" ] //指定編碼集

[isELIgnored="true | false" ]

%>

      可以在一條page指令的import屬性中引入多個類或包,其中的每個包或類之間使用逗號(,)分隔。例如:

<%@ page import="java.util.Date,java.io.*,java.sql.*"%>

      page設置錯誤頁面,當然也可以在web.xml中指定全局的錯誤頁面。errorPage屬性的設置值必須使用相對路徑,如果以"/"開頭代表的是當前應用程序的根目錄,而不是站點的根目錄。

      web.xml文件中使用<error-page>設置整個web應用的錯誤頁面,<error-page>下面有三個子元素。

<error-code>指定錯誤的狀態碼

<exception-type>指定異常類的完全限定名

<location>指定以"/"爲開頭的錯誤的處理頁面的路徑

      問題:我在設置了404500狀態碼頁面和error頁面,404錯誤是跳轉到了404頁面,但是500狀態碼跳轉到了error頁面,並沒有跳轉到500頁面中,好奇怪啊!!以後在研究研究

<!--

      使用page指令的isErrorPage屬性顯式聲明頁面爲錯誤頁面

好處:

       error.jsp頁面顯式聲明爲錯誤處理頁面後,有什麼好處呢,好處就是Jsp引擎在將jsp頁面翻譯成Servlet的時候,

Servlet_jspService方法中會聲明一個exception對象,然後將運行jsp出錯的異常信息存儲到exception對象中

Servlet_jspService方法中聲明瞭exception對象,那麼就可以在error.jsp頁面中使用exception對象,

這樣就可以在Jsp頁面中拿到出錯的異常信息了

-->

     對不起,出錯了,請聯繫系統的管理員!!<br>

    異常信息如下:<%=exception.getMessage() %><!-- 如果不指定isErrorPage的話就會編譯錯誤!-->

2include指令

     include指令用於包含其他頁面,一共有兩種方式,一種是靜態包含一種是動態包含。

     靜態包含:<%@includefile=”header.jsp”%>,這種方式中被引入的文件是必須遵從jsp規範的,不論是什麼擴展名,jsp引擎都會按照jsp的規範處理它的內容,被include涉及的jsp頁面最終只會被翻譯爲一個servlet,所以這兩個頁面的指令不能衝突(pageEncoding和導包除外)

      動態包含<jsp:includepage=”/user/test”flush=”true”/>,如果被包含的是jsp頁面,則會先處理在進行包含,如果不是jsp頁面,只會靜態的包含,於@include類似。

     靜態包含和動態包含有什麼區別?

靜態包含是在編譯期包含,雖然有兩個jsp頁面文件,但是生成的servlet卻只有一個,而動態包含在運行期進行,每個jsp都會產生一個servlet,效率上面還是靜態包含要好!

3taglib指令用於在JSP頁面中導入標籤庫,如JSTLjava標準標籤庫和自定義的標籤。


四、JSP九大隱式對象

SP引擎在調用JSP對應的_jspServlet時,會傳遞或創建9個與web開發相關的對象供_jspServlet使用

NO

內置對象

類型

1

pageContext

javax.servlet.jsp.PageContext

2

request

Javax.servlet.http.HttpServletRequest

3

response

javax.servlet.http.HttpServletResponse

4

session

Javax.servlet.http.HttpSession

5

application

Javax.servlet.ServletContext

6

config

Javax.servlet.ServletConfig

7

out

Javax.servlet.jsp.JspWriter

8

page

Java.lang.Object

9

exception

Java.lang.Throwable

page隱式對象說明

       page對象代表的是這個頁面本身,就是將頁面看做爲一個對象,基本不咋用。

out隱式對象

      out對象用於想瀏覽器發送文本信息,out對象同調用pageContextgetOut方法得到和responsegetPrintWriter方法返回的PrintWriter對象非常類似,out對象是JspWriter類型,相當於帶了緩存功能的printWriter,實際上即便向out中寫入了內容,只有滿足如下之一才能將該內容寫入到Servlet引擎的緩存區中:

  1. 設置pagebuffer屬性關閉out的緩存功能,

  2. out的緩衝區已經滿了

  3. 刷新緩衝區

  4. 整個jsp頁面結束

<%

        out.write("hahahahaha<br/>");
        response.getWriter().write("wowowowowowo<br/>");
    %>



從效果上面已經可以看出來,JSPWriter對象中帶有的緩存效果了。

注意:記住不要同時使用outresponse.getWriter()輸出數據,原因上面已經說的很清楚了,最好是隻使用out對象來輸出數據。

pageContext隱式對象

pageContent對象是九大隱式對象中最重要的一個對象了,代表了JSP頁面的運行環境,這個對象不僅封裝了其他8大隱式對象的引用,自身也是一個域對象,可用於存放數據,它的生命週期就是這個jsp頁面的生命週期,執行的時候上來就會創建pageContext對象,但是jsp執行完了就會死亡。這個對象還封裝了web開發中經常涉及的一些常用操作,例如引入跳轉其它資源,檢索其它對象的屬性。

通過pageContext獲取其它隱式對象

getException方法返回exception隱式對象。

getPage方法返回page隱式對象。

getRequest方法返回request隱式對象。

getResponse方法返回response隱式對象。

getServletConfig方法返回config隱式對象。

getServletContext方法返回application隱式對象。

getSession方法返回session隱式對象。

getOut方法返回out隱式對象。

pageContext封裝其它8大內置對象的意義。
思考:如果在編程過程中,把pageContext對象傳遞給一個普通java對象,那麼這個java對象將具有什麼功能?
答:如果在編程過程中,把pageContext對象傳遞給一個普通java對象,那麼這個java對象將可以獲取8大隱式對象,此時這個java對象就可以和瀏覽器交互了,此時這個java對象就成爲了一個動態web資源了,這就是pageContext封裝其它8大內置對象的意義。把pageContext傳遞給誰,誰就能成爲一個動態web資源。
思考:那麼什麼情況下需要把pageContext傳遞給另外一個java類呢,什麼情況下需要使用這種技術呢
答:在比較正規的開發中,jsp頁面是不允許出現java代碼的(jsp頁面裏面是不能出現一行java代碼的,在軟件開發裏面,你要想你這個jsp是一個合格、良好的jsp的話,jsp頁面裏面是不準出現一行java代碼的),如果jsp頁面出現了java代碼,那麼就應該想辦法把java代碼移除掉。我們可以開發一個自定義標籤來移除jsp頁面上的java代碼,首先圍繞自定義標籤寫一個java類,jsp引擎在執行自定義標籤的時候就會調用圍繞自定義標籤寫的那個java類,在調用java類的時候就會把pageContext對象傳遞給這個java類,由於pageContext對象封裝了對其它8大隱式對象的引用,因此在這個java類中就可以使用jsp頁面中的8大隱式對象(requestresponseconfigapplicationexceptionSessionpageout)了,pageContext對象在jsp自定義標籤開發中特別重要。

pageContext作爲域對象

常用的方法

void setAttribute(String name , Object value)

ObjectgetAttribute(String name)

voidremoveAttribute(String name)

findAttribute(Stringname)---查找各個域中的屬性

findAttribute方法按照查找順序”page→request→session→application”在這四個對象中去查找,只要找到了就返回屬性值,如果四個對象都沒有找到要查找的屬性,則返回一個null

EL表達式語句在執行時,會調用pageContext.findAttribute方法,用標識符爲關鍵字,分別從pagerequestsessionapplication四個域中查找相應的對象,找到則返回相應對象,找不到則返回””(注意,不是null,而是空字符串


五、JSP標籤說明

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

jsp的常用標籤有以下三個:

<jsp:include>標籤

<jsp:forward>標籤

<jsp:param>標籤

<jsp:include>標籤

用於把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之爲動態引入。其語法爲:

page屬性用於指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得。

flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。

<jsp:forward>標籤

用於把請求轉發給另外一個資源。其語法爲:<jsp:forwardpage="relativeURL | <%=expression%>" />

在實際開發中,我們要爲網站設置首頁,訪問首頁時,我們要將數據交給Servlet進行處理,但我們又不能在項目的web.xml文件中配置一個servlet

解決方案是:在項目的web.xml中配置網站的首頁,如下:

	<welcome-file-list>
    		<welcome-file>/index.jsp</welcome-file>
	</welcome-file-list>

然後在index.jsp在使用jsp:forward標籤跳轉到Servlet,如下:

	<!-- <jsp:forward>標籤的應用場景 -->
  	<jsp:forward page="/IndexServlet"></jsp:forward>
	<jsp:param>標籤

當使用<jsp:include><jsp:forward>標籤引入或將請求轉發給其它資源時,可以使用<jsp:param>標籤向這個資源傳遞參數。

	語法1
	<jsp:include page="relativeURL | <%=expression%>">
   		<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
	</jsp:include>

語法2

	<jsp:forward page="relativeURL | <%=expression%>">
    		<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
	</jsp:include>
比如在1.jsp中導入
    <jsp:include page="/2.jsp">
        <jsp:param value="hello" name="parm1"/>
        <jsp:param value="world" name="parm2"/>
    </jsp:include>
那麼
    <h1>接收從IncludeTagTest2.jsp頁面中傳遞過來的參數:</h1>
    <h2><%=request.getParameter("parm1") %></h2>
    <h2><%=request.getParameter("parm2") %></h2>
就可以接收到1.jsp中傳遞過來的參數了

六、JSP中的四大作用域

JSP的四大作用域:pagerequestsessionapplication

這四大作用域,其實就是其九大內置對象中的四個,爲什麼說他們也是JSP的四大作用域呢?因爲這四個對象都能存儲數據,比如request.setAttribute()注意和request.setParameter()區分開來,一個是存儲在域中的、一個是請求參數,session.setAttribute()application其實就是SerlvetContext,自然也有setAttribute()方法。而page作用域的操作就需要依靠pageContext對象來進行了。在上面我們也有提到JSP的四大作用域,

page作用域:代表變量只能在當前頁面上生效

request:代表變量能在一次請求中生效,一次請求可能包含一個頁面,也可能包含多個頁面,比如頁面A請求轉發到頁面B

session:代表變量能在一次會話中生效,基本上就是能在web項目下都有效,session的使用也跟cookie有很大的關係。一般來說,只要瀏覽器不關閉,cookie就會一直生效,cookie生效,session的使用就不會受到影響。

application:代表變量能一個應用下(多個會話),在服務器下的多個項目之間都能夠使用。比如baiduwenku等共享帳號。

七、jsp標籤(標準標籤)

EL表達式

1、訪問相關的屬性(bean

訪問屬性的順序是:pageContextrequestsessionapplication。只要找到藍就會返回,沒有找到的話就會返回””---空字符串。

${user.name}或者${user["name"]}${user.interest[0]},可以訪問數組下標,要有get方法。

2、運算

  1. 算術運算+-×/

  2. 關係運算:><>=<= ==

  3. 邏輯運算:&&||

  4. empty運算:用來判斷集合是否爲空,或者是否是一個空字符串

JSRL核心標籤庫

	<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  1. if

<c:iftest="${user.gender == 'm'}" var="flag"scope="request"></c:if>  等價於request.setAttribute("flag",運行結果true/false)  ,scope可以寫page,session,application

  1. choose相當於if{}else{}else{}

when可以出現1次或者多次。當test屬性爲true時,會執行該分支。

otherwise可以出現0次或者1次。表示例外。

<c:choose>

    <c:whentest="${user.gender == 'm'}">

    </c:when>

    <c:whentest="${user.gender == 'f'}">

    </c:when>

    <c:otherwise>保密

    </c:otherwise>

  </c:choose>

3)forEach標籤,用來遍歷集合或者數組。每次從集合或者數組中取一個元素,然後將其綁定到pageContext上,綁定名由var屬性來指定。

<c:forEachitems="${userlist}" var="u" varStatus="s">

      <trclass="row${s.index%2+1}">  //css寫個row1row2class,表格行顏色互換

        <td>${u.name}</td>

        <td>${u.gender}</td>

        <td>${u.age}</td>

        <td>${s.index}</td>

        <td>${s.count}</td>

      </tr>     

    </c:forEach>

自定義標籤

八、總結

1、什麼是JSP

JSP本質上就是一個servlet,因爲servlet輸出html太麻煩了,所以就有了JSPJSP就是專門用來書寫html的,當然其中也能寫java代碼。

2JSP的內容包括什麼?

模版數據和元素。其中元素有包括腳本(java代碼)、指令(頁面屬性)、和行爲(標籤,爲了JSP中不嵌入那麼多java代碼衍生的)

3JSP中九大內置對象是哪九個?

九大內置對象, pageconfigapplictionrequestresponsesessionoutexceptionpageContext

4、九大內置對象和servlet中對象的關係

page就是jsp轉換爲servletservlet對象本身,也就是this

config-- Servlet中的servletConfig

application-- Servlet中的ServletContext

request  --Servlet中的request

response  --Servlet中的response

session  --Servlet中的session    

out  -- JspWriter

exception  --異常對象

pageContext  --表示 jsp頁面上下文(jsp管理者)類型:PageContext

其中pageContext對象最牛逼,有了他就擁有了天下,哈哈~

5JSP中的四大作用域。

 pagerequestsessionapplication

其中操作page域中屬性需要藉助pageContext對象。

6JSP中還有其他兩大塊內容

一個是EL表達式,很重要,

另一個是jstl標籤庫的使用

九、參考

http://blog.csdn.net/yerenyuan_pku/article/details/52015924

https://www.cnblogs.com/whgk/p/6427759.html  

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