JSP起源html
·在不少動態網頁中,絕大部份內容都是固定不變的,只有局部內容須要動態產生和改變。java
·若是使用Servlet程序來輸出只有局部內容須要動態改變的網頁,其中全部的靜態內容也須要程序員代碼產生,整個Servlet程序的代碼將很是浮腫,編寫和維護都將很是困難。程序員
·對大量靜態內容的美工設計和相關HTML語句的編寫,並非程序員所要作的工做,程序員對此也不必定在行。網頁美工設計和製做人員不懂Java編程,更是沒法來完成這樣的工做。web
·爲了彌補Servlet的缺陷,SUN公司在Servlet的基礎上推出了JSP(Java Server Pages)技術做爲解決方案。數據庫
·JSP是簡化Servlet編寫的一種技術,它將Java代碼和HTML語句混合在同一個文件中編寫,只對網頁中的要動態產生的內容採用Java代碼來編寫,而對固定不變的靜態內容採用普通靜態HTML頁面的方式編寫。express
創建對JSP的直觀認識apache
·JSP頁面是由HTML語句和嵌套在其中的Java代碼組成的一個普通文本文件,JSP頁面的文件擴展名必須爲.jsp。編程
·在JSP頁面中編寫的Java代碼須要嵌套在<%和%>中,嵌套在<%和%>之間的Java代碼被稱之爲腳本片斷(Scriptlets),沒有嵌套在<%和%>之間的內容被稱之爲JSP的模板元素。瀏覽器
·JSP中的Java代碼可使用out.println語句將其餘Java程序代碼產生的結果字符串輸出給客戶端,也可使用System.out.println語句將他們打印到命令行窗口。緩存
·JSP文件就像普通的HTML文件同樣,它們能夠防止在WEB應用程序中的除了WEB-INF及其子目錄外的其餘任何目錄中,JSP頁面的訪問路徑與普通HTML頁面的訪問路徑形式也徹底同樣。
·在JSP頁面中也可使用一種稱之爲JSP表達式的元素,只需將要輸出的變量或表達式直接封裝在<%=和%>之中,就能夠向客戶端輸出這個變量或表達式的運算結果。在JSP表達式中嵌套的變量或表達式後面不能有分號。
JSP的運行原理
·WEB容器(Servlet引擎)接受到以.jsp爲擴展名的URL的訪問請求時,它將把訪問請求交給JSP引擎去處理。
·每一個JSP頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet源程序,接着再把這個Servlet源程序翻譯成Servlet的class類文件,而後再由WEB容器(Servlet引擎)像調用普通Servlet程序同樣的方式來裝載和解釋執行這個有JSP頁面翻譯成的Servlet程序。
·JSP規範也沒有明確要求JSP中的腳本程序代碼必須採用Java語言,JSP中的腳本程序代碼能夠採用Java語言以外的其餘腳本語言來編寫,可是,JSP頁面最終必須轉換成Java Servlet程序。
·能夠在WEB應用程序正式發佈以前,將其中的全部JSP頁面預先編譯成Servlet程序。
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頁面的訪問路徑
<servlet>
<servlet-name>SimpleJspServlet</servlet-name>
<jsp-file>/jsp/simple.jsp</jsp-file>
<load-on-startup>1</load-on-startup >
</servlet>
……
<servlet-mapping>
<servlet-name>SimpleJspServlet</servlet-name>
<url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>
JSP與Servlet的應用比較
·JSP是一種
以產生網頁顯示內容爲中心的 WEB開發技術,它能夠直接使用模板元素來產生網頁文檔的內容。
·JSP網頁的源文件要比Servlet源文件簡單,而且JSP頁面的開發過程要比Servlet的開發過程簡單得多。
·JSP引擎能夠對JSP頁面的修改進行檢測,並自動從新翻譯和編譯修改過的JSP文件。
·JSP技術是創建在Servlet技術基礎之上的,全部的JSP頁面最終都要被轉換成Servlet來運行。
·在大型WEB應用程序的開發中,Servlet與JSP常常要混合使用,各司其職,Servlet一般用做控制組件,並處理一些複雜的後臺業務,JSP則做爲顯示組件。
·一次響應過程能夠劃分紅幾個功能模塊來協同完成,首先由Servlet完成流程控制和業務處理,並將結果數據存儲在Request或session域中,而後將請求轉發(forward)到JSP頁面,再由JSP頁面從Request或session域中取出結果數據並完成響應內容的輸出。經過這種方式實現業務邏輯與顯示內容的分離,從而將應用程序開發者和網頁做者的工做分離。
JSP基本語法
JSP模板元素
·JSP頁面中的靜態HTML內容稱之爲JSP模板元素,在靜態的HTML內容之中能夠嵌套JSP的其餘各類元素來產生動態內容和執行業務邏輯。
·JSP模板元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。
JSP表達式
·JSP表達式(expression)提供了將一個java變量或表達式的計算結果輸出到客戶端的簡化方式,它將要輸出的變量或表達式直接封裝在<%=和%>之中。
舉例:Current time: <%= new java.util.Date() %>
·JSP表達式中的變量或表達式的計算結果將被轉換成一個字符串,而後被插入進整個JSP頁面輸出結果的相應位置。
·JSP表達式中的變量或表達式後面不能有分號(;),JSP表達式被翻譯成Servlet程序中的一條out.print(...)語句。
JSP腳本片段
·JSP腳本片段(scriptlet)是指嵌套在<%和%>之中的一條或多條Java程序代碼。
·在JSP腳本片段中,能夠定義變量、執行基本的程序運算、調用其餘Java類、訪問數據庫、訪問文件系統等普通Java程序所能實現的功能。
·在JSP片段中能夠直接使用JSP提供的隱式對象來完成WEB應用程序特有的功能。
·JSP腳本片段中的Java代碼將被原封不動地搬移進由JSP頁面所翻譯成的Servlet的jspService方法中,因此,JSP腳本片段之中只能是符合Java語法要求的程序代碼,除此以外的任何文本、HTML標記、其餘JSP都必須在腳本片段以外編寫。
·JSP腳本片段中的Java代碼必須嚴格遵循Java語法,例如,每條命令執行語句後面必須用分號(;)結束。
·在一個JSP頁面中能夠有多個腳本片段(每一個腳本片段代碼嵌套在各自獨立的一對<%和%>之間),在兩個或多個腳本之間能夠嵌入文本、HTML標記和其餘JSP元素。
舉例:
<%
int x = 3;
%>
<p>這是一個HTML段落</p>
<%
out.println(x);
%>
·多個腳本片段中的代碼能夠相互訪問,猶如將全部的代碼放在一對<%%>之中的狀況。
舉例:上面的JSP內容與下面的JSP內容具備一樣的運行效果
<p>這是一個HTML段落</p>
<%
int x = 3;
out.println(x);
%>
·單個腳本片段中的Java語句能夠是不完整的,可是,多個腳本片段組合後的結果必須是完整的Java語句,例如,涉及條件和循環處理時,多個腳本片段及其餘元素組合的結果必須能造成完整的條件和循環控制語句。
·因爲腳本片段中的Java代碼將被原封不動地搬移進由JSP頁面所翻譯成的Servlet的JSPService方法中,腳本片段以外的任何文本、HTML標記以及其餘JSP元素也都會被轉換成響應的Java程序代碼插入進JSPService方法中,且腳本片段和其餘JSP元素的出入位置與JSP頁面中的原始位置相對應。
·在腳本片段中可使用條件、循環、選擇等流程控制語句來建立其周圍的其餘元素的執行邏輯,所以,在編寫JSP頁面時應考慮各個元素之間的前後順序和相互關係,特別是將循環、條件判斷等語句分佈在若干個腳本片段中編寫時對其鄰近的其餘JSP元素產生的影響。
JSP聲明
·JSP聲明將Java代碼封裝在<%!和%>之中,它裏面的代碼將被插入進Servlet的JSPService方法的外面,因此,JSP聲明可用於定義JSP頁面轉換成的Servlet程序的靜態代碼塊、成員變量和方法。
·多個靜態代碼塊、變量和函數能夠定義在一個JSP聲明中,也能夠分別單獨定義在多個JSP聲明中。
·JSP隱式對象的做用範圍僅限於Servlet的JSPService方法中,因此在JSP聲明中不能使用這些隱式對象。
·JSP腳本片段中的Java代碼必須嚴格遵循Java語法,例如,每條命令執行語句後面必須用分號(;)結束。
·在一個JSP頁面中能夠有多個腳本片段(每一個腳本片段代碼嵌套在各自獨立的一對<%和%>之間),在兩個或多個腳本片段之間能夠嵌入文本、HTML標記和其餘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!");
}
%>
<%
int localVar = 0;
%>
globalVar:<%= ++globalVar %><br>
localVar:<%= ++localVar %>
JSP註釋
·JSP註釋的格式
<%-- 註釋信息 --%>
·JSP引擎在將JSP頁面翻譯成Servlet程序時,忽略JSP頁面中被註釋的內容。
如何查找JSP頁面中的錯誤
·JSP頁面中的JSP語法格式有問題,致使其不能被翻譯成Servlet源文件,JSP引擎將提示這類錯誤發生在JSP頁面中的位置(行和列)以及相關信息。
·JSP頁面中的JSP語法格式沒有問題,但被翻譯成的Servlet源文件中出現了Java語法問題,致使JSP頁面翻譯成的Servlet源文件不能經過編譯,JSP引擎也將提示這類錯誤發生在JSP頁面中的位置(行和列)以及相關信息。
·JSP頁面翻譯成的Servlet程序在運行時出現異常,這與普通java程序的運行時錯誤徹底同樣,java虛擬機將提示錯誤發生在Servlet源文件中的位置(行和列)以及相關信息。
out隱式對象
·在JSP頁面中應使用out隱式對象來向客戶端發送文本形式的實體內容。
·out對象時經過調用pageContext對象的getOut方法返回的,起做用和用法與ServletResponse.getWriter方法返回的PrintWriter對象很是類似。
·JSP頁面中的out隱式對象的類型爲JSPWriter,JSPWriter至關於一種帶緩存功能的PrintWriter,設置JSP頁面的page指令的buffer屬性能夠調整它的緩存大小,甚相當閉它的緩存。
·JSP頁面中的out隱式對象至關於插入到ServletResponse.getWriter方法返回的PrintWriter對象前面的緩存包裝類對象。
·只有向out對象中寫入了內容,且知足以下任何一個條件時,out對象纔去調用ServletResponse.getWriter方法,並經過該方法返回的PrintWriter對象將out對象的緩存區內容真正寫到Servlet引擎提供的緩存區中:
public void forward(java.lang.String relativeUrlPath)
throws javax.servlet.ServletException,java.io.IOException
throws javax.servlet.ServletException,java.io.IOException
throws javax.servlet.ServletException,java.io.IOException
· 傳遞給這些方法的資源路徑都只能是相對路徑,若是路徑以「/」開頭,表示至關於當前WEB應用程序的根目錄,不然,表示相對於當前JSP所映射到的訪問路徑。
訪問各個域範圍中的屬性
·在application、session、request、PageContext對象中均可以調用setAttribute方法和getAttribute方法來設置和檢索各個域範圍內的屬性。
·存儲在application對象中的屬性能夠被同一個WEB應用程序中的全部Servlet和JSP頁面訪問。
·存儲在session對象中的屬性能夠被屬於同一個會話的全部Servlet和JSP頁面訪問。
·存儲在request對象中的屬性能夠被屬於同一個請求的全部Servlet和JSP頁面訪問,例如使用PageContext.forward和PageContext.include方法鏈接起來的多個Servlet和JSP頁面。
·存儲在PageContext對象中的屬性僅能夠被當前JSP頁面的當前響應過程當中調用的各個組件訪問,例如,正在響應當前請求的JSP頁面和它調用的各個自定義標籤類。
·PageContext類中還提供了對各個域範圍的屬性進行統一管理的方法,以簡化對各個域範圍內的屬性的訪問。
請求重定向與請求轉發
RequestDispatcher接口
·RequestDispatcher實例對象時由Servlet引擎建立的,它用於包裝一個要被其餘資源調用的資源(例如,Servlet、HTML文件、JSP文件等),並能夠經過其中的方法將客戶端的請求轉發給所包裝的資源。
·RequestDispatcher接口中定義了兩個方法:forward方法和include方法。
·forward和include方法接受的兩個參數必須是傳遞給當前Servlet的service方法的那兩個ServletRequest和ServletResponse對象,或者是對它們驚醒了包裝的ServletRequestWrapper或ServletResponseWrapper對象。
·獲取RequestDispatcher對象的方法:
sendRedirect 方法不只能夠重定向到當前應用程序中的其餘資源,它還能夠重定向到同一個站點上的其餘應用程序中的資源,甚至是使用絕對URL重定向到其餘站點的資源。
若是傳遞給sendRedirect 方法的相對URL以「/」開頭,則是相對於整個WEB站點的根目錄,而不是相對於當前WEB應用程序的根目錄。
請求重定向與請求轉發的比較
JSP指令簡介
·JSP指令(directive)是爲JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理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指令
<%@ include file="relativeURL"%>
其中的file屬性用於指定被引入文件的相對路徑。
http://localhost:8080/myweb/a.jsp
在a.jsp頁面中使用了以下語句引入b.jspf文件:
<%@ include file=「b.jspf」%>
請問:這時候JSP引擎調用的b.jspf文件的完整URL路徑爲何?
若是將a.jsp頁面映射爲以下地址:
http://localhost:8080/myweb/dir1/a.html
請問:這時候JSP引擎調用的b.jspf文件的完整URL路徑爲:
http://localhost:8080/myweb/b.jspf
http://localhost:8080/myweb/dir1/b.jspf
<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
page屬性用於指定被引入資源的相對路徑,它也能夠經過執行一個表達式來得到。
http://localhost:8080/myweb/a.jsp
在a.jsp頁面中使用了以下語句引入b.jsp文件:
<jsp:include page=「b.jsp" />
請問:這時候JSP引擎調用的b.jsp文件的完整URL路徑爲何?
若是將a.jsp頁面映射爲以下地址:
http://localhost:8080/myweb/dir1/a.html
請問:這時候JSP引擎調用的b.jsp文件的完整URL路徑爲:
http://localhost:8080/myweb/b.jspf
http://localhost:8080/myweb/dir1/b.jspf
<jsp:forward>標籤
<jsp:forward page="relativeURL | <%=expression%>" />
RequestDispatcher.forward方法、PageContext.forward方法、<jsp:forward>標
籤的區別
調用RequestDispatcher.forward方法的JSP腳本代碼的先後不能有JSP模版內容。
調用PageContext.forward方法的JSP腳本代碼的後面不能有JSP模版內容。
<Jsp:forward>標籤的先後都能有JSP模版內容。
<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
<jsp:forward page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
<jsp-config>
<jsp-property-group>
<url-pattern>/jsp/*</url-pattern>
<page-encoding>GB2312</page-encoding>
</jsp-property-group>
</jsp-config>
可能緣由:
strNew = new String(strOld.getBytes("ISO8859-1"),"GB2312");
診斷方法: