一.JSP簡單介紹 1.什麼是JSP? JSP全稱是Java Server Pages,它和servle技術一樣,都是SUN公司定義的一種用於開發動態web資源的技術。 JSP這門技術的最大的特點在於,寫jsp就像在寫html,但它相比html而言,html只能為用戶提供靜態數據,而Jsp技術允許在頁面中嵌套java代碼,為用戶提供動態數據。 注:關於eclipse jsp 智能提示 在使用eclipse開發時,較新版本的往往沒有智能提示,我這裡是4.3版本的j2ee eclipse,是有jsp files選項的,如下圖所示: 網上很多方法都已經過時,這裡解決方法為: 在項目的Properties -> Java Build Path -> Libraries -> Add Library -> Server Runtime裡選入所需的庫(需要配置服務器,我的是tomcat服務器)即可。 2.JSP原理 原理是動態編譯java程序,對數據處理還是用的servlet.可以參見tomcat源碼學習. 二.JSP語法及常用指令 1.JSP模版元素 JSP頁面中的HTML內容稱之為JSP模版元素。 JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。 2.JSP表達式 JSP腳本表達式(expression)用於將程序數據輸出到客戶端 語法:<%= 變量或表達式 %> 舉例:當前 JSP引擎在翻譯腳本表達式時,會將程序數據轉成字符串,然後在相應位置用out.print(…) 將數據輸給客戶端。 JSP腳本表達式中的變量或表達式後面不能有分號(;)。 3.JSP腳本片斷 JSP腳本片斷(scriptlet)用於在JSP頁面中編寫多行Java代碼。語法: <% 多行java代碼 %> 注意:JSP腳本片斷中只能出現java代碼,不能出現其它模板元素, JSP引擎在翻譯JSP頁面中,會將JSP腳本片斷中的Java代碼將被原封不動地放到Servlet的_jspService方法中。 JSP腳本片斷中的Java代碼必須嚴格遵循Java語法,例如,每執行語句後面必須用分號(;)結束。 在一個JSP頁面中可以有多個腳本片斷,在兩個或多個腳本片斷之間可以嵌入文本、HTML標記和其他JSP元素。 舉例: 復制代碼 <% int x = 10; out.println(x); %> <p>這是JSP頁面文本</p> <% int y = 20; out.println(y); %> 復制代碼 多個腳本片斷中的代碼可以相互訪問,猶如將所有的代碼放在一對<%%>之中的情況。如:out.println(x); 單個腳本片斷中的Java語句可以是不完整的,但是,多個腳本片斷組合後的結果必須是完整的Java語句,例如: 復制代碼 <% for (int i=1; i<5; i++) { %> <H1>hi,amos</H1> <% } %> 復制代碼 4.JSP聲明 讓jsp擁有自己的方法,除了jsp內部已有的對象.這個極少有人用. JSP頁面中編寫的所有代碼,默認會翻譯到servlet的service方法中, 而Jsp聲明中的java代碼被翻譯到_jspService方法的外面。語法: <%! java代碼 %> 所以,JSP聲明可用於定義JSP頁面轉換成的Servlet程序的靜態代碼塊、成員變量和方法 。 多個靜態代碼塊、變量和函數可以定義在一個JSP聲明中,也可以分別單獨定義在多個JSP聲明中。 JSP隱式對象的作用范圍僅限於Servlet的_jspService方法,所以在JSP聲明中不能使用這些隱式對象。 例如: 復制代碼 <%! static { System.out.println("loading Servlet!"); } private int globalVar = 0; public void jspInit() { System.out.println("initializing jsp!"); } %> <%! public void jspDestroy() { System.out.println("destroying jsp!"); } %> 復制代碼 5.JSP注釋 JSP注釋的格式: <%-- 注釋信息 --%> JSP引擎在將JSP頁面翻譯成Servlet程序時,忽略JSP頁面中被注釋的內容。 6.JSP指令 JSP指令(directive)是為JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其余部分。在JSP 2.0規范中共定義了三個指令: page指令 Include指令 taglib指令 1)page指令用於定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什麼地方,它作用的都是整個JSP頁面,為了保持程序的可讀性和遵循良好的編程習慣,page指令最好是放在整個JSP頁面的起始位置。 可以在一條page指令的import屬性中引入多個類或包,其中的每個包或類之間使用逗號分隔: <%@ page import="java.util.Date,java.sql.*,java.io.*"%> 上面的語句也可以改寫為使用多條page指令的import屬性來分別引入各個包或類: <%@ page import="java.util.Date"%> <%@ page import="java.sql.*"%> <%@ page import="java.io.*"%> JSP 引擎自動導入下面的包: java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.* JSP 2.0規范中定義的page指令的完整語法: 復制代碼 <%@ page [ language="java" ] 指定語言為java [ extends="package.class" ] 指定繼承的類 [ import="{package.class | package.*}, ..." ] //指定引入的包 [ session="true | false" ] //默認session為true,表示內置存在session對象,可以直接調用,如果沒有,也可以通過request.getSession()獲取 [ buffer="none | 8kb | sizekb" ] //緩存默認為8kb [ autoFlush="true | false" ] //緩存默認自動清空 [ isThreadSafe="true | false" ] //是否是線程安全的,默認是true,就是是否支持多線程調用. [ info="text" ] //提示信息 [ errorPage="relative_url" ] errorPage 的意思是設置當前頁面要引入錯誤頁面。也就是浮面當前頁面如果出現錯誤就會跳轉到errorPage所指定的頁面。 [ isErrorPage="true | false" ] //當前頁面是否是錯誤頁面,默認為false [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] //設置頁面內容編碼 [ pageEncoding="characterSet | ISO-8859-1" ] //當前頁面編碼 [ isELIgnored="true | false" ] //是否支持EL表達式 %> 復制代碼 注:1.JSP引擎會根據page指令的contentType屬性生成相應的調用ServletResponse.setContentType方法的語句。 page指令的contentType屬性還具有說明JSP源文件的字符編碼的作用。 2.errorPage屬性的設置值必須使用相對路徑,如果以“/”開頭,表示相對於當前WEB應用程序的根目錄(注意不是站點根目錄),否則,表示相對於當前頁面。 可以在web.xml文件中使用<error-page>元素為整個WEB應用程序設置錯誤處理頁面,其中的<exception-type>子元素指定異常類的完全限定名,<location>元素指定以“/”開頭的錯誤處理頁面的路徑。 如果設置了某個JSP頁面的errorPage屬性,那麼在web.xml文件中設置的錯誤處理將不對該頁面起作用。