天天看點

JSP

原理

用戶端通路伺服器,無論是通路servlet,.jsp檔案或者.html檔案,其實都是在通路servlet。

對于html和圖檔 

.jsp在伺服器中被通路的時候,伺服器會先把jsp檔案翻譯成一個servlet,然後再去通路它。

比如Tomcat伺服器,會把翻譯好的jsp檔案對應的servlet放在其work的Catalina目錄下的:

F:\Tomcat 7.0\work\Catalina\localhost\jsp\org\apache\jsp\index_jsp.java

localhost是一個主機名,jsp是這個web應用的名,org\apache\jsp這個目錄結構是固定的,index_jsp.java名字中間的"_"相當于"."。

JSP頁面中的HTML内容稱之為JSP模闆元素。

<%=    %>專門用來輸出資料,稱為腳本表達式。對應源碼out.print();

<%    %>腳本片段,隻能出現java代碼,不能出現其他的模闆元素,代碼會被原封不動的放到Servlet的_jspService方法中。

<%!    %>JSP聲明會被放在service方法外面,service方法所屬類中,可以定義方法,聲明成員變量,寫靜态代碼塊等等。還可以覆寫類的方法,如public void jspInit(),public void jspDestroy()。

<%-- --%>JSP注釋 用JSP注釋的東西不會發送給浏覽器,而用HTML注釋的内容會發送給浏覽器。

伺服器中将JSP翻譯成servlet的程式,我們稱之為JSP引擎

JSP指令(directive)是為JSP引擎設計的,它們并不直接産生任何可見輸出,而隻是告訴引擎如何處理JSP頁面中的其餘部分。JSP2.0規範中共規定了三個指令:

page,include,taglib

其基本文法格式<%@ %>

舉例:<%@ page contentType="text/html;charset=gb2312" %>

同一個指令有多個屬性,可以分開寫也可以在一個指令中寫。

page指令:

無論page指令出現在JSP頁面中什麼位置,都是作用整個JSP頁面。

<%@ page

[ language="java" ]

[ extends="package.class" ]

[ import="{package.class | package.*}, ..." ]

[ session="true | false" ]

[ buffer="none | 8kb | sizekb" ]

[ autoFlush="true | false" ]

[ isThreadSafe="true | false" ]                                 置為false才是線程安全的implements singleThreadModel

[ info="text" ]                                                        可以通過info屬性帶的資訊

[ errorPage="relative_url" ]                                  指定當頁面出問題了,比如腳本片段裡面有1/0…跳到哪個頁面。errorPage屬性的設定值必須使用相對路徑,如果以“/”開頭,表示相對于目前WEB應用程式的根目錄(注意不是站點根目錄),否則,表示相對于目前頁面。

可以在web.xml檔案中使用<error-page>元素為整個WEB應用程式設定錯誤處理頁面,其中的<exception-type>子元素指定異常類的完全限定名,error-code也可以,<location>元素指定以“/”開頭的錯誤處理頁面的路徑。

如果設定了某個JSP頁面的errorPage屬性,那麼在web.xml檔案中設定的錯誤處理将不對該頁面起作用。

[ isErrorPage="true | false" ]   如果這個頁面是錯誤處理頁面顯式聲明為true。

設為true,jsp對應的servlet中會添加類似:

Throwable exception = org.apache.jasper.ruantime.JspRuntimLibrary.getThrowable(request);

if(exception != null){

     response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

}

這樣的代碼,把excepiton傳進來。我們可以直接在jsp中拿出來excepiton。

[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]

JSP引擎會根據page指令的contentType屬性生成相應的調用ServletResponse.setContentType方法的語句。

page指令的contentType屬性還具有說明JSP源檔案的字元編碼的作用。控制浏覽器以什麼格式打開

[ pageEncoding="characterSet | ISO-8859-1" ]     伺服器以什麼格式翻譯目前頁面。

[ isELIgnored="true | false" ]     是否忽略EL表達式,false不不忽略。EL表達式可以很友善的擷取域裡面資料。

%>

JSP 引擎自動導入下面的包:

java.lang.*

javax.servlet.*

javax.servlet.jsp.*

javax.servlet.http.*

include指令

靜态包含 編譯時包含

包含頁頭頁腳用。

<​​%@include file=”/public/foot.jsp” %​​>靜态包含包含的所有JSP會被翻譯成一個servlet。

注意頁頭頁尾檔案不要亂寫東西。

動态包含 運作時包含

<% request.getRequestDispacher(“/public/head.jsp”).include(request,response); %>

動态包含,每次都要重新去加載,速度慢一些。被包含的JSP會被翻譯成多個servlet。

taglib指令

用于導入标簽庫

 <​​%@taglib​​ uri="/struts-tags" prefix="s" %>

這句就是導入struts标簽庫,并使用别名s,以下就是使用示例。

<s:fielderror fieldName="name" theme="simple"/>

修改eclipse中jsp模闆參考目錄:F:\MyEclipse\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\templates\velocity\welcome