jsp詳解

什么是jsp?

很久之前,我們的網頁都是靜態的,就是我們所看到的頁面在編寫好之后總是唯一的。后來有人便提出動態頁面的概念,相應的就提出了Servlet。Servlet動態網頁技術,是可以把Java語言嵌入到HTML頁面上。那時候Servlet是個大忙人,它既要處理顯示效果,又要處理數據,又要處理頁面跳轉,耦合度高,不方便代碼維護,為了解決這個問題,SUN公司聯合其他公司制定了JSP動態網頁技術標準。事實上jsp是一個特殊的Servlet實例,它跟其他Servlet一樣被Servlet容器執行,在這之前它需要先被jsp容器轉換成Servlet,這個過程是在服務器端產生的,在第一次編譯之后該Servlet實例便常駐內存。

jsp的運行機制

  1. jsp容器判斷URL中對應的Servlet實例是否存在Servlet隊列,實則執行第五步,否則執行第二步。
  2. jsp容器將jsp文件轉換成Servlet源程序(.java)。
  3. jsp容器將Servlet源程序編譯成字節碼文件(.class)。
  4. Servlet容器加載字節碼,創建該Servlet實例(該實例實際是返回給客戶端的顯示效果),此時會調用jspInit()進行初始化。
  5. jsp容器將響應返回到到客戶端。

jsp基本語法

注釋

注釋有以下兩種:

  • HTML注釋:``,這種方法注釋在查看HTML源代碼時可以被顯示
  • jsp注釋:<%-- 注釋內容 --%>,通過這種方法注釋用戶是看不到的

jsp指令

jsp指令有以下三種:

  • page指令

  • include指令

  • taglib指令

  • page指令page指令稱為頁面指令,用來定義jsp頁面的全局屬性。語法格式如下:
    <%@ page [屬性="值" 屬性="值"]%>
    比較重要的屬性有以下幾種:

  • extends:指定jsp繼承的父類。

  • import:用于導入jsp需要的Java包。其中Java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*這幾個包本身已經被導入,無需再導入。

  • session:指定該jsp頁面是否可用session對象。

  • isThreadSafe:指定該jsp頁面是否支持多線程。

  • info:設置頁面的相關信息。可以用servlet.getServletInfo()獲取jsp頁面中的文本信息。

  • Errorpage:當jsp頁面出錯時,會調用該指令指定的錯誤處理頁面。

  • isErrorPage:指定jsp頁面能否進行異常處理。

  • contentType:指定頁面支持的編碼方式和響應的MIMe類型。默認為"text/html; charset = ISO-8859-1".

  • isELIgnored:指定是否支持EL表達式。

PS:導入多個包時用一個import指令,各個包之間用“,”隔開。

  • include指令include指令是加載文件指令,它在jsp被編譯前就將文件加載進jsp中合并成一個新的jsp文件,因此當該文件改變時,jsp要重新被編譯一次。include指令的格式如下:
    <%@ include file = "path"%>
    該指令只有一個屬性file,該指令用于指向要加載的文件的相對地址。

  • taglib指令taglib指令是用來引用標簽庫并設置標簽庫前綴,說白了就是自定義自己的jsp標記。格式如下:
    <%@ taglib uri="標簽庫地址" prefix = "標簽庫前綴" %>
    使用標記方式如下:
    <標簽庫前綴:標簽名 參數>

jsp腳本元素

jsp腳本元素有以下三種:

  • jsp聲明語句

  • jsp表達式

  • jsp Scriptlets

  • jsp聲明語句
    jsp聲明語句用于聲明變量和方法,在jsp聲明語句中聲明的變量和方法對作為servlet的成員變量,在整個頁面都有效。格式如下:
    <%! 聲明變量或方法 %>

  • jsp表達式
    jsp表達式要求該表達式存在一個確定的值,該值會被顯示在HTML頁面上。格式如下:
    <%= 表達式 %>

  • jsp Scriptlets
    jsp Scriptlets是一段java代碼段。當需要對頁面輸出內容進行一些復雜的操作的時候就需要用到jsp Scriptlets,在jsp Scriptlets聲明的變量在調用的時候分配內存,調用結束內存釋放。jsp Scriptlets格式如下:
    <% java代碼片段 %>

jsp動作元素

jsp動作元素有以下幾種:

  • <jsp:include>

  • <jsp:forward>

  • <jsp:param>

  • <jsp:plugin>

  • <jsp:useBean>

  • <jsp:setProperty>

  • <jsp:getProperty>

  • <jsp:include>是包含標簽,它跟包含指令不一樣。包含指令是將包含頁面整合進jsp頁面中再編譯。而包含元素包含的文件和jsp文件是兩個獨立的文件,在運行時單獨對包含文件進行編譯,把結果發送到客戶端。只有在運行jsp頁面的時候才會加載這些包含文件。格式如下:
    <jsp:include page="被包含的頁面" flush="true|false"></jsp:include>

    • page:是被包含的文件的相對地址。
    • flush:指定當緩沖區滿時,是否將其清空。默認值為false。
  • <jsp:forward>是重定向標簽,當代碼運行到該標簽會想客戶端發出響應,讓客戶端重新鏈接到指定的地址,之后的代碼不被執行。格式如下:
    <jsp:forward page="重定向的地址"></jsp:forward>

  • <jsp:param>是傳遞參數的標簽。它是以"名-值"對的形式來表示參數的。格式如下:
    <jsp:param name="參數名" value="參數值">

  • <jsp:include>包含的文件傳遞參數

<jsp:include page="page name" flush="false"> 
    <jsp:param name="parameter name" value="parameter value"></jsp:param>
    ...
</jsp:include>
  • <jsp:forward>頁面傳遞參數
<jsp:forward page="forward target"> 
    <jsp:param name="parameter name" value="parameter value"></jsp:param> 
    ...
</jsp:forward>

PS:<jsp:param>傳遞的參數就會以“名-值”對的形式傳遞到調用它的頁面中,參數的調用方法跟調用成員變量一樣直接通過變量名調用。

  • <jsp:plugin>可以將服務器端的javaBean或Applet下載到本地客戶端執行。語法格式如下:
<jsp:plugin type="bean|applet" code="classFileName" codeBase="classFileURL">
...
</jsp:plugin>
  • type:指定插件類型。是Bean還是Applet。

  • code:指定執行的類名。必須以擴展名".class"結尾。

  • codeBase:指定被執行的java類所在目錄。此外<jsp:plugin>
    相關的參數還有很多,這里只是舉例必不可少的三個。

  • <jsp:useBean>用來裝載一個將在jsp頁面中使用額javaBean。語法格式如下:

<jsp:useBean id="beanInstanceName" class="className" scope="page|request|session|application"></jsp:useBean>
  • id:指定javaBean的實例名。

  • class:指定javaBean的全限類名。

  • scope:指定javaBean的作用域。

    • page:指定javaBean實例只在本頁面有限。
    • request:指定JavaBean實例僅在本次請求有效。
    • session:指定javaBean實例在本次會話有效。
    • application:指定javaBean實例在本應用內一直有效。
  • <jsp:setProperty>用于設置Bean內屬性的值,它通過調用Bean的setter方法設置屬性值。語法格式如下:
    <jsp:setProperty name="beanInstanceName" property="propertyName" value="propertyValue"></jsp:setProperty>

  • <jsp:getProperty>用于獲取bean的屬性值。語法格式如下:
    <jsp:getProperty name="beanInstanceName" property="propertyName"></jsp:getProperty>

PS:bean中可以沒有屬性的聲明,但必須有setter和getter方法,因為<jsp:getProperty><jsp:setProperty>是通過調用bean實例中的setter方法和getter方法實現取值和賦值工作的。

jsp內置對象

jsp內置對象由jsp規范進行初始化,主要有以下幾種:

  • request

  • response

  • pageContext

  • session

  • application

  • out

  • config

  • page

  • exception

  • request對象用于封裝請求數據。一般用戶在表單填寫的數據會被封裝成request對象,通過post方法傳遞給目標頁面。request還相應提供了一些方法用于訪問這些數據。主要方法有以下幾個:

    • void setAttribute(attributeName, attributeValue):用于設置屬性值。
    • Object getAttribute(attributeName, attributeValue):用于獲取屬性值。
    • String getParameter("parameterName"):獲取參數值。
    • Enumeration getParameterNames():獲取所有的參數名的集合。
    • String[] getParameterValues("parameterName"):獲取parameterName的所有屬性值的數組。
    • Map getParameterMap():獲取所有屬性名和屬性值的Map對象。
    • void setCharacterEncoding():設置編碼格式。

PS:setAttribute和getAttribute方法在轉發時使用,當轉發一個頁面并傳遞參數時使用該方法設置和接受參數;其他方法主要用于獲取表單數據。

  • response對象用于封裝響應數據,其作用域是本頁面。相關方法如下:

    • void addCookie(Cookie cookie):添加一個Cookie對象,用于在客戶端保存特定信息。
    • void addHeader(name, value):添加一個HTTP頭信息,該頭信息會被發送到客戶端。
    • void containsHeader(name):判斷是否含有名為"name"的頭信息。
    • void sendError(int):向客戶端發送錯誤的狀態碼。
    • void sendRedirect(url):向客戶端發送重定向的url鏈接,讓客戶端跳轉到該鏈接。
    • void setContentType(contentType):設置MIME類型和編碼方式。
    • pageContext對象不僅可以設置page范圍的屬性,還可以設置其他范圍內的屬性。通過pageContext可以訪問request、response、out等對象。
  • session對象是會話對象,用來記錄每個客戶端的訪問狀態。session對象主要方法如下:

    • Object getAttribute(name):獲取session范圍內名為name的屬性值。
    • void setAttribute(name, value):設置session范圍內的屬性。
    • void removeAttribute(name):刪除session范圍內名為name的屬性。
    • Enumeration getAttributeNames():獲取session中保存的所有屬性名。
    • long getCreationTime():返回session被創建的時間。
    • String getId():返回session被創建時jsp容器分配的唯一標識。
    • long getLastAccessedTime():返回最后一次通過session發送請求的時間。
    • int getMaxInactiveInterval():返回session的失效時間,即兩次請求間隔多長時間該session被取消,單位為秒。
    • boolean isNew():判斷是否是新的session。
    • void invalidate():清空session內容。
  • application對象用于獲取和設置servlet相關信息,application的生命周期是從服務器啟動直到服務器關閉。主要方法如下:

  • void setAttribute(name, value):以"鍵-值"對的形式將一個對象的值存入application對象中。

  • Object getAttribute(name):獲取application中保存的屬性的值。

  • out對象是一個緩沖的輸出流,用來向客戶端返回信息。由于向客戶端輸出信息總是要連接,所以向客戶端輸出總是采用緩沖的形式。主要方法有以下幾個:

    • public abstract void clear() throws java.io.IOException:清除緩沖區的內容,但不將緩沖區的內容輸出到客戶端。
    • public abstract void clearBuffer() throws java.io.IOException:清除緩沖區的內容,且將緩沖區的內容輸出到客戶端。
    • public abstract void close() throws java.io.IOException:關閉輸出流并輸出緩沖區的數據。 - public abstract void flush() throws java.io.IOException:輸出緩沖區的數據。
    • public int getBufferSize():獲取緩沖區大小。
    • public abstract int getRemaining():獲取剩余緩沖區大小。
    • public boolean isAutoFlush():緩沖區是否進行自動清除。
    • public abstract void newLine() throws java.io.IOException:輸出一個換行符。
    • public abstract void print(String) throws java.io.IOException:打印信息。
    • public abstract void println(String) throws java.io.IOException:打印信息并換行。
  • config對象是ServletConfig類的一個實例,在servlet初始化時可以通過config對象想servlet傳遞信息。config常用的方法如下:

    • String getServletName():獲得servlet名稱。
    • ServletContext getServletContext():獲得一個包含服務器相關信息的ServletContext對象。
    • String getInitParameter(name):獲得servlet初始化參數。 - Enumeration getInitParameterNames():獲得servlet初始化時所有參數的名字的枚舉對象。
  • page對象是指當前的jsp頁面本身,他是java.lang.Object類的對象,通過page對象可以很方便地調用servlet中定義的方法。常用方法如下:

    • class getClass():返回當前的類名。
    • int getHashCode():返回當前類的哈希碼。
    • String toString():將此對象轉換成字符串。
    • boolean equals(object):比較兩個對象是否是相等。
    • void copy(object):將該對象復制到指定的object對象中。
  • exception對象java.lang.Throwable類的對象,用來處理頁面錯誤和異常。常用方法如下:

    • String getMessage():返回異常對象的異常信息。
    • String getLocalizedMessage():返回本地化語言的異常信息。
    • void printStackTrace():打印異常的棧反向追蹤痕跡。
    • String toString():返回異常的簡單描述。

PS:使用異常對象時,應將page的isErrorPage屬性設置為"true"。

javaBean的使用

javaBean是java語言描述的軟件組件模型,其實際是一個java對象,通過將業務邏輯和對數據庫的相關操作封裝成javaBean對象,實現了java代碼的復用,節省了程序員大量的寶貴時間。

javaBean的語法特征

  • JavaBean是一個public類。
  • JavaBean應當包含一個無參的構造函數。
  • JavaBean獲取或設置參數的方式都必須用標準的getter或setter函數,對于布爾型的屬性可以用isXxx()方法。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前面講了servlet入門實踐現在開始介紹jsp入門實踐,開發環境的搭建請參考我前面的tomcat的文章,jsp入...
    伊豚wall閱讀 3,384評論 2 56
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • JSP(Java Server Pages),其根本是一個簡化的 Servlet 設計,實現了在 Java 當中使...
    靜候那一米陽光閱讀 497評論 0 1
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,837評論 0 11
  • 丑奴兒·思夫山湖畔處 【作者】霍錦威 【朝代】21st 白發盡識愁滋味?厭上新舟。 厭上新舟。為守舊念強棄優。 孤...
    霍錦威Focus閱讀 277評論 0 4