在JSP頁面裡面有一些隱藏的物件。這些物件是jsp提供給你讓你能夠做到像在Servlet裡面一樣的事情,而我們這篇會個字介紹一下這些隱藏物件的作用和用法。
jsp像Servlet一樣,因此還記得我們在Servlet需要設定對應的route,而jsp預設是可以不用設定在web.xml裡面。可是,如果今天你希望透過設定的方式來設置 jsp頁面,這個也是可以的。
(和我部落格同時發佈:http://www.dotblogs.com.tw/alantsai/archive/2013/10/09/jsp-setting_and_availableobjects.aspx)
隱藏物件
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的使用能夠更得心應手。