到目前為止學過了兩種包括其他 JSP 網頁至目前網頁的方式。一個是透過 include
指示元素,它在轉譯時期直接將另一 JSP 網頁合併至目前網頁進行轉譯,例如:
<%@include file="/WEB-INF/jspf/header.jspf"%>
另一個方式是透過 <jsp:include>
標籤,可於執行時期依條件,動態決定是否包括另一個網頁,該網頁執行完畢後,再回到目前網頁。在包括另一網頁時還可以帶有參數,例如:
<jsp:include page="add.jsp">
<jsp:param name="a" value="1" />
<jsp:param name="b" value="2" />
</jsp:include>
在 JSTL 中,有個 <c:import>
標籤,可以視作是 <jsp:include>
的加強版,它可以於執行時期動態匯入另一個網頁,也可以搭配 <c:param>
在匯入另一網頁時帶有參數。例如上面的 <jsp:include>
範例片段,也可以改寫為以下使用 JSTL 的版本:
<c:import url="add.jsp">
<c:param name="a" value="1" />
<c:param name="b" value="2" />
</c:import>
除了可以匯入目前 Web 應用程式中的網頁之外,<c:import>
標籤還可以匯入非目前 Web 應用程式中的網頁。例如:
<c:import url="https://openhome.cc" charEncoding="MS950"/>
其中 charEncoding
屬性用來指定要匯入的網頁之編碼,如果要被匯入的網頁編碼與目前網頁編碼不同,就必須使用 charEncoding
屬性加以指定,匯入的網頁才不致於產生亂碼。
再來介紹 <c:redirect>
標籤。在 Servlet╱JSP 中,如果要以撰寫程式的方式進行重新導向,必須使用 HttpServletResponse
的 sendRedirect()
方法。
<c:redirect>
標籤的作用,就如同 sendRedirect()
方法,如此你就不用撰寫 Scriptlet 來使用 sendRedirect()
方法,也可以達到重新導向的作用。如果重新導向時需要參數,也可以透過 <c:param>
來設定。
<c:redirect url="add.jsp">
<c:param name="a" value="1"/>
<c:param name="b" value="2"/>
</c:redirect>
我們曾經談過使用 response
的 encodeURL()
方法來作 URL 重寫,以在使用者關閉 Cookie 功能時,仍可以繼續利用 URL 重寫來維持使用 session 進行會話管理。
如果不想使用 Scriptlet 撰寫 response
的 encodeURL()
方法來作URL重寫,則可以使用 JSTL 的 <c:url>
,它會在使用者關閉 Cookie 功能時,自動用 Session ID 作 URL 重寫。例如:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<c:set var="count" value="${sessionScope.count + 1}" scope="session"/>
<html>
<head>
<meta charset="UTF-8">
<title>JSP Count</title>
</head>
<body>
<h1>JSP Count ${sessionScope.count} </h1>
<a href="<c:url value='count.jsp'/>">遞增</a>
</body>
</html>
當你關閉瀏覽器 Cookie 功能時,這個 JSP 網頁仍可以有計數功能。
如果需要在 URL 上攜帶參數,則可以搭配 <c:param>
標籤,參數將被編碼後附加在 URL 之上。例如就以下這個片段而言,最後的 URL 將成為 some.jsp?name=Justin+Lin
:
<c:url value="some.jsp">
<c:param name="name" value="Justin Lin"/>
</c:url>
留言列表