網頁匯入、重新導向、URL 處理標籤


到目前為止學過了兩種包括其他 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 中,如果要以撰寫程式的方式進行重新導向,必須使用 HttpServletResponsesendRedirect() 方法。

<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>

我們曾經談過使用 responseencodeURL() 方法來作 URL 重寫,以在使用者關閉 Cookie 功能時,仍可以繼續利用 URL 重寫來維持使用 session 進行會話管理。

如果不想使用 Scriptlet 撰寫 responseencodeURL() 方法來作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>