JSP - 隱藏物件和相關設定

在JSP頁面裡面有一些隱藏的物件。這些物件是jsp提供給你讓你能夠做到像在Servlet裡面一樣的事情,而我們這篇會個字介紹一下這些隱藏物件的作用和用法。

jsp像Servlet一樣,因此還記得我們在Servlet需要設定對應的route,而jsp預設是可以不用設定在web.xml裡面。可是,如果今天你希望透過設定的方式來設置 jsp頁面,這個也是可以的。

前言

在JSP頁面裡面有一些隱藏的物件。這些物件是jsp提供給你讓你能夠做到像在Servlet裡面一樣的事情,而我們這篇會個字介紹一下這些隱藏物件的作用和用法。

jsp像Servlet一樣,因此還記得我們在Servlet需要設定對應的route,而jsp預設是可以不用設定在web.xml裡面。可是,如果今天你希望透過設定的方式來設置 jsp頁面,這個也是可以的。

隱藏物件

jsp總共有9個隱藏物件。這邊我會一個一個介紹,不過詳細內容,例如有什麼方法就需要你自己在有用到的時候去查詢。我這邊提供的是一個方向,讓你在查詢的時候更方便。

9個物件的名稱分別是:

  1. out
  2. request
  3. response
  4. config
  5. page
  6. session
  7. application
  8. pageContext
  9. exception

out

看到out這一個大家應該馬上就想到我們在Servlet要輸出的時候所取得的那個out。沒錯,這邊的out是javax.servlet.jsp.JspWriter的object,而它主要的作用就是讓我們在Scriptlet裡面可以輸出內容到畫面上面。那些靜態內容,其實就和你在Scriptlet呼叫out輸出沒有兩樣。

request

這個和Servlet一樣,request通常放入的是我們從客戶端接受到的內容。例如取得這個request的Session(request.getSession()),取得QueryString(getParameter) ,getAttribute等等。

request是javax.servlet.ServletRequest的object。

response

response也和Servlet一樣,主要是處理返回資訊相關。例如設定cookie,取得out的對象,設定response的http status code等。

response是javax.servlet.ServletResponse的object。

config

我們稍後會提到如何把jsp設定到web.xml裡面,就像設定Servlet一樣。而還記得Servlet有預設參數,jsp也有。因此透過confg能夠取得init parameter,而我們也可以透過config取得ServletContext。

config屬於javax.Servlet.ServletConfig class。

page

page其實代表著就是目前這個jsp頁面的object。可以把它想像成this的關鍵字。

session

就如同名字一樣,session是用來存取此使用者的Session。他和request.getSession()取得是一樣的,只不過有一個object方便操作。

還記得我們之前說的page directive element。裡面有一個參數叫做session。如果設為false,就不會有session這個隱藏物件。

session是javax.Servlet.http.HttpSession

application

application就是我們在Servlet裡面用getServletContext()取得的object。而透過他,我們可以取得web.xml裡面的context param。

application屬於javax.Servlet.ServletContext。

page屬於javax.Servlet.jsp.HttpJspPage

pageContext

pageContext代表著這一整個jsp頁面的context。他的主要目的是提供一個單一的api(pageContext)讓開發者可以取得所有這一個page相關的,不管是request,session 等。同時它能夠一次搜索4個scope(page、request、session和application)的內容(使用pageContext.getAttribute())。

它屬於javax.Servlet.jsp.PageContext。

exception

還記得我們再講page directive element的時候有提到一個叫做isErrorPage的attribute。假設某一頁是設為true,那麼他就會有exception這個隱藏物件。

exception就會存放別的頁面exception沒有接住以後導入這一頁的內容,這樣就可以顯示friendly message和做一些記錄。

設定jsp

我們可以同Servlet一樣的方式設定jsp頁面的連接,同時jsp也有提供用來專門設定jsp頁面的element在web.xml裡面。

設定jsp的url

同Servlet一樣,只不過這次<Servlet-Class>變成<jsp-file>:

<servlet>
	<servlet-name>jsp</servlet-name>
	<jsp-file>/HelloWorld.jsp</jsp-file>
	<init-param>
		<param-name>default</param-name>
		<param-value>this is a default value</param-value>
	</init-param>
</servlet>

<servlet-mapping>
	<servlet-name>jsp</servlet-name>
	<url-pattern>/jsp.html</url-pattern>
</servlet-mapping>
這邊注意到,我們現在可以用我們定義的url pattern來看到這一個jsp,同時也可以用原來的url讀到。

<jsp-config>element

jsp-config 提供了一種批次設定jsp的辦法。

在jsp-config裡面總共有兩個子element:

  1. <taglib> - 設定自己定義的tag的tld位置
  2. <jsp-property-group> - 批次設定jsp頁面的一些設定

<taglib>

還記得我們在taglib directive element提到可以自定義taglib嗎?這個設定就是讓我們把自己定義的taglib取一個uri和指定那個taglib的位置。

注意:在jsp2.0之後的container(例如Tomcat 5.5之後),這個設定不是必須的。因為現在Tomcat會自動去WEB-INF下面找對應的taglib。

這個下面總共有兩個子element,一個是<taglib-uri> -用來定義我們在jsp頁面用taglib directive element 加入我們自己的taglib所輸入uri的位置, <taglib-location>放taglib(*.tlb)的位置。

範例:

web.xml:
<jsp-config>
	<taglib>
		<taglib-uri>myTag</taglib-uri >
		<taglib-location>/WEB-INF/tlds/sample.tld</taglib-location>
	</taglib>
</jsp-config>

jsp:
<%@ taglib prefix="c" uri="myTag"  %>

<jsp-property-group>

這邊主要是有一個 <url-pattern> -輸入想要設定的jsp對應,然後做一些相關設定,範例如下:

<jsp-config>
	<jsp-property-group>
		<url-pattern>*.jsp </url-pattern>   <!-- 受影響的jsp頁面。這邊是所有的jsp -->
		<el-ignored>true</el-ignored>		<!-- 是否忽略el -->
		<page-encoding>utf-8</page-encoding><!-- 預設頁面encoding -->
		<scripting-invalid>true</scripting-invalid><!-- 是否忽略scriptlet -->
		<include-prelude>header.jspf</include-prelude><!-- 在jsp前加入此頁 - 同等 include -->
		<include-coda>footer.jspf</include-coda><!-- 在jsp後加入此頁 - 同等 include -->
	</jsp-property-group>
</jsp-config>

這邊都有用註解解釋每一個的作用。需要注意的是這邊不是所有的選項,詳細還要看相關文件。

結語

這一篇屬於補全jsp一些之前沒有提到的東西,希望透過這一篇對於jsp的使用能夠更得心應手。

Dotblogs 的標籤:

Google+

創用 CC 授權條款
Alan Tsai 的隨手筆記Alan Tsai製作,以創用CC 姓名標示 4.0 國際 授權條款釋出。