JSP專題

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引擎提供的緩存區中:

 

1.設置page指令的buffer屬性關閉了out對象的緩存功能

 

2.寫入到out對象中的內容充滿了out對象的緩衝區

 

3.整個JSP頁面結束
 
out隱式對象的工做原理圖
 
 
pageContext對象簡介
 
·pageContext對象封裝了當前JSP頁面的運行信息, 它提供了返回JSP頁面的其餘隱式對象的方法
·pageContext類中定義了一個setAttribute方法來說對象存儲進pageContext對象內部的一個HashMap對象中,同時也定義了一個getAttribute方法來檢索存儲在該HashMap對象中的對象。
·PageContext類除了能夠存儲和檢索自身中的屬性對象外,還定義了能夠存儲和檢索其餘域範圍內的屬性對象的方法。
 
得到其餘隱式對象
 
•getException方法返回exception隱式對象
•getPage方法返回page隱式對象
•getRequest方法返回request隱式對象
•getResponse方法返回response隱式對象
•getServletConfig方法返回config隱式對象
•getServletContext方法返回application隱式對象
•getSession方法返回session隱式對象
•getOut方法返回out隱式對象 
 
引入和跳轉到其餘資源
 
·PageContext類中定義了一個forward方法和兩個include方法來分別簡化和替代RequestDispatcher.forward方法和RequestDispatcher.include方法的調用:
 

public void forward(java.lang.String relativeUrlPath)

  throws javax.servlet.ServletException,java.io.IOException

 

public void include(java.lang.String relativeUrlPath)

  throws javax.servlet.ServletException,java.io.IOException

 

public void include(java.lang.String relativeUrlPath,boolean flush)

  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類中還提供了對各個域範圍的屬性進行統一管理的方法,以簡化對各個域範圍內的屬性的訪問。

 

•setAttribute方法
public void setAttribute(java.lang.String name,java.lang.Object value)
public void setAttribute(java.lang.String name,  java.lang.Object value,int scope)
 
•常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
 
•getAttribute方法
public java.lang.Object getAttribute(java.lang.String name)
public java.lang.Object getAttribute(java.lang.String name,int scope)
 
•removeAttribute方法
public void removeAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name,int scope)
 
•getAttributeNamesInScope方法
 
•findAttribute方法    (*)

 

請求重定向與請求轉發

RequestDispatcher接口

·RequestDispatcher實例對象時由Servlet引擎建立的,它用於包裝一個要被其餘資源調用的資源(例如,Servlet、HTML文件、JSP文件等),並能夠經過其中的方法將客戶端的請求轉發給所包裝的資源。

·RequestDispatcher接口中定義了兩個方法:forward方法和include方法。

·forward和include方法接受的兩個參數必須是傳遞給當前Servlet的service方法的那兩個ServletRequest和ServletResponse對象,或者是對它們驚醒了包裝的ServletRequestWrapper或ServletResponseWrapper對象。

·獲取RequestDispatcher對象的方法:

ServletContext.getRequestDispatcher (參數只能是以「/」開頭的路徑)
ServletContext.getNamedDispatcher
ServletRequest.getRequestDispatcher (參數能夠是不以「/」開頭的路徑)
 
用sendRedirect方法實現請求重定向
  

  sendRedirect 方法不只能夠重定向到當前應用程序中的其餘資源,它還能夠重定向到同一個站點上的其餘應用程序中的資源,甚至是使用絕對URL重定向到其餘站點的資源。

      若是傳遞給sendRedirect 方法的相對URL以「/」開頭,則是相對於整個WEB站點的根目錄,而不是相對於當前WEB應用程序的根目錄。

 

請求重定向與請求轉發的比較

 

•RequestDispatcher.forward方法只能將請求轉發給 同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法還能夠重定向到 同一個站點上的其餘應用程序中的資源,甚至是使用絕對URL重定向到其餘站點的資源

 

•若是傳遞給HttpServletResponse.sendRedirect 方法的相對URL以「/」開頭,它是相對於整個WEB站點的根目錄;若是建立RequestDispatcher對象時指定的相對URL以「/」開頭,它是相對於當前WEB應用程序的根目錄。

 

•調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束後,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;調用RequestDispatcher.forward 方法的請求轉發過程結束後,瀏覽器地址欄保持初始的URL地址不變。

 

•HttpServletResponse.sendRedirect方法對瀏覽器的請求直接做出響應,響應的結果就是告訴瀏覽器去從新發出對另一個URL的訪問請求;RequestDispatcher.forward方法在服務器端內部將請求轉發給另一個資源,瀏覽器只知道發出了請求並獲得了響應結果,並不知道在服務器程序內部發生了轉發行爲。

 

•RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。
 

JSP指令簡介

·JSP指令(directive)是爲JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其他部分。

·JSP指令的基本語法格式:

  <%@ 指令屬性名="值" %>

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

  注意:屬性名部分是大小寫敏感的

•在目前的JSP 2.0中,定義了page、include和taglib這三種指令,每種指令中又都定義了一些各自的屬性。
•若是要在一個JSP頁面中設置同一條指令的多個屬性,可使用多條指令語句單獨設置每一個屬性,也可使用同一條指令語句設置該指令的多個屬性。

  第一種方式:

  <%@ 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頁面的起始位置。
 
 
include指令
 
•include指令用於通知JSP引擎在翻譯當前JSP頁面時將其餘文件中的內容合併進當前JSP頁面轉換成的Servlet源文件中,這種在源文件級別進行引入的方式稱之爲靜態引入,當前JSP頁面與靜態引入的頁面緊密結合爲一個Servlet。
•語法:

  <%@ include file="relativeURL"%>

  其中的file屬性用於指定被引入文件的相對路徑。 

•細節:
被引入的文件必須遵循JSP語法,其中的內容能夠包含靜態HTML、JSP腳本元素、JSP指令和JSP行爲元素等普通JSP頁面所具備的一切內容。
 
被引入的文件可使用任意的擴展名,即便其擴展名是html,JSP引擎也會按照處理jsp頁面的方式處理它裏面的內容,爲了見明知意,JSP規範建議使用.jspf(JSP fragments)做爲靜態引入文件的擴展名。
 
在將JSP文件翻譯成Servlet源文件時,JSP引擎將合併被引入的文件與當前JSP頁面中的指令元素(設置pageEncoding屬性的page指令除外),因此,除了import和pageEncoding屬性以外,page指令的其餘屬性不能在這兩個頁面中有不一樣的設置值。 
 
除了指令元素以外,被引入的文件中的其餘元素都被轉換成相應的Java源代碼,而後插入進當前JSP頁面所翻譯成的Servlet源文件中,插入位置與include指令在當前JSP頁面中的位置保持一致。
 
引入文件與被引入文件是在被JSP引擎翻譯成Servlet的過程當中進行合併,而不是先合併源文件後再對合並的結果進行翻譯。當前JSP頁面的源文件與被引入文件的源文件能夠採用不一樣的字符集編碼,即便在一個頁面中使用page指令的pageEncoding或contentType屬性指定了其源文件的字符集編碼,在另一個頁面中還須要用page指令的pageEncoding或contentType屬性指定其源文件所使用的字符集。
 
Tomcat 5.x在訪問JSP頁面時,能夠檢測它所引入的其餘文件是否發生了修改,若是發生了修改,則從新編譯當前JSP頁面
 
file屬性的設置值必須使用相對路徑,若是以「/」開頭,表示相對於當前WEB應用程序的根目錄(注意不是站點根目錄),不然,表示相對於當前文件。
 
•假設myweb應用程序的根目錄下有一個a.jsp文件,其通常的訪問路徑形式爲:

  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標籤--概念
 
·JSP還提供了一種稱之爲Action的元素,在JSP頁面中使用Action元素能夠完成各類通用的JSP頁面功能,也能夠實現一些處理浮渣業務邏輯的專用功能。
·Action元素採用XML元素的語法格式,即每一個Action元素在JSP頁面中都以XML標籤的形式出現。
·JSP規範中定義了一些標準的Action元素,這些元素的標籤名都以jsp做爲前綴,而且所有采用小寫,例如,<jsp:include>、<jsp:forward>等等。
 
<jsp:include>標籤
•<jsp:include>標籤用於把另一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之爲動態引入。
•語法:

<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />

page屬性用於指定被引入資源的相對路徑,它也能夠經過執行一個表達式來得到。

flush屬性指定在插入其餘資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。 
 
<jsp:include>標籤與include指令的比較
 
•<jsp:include>標籤是在當前JSP頁面的執行期間插入被引入資源的輸出內容,當前JSP頁面與被動態引入的資源是兩個彼此獨立的執行實體,被動態引入的資源必須是一個能獨立被WEB容器調用和執行的資源。include指令只能引入遵循JSP格式的文件,被引入文件與當前JSP文件共同合被翻譯成一個Servlet的源文件。
•使用<jsp:include>標籤和include指令均可以把一個頁面的內容分紅多個組件來生成,開發者沒必要再把頁眉和頁腳部分的相同HTML代碼複製到每一個JSP文件中,從而能夠更輕鬆地完成維護工做,可是都應注意最終的輸出結果內容應遵循HTML語法結構,例如,若是當前頁面產生了<html>、</html>、<body>、</body>等標記,那麼在被引入文件中就不能再輸出<html>、</html>、<body>、</body>等標記。
•<jsp:include>標籤對JSP引擎翻譯JSP頁面的過程不起做用,它是在JSP頁面的執行期間才被調用,所以不會影響兩個頁面的編譯。因爲include指令是在JSP引擎翻譯JSP頁面的過程當中被解釋處理的,因此它對JSP引擎翻譯JSP頁面的過程起做用,若是多個JSP頁面中都要用到一些相同的聲明,那麼就能夠把這些聲明語句放在一個單獨的文件中編寫,而後在每一個JSP頁面中使用include指令將那個文件包含進來。
 •<jsp:include>標籤使用page屬性指定被引入資源的相對路徑,而include指令使用file屬性指定被引入資源的相對路徑。
•假設myweb應用程序的根目錄下有一個a.jsp文件,其通常的訪問路徑形式爲:

  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>標籤用於把請求轉發給另一個資源。
•語法:

  <jsp:forward page="relativeURL | <%=expression%>" />

page屬性用於指定請求轉發到的資源的相對路徑,它也能夠經過執行一個表達式來得到。
 

RequestDispatcher.forward方法、PageContext.forward方法、<jsp:forward>標

籤的區別

調用RequestDispatcher.forward方法的JSP腳本代碼的先後不能有JSP模版內容。

調用PageContext.forward方法的JSP腳本代碼的後面不能有JSP模版內容。

<Jsp:forward>標籤的先後都能有JSP模版內容。

 
<jsp:param>標籤
•當使用<jsp:include>和<jsp:forward>標籤引入或將請求轉發給的資源是一個能動態執行的程序時,例如Servlet和JSP頁面,那麼,還可使用<jsp:param>標籤向這個程序傳遞參數信息。
•語法1:

  <jsp:include page="relativeURL | <%=expression%>">

  <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />

  </jsp:include>

•語法2:

  <jsp:forward page="relativeURL | <%=expression%>">

  <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />

  </jsp:include>

•<jsp:param>標籤的name屬性用於指定參數名,value屬性用於指定參數值。在<jsp:include>和<jsp:forward>標籤中可使用多個<jsp:param>標籤來傳遞多個參數。
 
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源文件的字符集編碼
 
在部署描述符中說明一組JSP源文件的字符集編碼

<jsp-config>

  <jsp-property-group>

  <url-pattern>/jsp/*</url-pattern>

  <page-encoding>GB2312</page-encoding>

  </jsp-property-group>

</jsp-config>

可能緣由:

•Servlet程序從請求消息中獲取請求參數和從數據庫、文件、鍵盤等外設中讀取一個字符串時都要將底層的字節流轉換成字符串,但轉換過程當中指定的字符集編碼與外設所輸入內容的字符集編碼不一致。若是某個第三方API將底層設備中的字節流數據老是按ISO8859-1轉換成字符串返回,那麼,對於底層設備中的GB2312編碼的中文字符來講,返回的將不是其正確的Unicode碼,這時候能夠經過以下語句來解決:

    strNew = new String(strOld.getBytes("ISO8859-1"),"GB2312");

•Servlet程序將字符串輸出到瀏覽器、屏幕、文件和數據庫時都要將字符串轉換成底層的字節流,但轉換過程當中指定的字符集編碼與外設所能顯示的字符集編碼不一致。
•JSP引擎將JSP源文件翻譯成Servlet源文件時,其選擇的字符集編碼與JSP源文件實際使用的字符集編碼不一致。
•JSP引擎編譯由JSP源文件翻譯成的Servlet 源文件時,其選擇的字符集編碼與Servlet 源文件的字符集編碼不一致。

診斷方法:

•使用System.out.println語句在命令行窗口中打印出現亂碼的字符串
•跟蹤某個中文字符在JSP頁面運行過程當中的每一個階段的編碼值   
相關文章
相關標籤/搜索