Java for Web學習筆記(十三):JSP(3)Directive


屬性

import

我們在Java中需要import相關的類,在JSP也一樣,方式如下。多個引入可以用逗號進行份額,我們也可以采用寫import可以分開寫的方式。

<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*,java.io.IOException" %> 用逗號進行分隔或者寫多行
<%@ page import="java.util.Map" %>
<%@ page import="java.util.List" %>
<%@ page import="java.io.IOException" %>

Directive、declaration和scriptlet會輸出一個空行,如下所示。

為例避免太多的空行輸出,在書寫上通常首尾銜接,如下:

<%@ page import="java.util.Map"
%><%@ page import="java.util.List"
%><%@ page import="java.io.IOException" %>

pageEcoding

相當於在HttpServletResponse中設置setCharacterEncoding,例子:

<%@ page language="java"contentType="text/html"pageEncoding="UTF-8"%>

session

值為true或者false,表明JSP是否在HTTP sessions中,缺省為true。如果我們不需要session,刻意設置為false以提升性能。

isELIgnored

用於表明EL(Express Language)是否解析和翻譯。在JSP 2.0之前,缺省值是true,如果要使用EL,就必須設置為false,在JSP 2.0之后,缺省值為false。目前使用JSP2.3。

buffer和autoFlush

缺省值分布是8kb和true。Buffer是JSP輸出的緩存大小,可以設置為某kb或者none(none表示不緩存),autoFlush是buffer滿的時候,是否馬上輸出。如果buffer為none,autoFlush為false,則在翻譯為javacode的時候報異常,如果buffer為某個值,autoFlush為flash,如果緩存滿,則報異常。所以autoFlash一般都應采用缺省值true。

如果buffer="none",會馬上發送,效率會提高,但是也有缺點。在TCP的傳輸中,這回銷毀更多的帶寬。另外采用buffe的r,則可以在發送前(即buffer滿之前)就設置HTTP的headers,或進行重定向<jsp:forward/>,而沒有buffer,這些都必須在任何的write之前設定好,編程上會帶來某些不便。

isErrorPage

缺省為false,如果設置為true,會隱含Exception,如果頁面的Exception沒有被捕獲,將在該jsp中處理,當然我們也可以在web container中定義(web.xml)作為error的頁面。

isThreadSafe

缺省為true,表明jsp可以安全地給多個請求同時訪問。如果設置為false,只能one by one。一般不應修改此值。

extends

用於繼承的基類,但更換web container會有問題,不要使用。

我們可以參考http://www.jb51.net/article/73428.htm

在大多數的JSP中,一般會修改Content-Type(有時包括pageEncoding)的缺省值,此外session和isErrorPage可能是最多用的屬性,偶爾可能會關閉buffer,而其他的應該不進行修改。

包含其他JSP

在Servlet中通過include可以將兩個頁面結合,在JSP中也一樣,通過 include將另一個頁面結合過來:

靜態方式

<%@ includefile="/index.jsp" %>

如果是絕對路徑,就是在根目錄就是應用的webapp/,如果a.jsp位於WEB-INF/下,則路徑為/WEB-INF/a.jsp。如果相對路徑,就是相對本jsp的路徑而言。

如果引入的jsp已經包含了<%@ pagecontentType="text/html; charset=UTF-8" language="java"%>,那么在本jsp要么編寫,要么保證完全一模一樣,多個空格多不行,否則會報錯。下面就是在分號后面多了個空格,本質內容是一致的,也會報錯。

嚴重: Servlet.service() for servlet [jsp] in context withpath [/chapter04] threw exception [/index.jsp (line: 1, column: 2) Pagedirective:illegal to have multipleoccurrences of contentType with different values (old: text/html;charset=UTF-8, new: text/html;charset=UTF-8)] with root cause

org.apache.jasper.JasperException: /index.jsp (line: 1, column: 2) Page directive:illegal to have multiple occurrences of contentType with different values (old:text/html; charset=UTF-8, new: text/html;charset=UTF-8)

在翻譯的java代碼中,我們可以看到:

static {
_jspx_dependants = new java.util.HashMap<java.lang.String,java.lang.Long>(1);
_jspx_dependants.put("/index.jsp", Long.valueOf(1449717101338L));
}

在這個例子中,我們<%@ includefile="index.jsp" %>,采用了相對路徑,會被翻譯為絕對路徑,而index.jsp相關的內容,已經翻譯為java代碼合並進來。

動態方式

<jsp:includepage="/index.jsp" />

這沒有使用directive。我們在java代碼中可能看到區別:

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
……
try {
response.setContentType("text/html;charset=gb2312");
… …
out = pageContext.getOut();
jspx_out = out;

out.write('\n');
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "index.jsp",
out, false);
out.write("\n");
……
} catch(java.lang.Throwable t){
……
} finally {
……
}
……
}

這里並沒有引入index.jsp的代碼,而是在運行時臨時轉到相關的jsp進行輸出(寫response的content,沒有對於response進行設置),處理之后,回來繼續進行out輸出。由此,被引用jsp的不同屬性不影響到本jsp,例如本jsp的編碼可以設置為gd2312,而index.jsp為UTF-8。輸出的結果Content-Type:"text/html;charset=gb2312"。

一般而言,靜態方法的效率更高,所有引入jsp的都在視圖中,我們可以使用引用jsp在其declaration和scriptlet中的定義的類、變量和方法,但也用注意到不用重復定義。此外,java方法編譯為bytecode有大小限制,為65,534 bytes,靜態方法會導致_jspService()更大,不過一般不用擔心會超過這個大小。書推薦使用directive的方式,但我覺得從編程獨立性而言,使用動態方法無需擔心定義的歧義,似乎更好。*.jspf是jsp的fragment,提供include的內容,需要采用靜態方式,即directive include方式。

Tag庫

引入tag庫:

<%@ tagliburi="http://java.sun.com/jsp/jstl/core" prefix="c" %>

URI給出namespace,prefix給出別名,具體將在后面學習。


相關鏈接: 我的Professional Java for Web Applications相關文章


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com