JSP隱式對象
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, ServletException
{
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
...
...
Throwable exception =
org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
JSP語法
JSP模版元素
JSP頁面中的HTML內容稱之為JSP模版元素。
JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。
JSP腳本表達式(expression)用於將程序數據輸出到客戶端
語法:<%= 變量或表達式 %>
舉例:當前時間:<%= new java.util.Date() %>
JSP引擎在翻譯腳本表達式時,會將程序數據轉成字符串,然後在相應位置用out.print(…) 將數據輸給客戶端。
JSP腳本表達式中的變量或表達式後面不能有分號(;)。
JSP腳本片斷(1)
JSP腳本片斷(scriptlet)用於在JSP頁面中編寫多行Java代碼。語法:
<%
多行java代碼
%>
注意:JSP腳本片斷中只能出現java代碼,不能出現其它模板元素, JSP引擎在翻譯JSP頁面中,會將JSP腳本片斷中的Java代碼將被原封不動地放到Servlet的_jspService方法中。
JSP腳本片斷中的Java代碼必須嚴格遵循Java語法,例如,每執行語句後面必須用分號(;)結束。
JSP腳本片斷(2)
在一個JSP頁面中可以有多個腳本片斷,在兩個或多個腳本片斷之間可以嵌入文本、HTML標記和其他JSP元素。
舉例:
<%
int x = 10;
out.println(x);
%>
<p>這是JSP頁面文本</p>
<%
int y = 20;
out.println(x);
%>
多個腳本片斷中的代碼可以相互訪問,猶如將所有的代碼放在一對<%%>之中的情況。如:out.println(x);
JSP腳本片斷(3)
單個腳本片斷中的Java語句可以是不完整的,但是,多個腳本片斷組合後的結果必須是完整的Java語句,例如:
<%
for (int i=1; i<5; i++)
{
%>
<H1>www.it315.org</H1>
<%
}
%>
JSP聲明
JSP頁面中編寫的所有代碼,默認會翻譯到servlet的service方法中, 而Jsp聲明中的java代碼被翻譯到_jspService方法的外面。語法:
<%!
java代碼
%>
所以,JSP聲明可用於定義JSP頁面轉換成的Servlet程序的靜態代碼塊、成員變量和方法 。
多個靜態代碼塊、變量和函數可以定義在一個JSP聲明中,也可以分別單獨定義在多個JSP聲明中。
JSP隱式對象的作用范圍僅限於Servlet的_jspService方法,所以在JSP聲明中不能使用這些隱式對象。
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!");
}
%>
JSP注釋
JSP注釋的格式:
<%-- 注釋信息 --%>
JSP引擎在將JSP頁面翻譯成Servlet程序時,忽略JSP頁面中被注釋的內容。
注釋
有三種注釋方式
HTML注釋(輸出注釋):指在客戶端查看源代碼時能看見注釋。例如,
<!-- this is an html comment.it will show up int the response. -->
JSP頁注釋(隱藏注釋):指注釋雖然寫在JSP程序中,但不會發送給客戶,因此在客戶端查看源代碼時不能看見注釋。這樣的注釋在JSP編譯時被忽略掉。
<%--this is a JSP comment.it will only be seen in jsp code--%>
Java注釋:只能出現在Java代碼區中,不允許直接出現在頁面中。//單行注釋 /*多行注釋*/
實例練習—JiuJiudemo
創建一個Web Project工程。
編寫index1.jsp頁面,頁面中提供兩個輸入文本框,用來收集用戶提交的數據,並提供“提交”和“取消”按鈕,方便用戶提交或取消相應的操作。
編寫result1.jsp頁面,根據用戶提交的數字,顯示基於這個數字所形成的乘法表。
JSP指令
JSP指令(directive)是為JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其余部分。在JSP 2.0規范中共定義了三個指令:
page指令
Include指令
taglib指令
JSP指令簡介
JSP指令的基本語法格式:
<%@ 指令 屬性名="值" %>
舉例:<%@ page contentType="text/html;charset=gb2312"%>
如果一個指令有多個屬性,這多個屬性可以寫在一個指令中,也可以分開寫。
例如:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>
也可以寫作:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
Page指令
page指令用於定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什麼地方,它作用的都是整個JSP頁面,為了保持程序的可讀性和遵循良好的編程習慣,page指令最好是放在整個JSP頁面的起始位置。
JSP 2.0規范中定義的page指令的完整語法:
<%@ page
[ language="java" ]
[ extends="package.class" ]
[ import="{package.class | package.*}, ..." ]
[ session="true | false" ]
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ]
[ info="text" ]
[ errorPage="relative_url" ]
[ isErrorPage="true | false" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ pageEncoding="characterSet | ISO-8859-1" ]
[ isELIgnored="true | false" ]
%>
使用page指令解決JSP中文亂碼
JSP程序存在有與Servlet程序完全相同的中文亂碼問題
輸出響應正文時出現的中文亂碼問題
讀取浏覽器傳遞的參數信息時出現的中文亂碼問題
JSP引擎將JSP頁面翻譯成Servlet源文件時也可能導致中文亂碼問題
JSP引擎將JSP源文件翻譯成的Servlet源文件默認采用UTF-8編碼,而JSP開發人員可以采用各種字符集編碼來編寫JSP源文件,因此,JSP引擎將JSP源文件翻譯成Servlet源文件時,需要進行字符編碼轉換。
如果JSP文件中沒有說明它采用的字符集編碼,JSP引擎將把它當作默認的ISO8859-1字符集編碼處理。
如何解決JSP引擎翻譯JSP頁面時的中文亂碼問題
通過page指令的contentType屬性說明JSP源文件的字符集編碼
page指令的pageEncoding屬性說明JSP源文件的字符集編碼
include指令
include指令用於引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那麼JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之為靜態引入。
語法:
<%@ include file="relativeURL"%>
其中的file屬性用於指定被引入文件的路徑。路徑以“/”開頭,表示代表當前web應用。
細節:
被引入的文件必須遵循JSP語法。
被引入的文件可以使用任意的擴展名,即使其擴展名是html,JSP引擎也會按照處理jsp頁面的方式處理它裡面的內容,為了見明知意,JSP規范建議使用.jspf(JSP fragments)作為靜態引入文件的擴展名。
由於使用include指令將會涉及到2個JSP頁面,並會把2個JSP翻譯成一個servlet,所以這2個JSP頁面的指令不能沖突(除了pageEncoding和導包除外)。
taglib指令
Taglib指令用於在JSP頁面中導入標簽庫,講自定義標簽技術時講
JSP運行原理和九大隱式對象
每個JSP 頁面在第一次被訪問時,WEB容器都會把請求交給JSP引擎(即一個Java程序)去處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet) ,然後按照servlet的調用方式進行調用。
由於JSP第一次訪問時會翻譯成servlet,所以第一次訪問通常會比較慢,但第二次訪問,JSP引擎如果發現JSP沒有變化,就不再翻譯,而是直接調用,所以程序的執行效率不會受到影響。
JSP引擎在調用JSP對應的_jspServlet時,會傳遞或創建9個與web開發相關的對象供_jspServlet使用。JSP技術的設計者為便於開發人員在編寫JSP頁面時獲得這些web對象的引用,特意定義了9個相應的變量,開發人員在JSP頁面中通過這些變量就可以快速獲得這9大對象的引用。
這9個對象分別是哪些,以及作用也是筆試經常考察的知識點。
JSP九大隱式對象
Request
Response
Session
Application
Config
Page
exception
Out
pageContext