原理
用戶端通路伺服器,無論是通路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