原文地址:
http://www.cnblogs.com/rollenholt/archive/2011/07/04/2097376.html
http://www.cnblogs.com/jy02414216/archive/2011/02/16/1956106.html
http://blog.csdn.net/ybyb14/article/details/1882693
http://developer.51cto.com/art/200902/109939_1.htm (五種JSP跳轉的方式)
JSP 組成概要
一個JSP頁面主要由注釋(Comment)、指令(Directives)、腳本元素(Declaration,Scriptlet,Expression).動作元素(Action)的內容組成。
1.注釋包括HTML注釋和JSP隱藏注釋。
2.指令包括:
(1)page:用來定義整個JSP頁面的屬性和相關功能。
(2)include:用來指定JSP文件被編譯時需要插入的資源,可以是文本、代碼、HTML文件或JSP文件。
(3)taglib:頁面使用者用來自定義標簽。
3.腳本元素
(1)聲明:用來定義在程序中使用的實體,它是一段Java代碼,可以聲明變量,也可以聲明方法。格式:<%! 開始聲明 %> 例如:<%! int i;%>。
(2)表達式:格式:<%=表達式%> 最后是沒有分號的.例如:<%=1+2+3%>。
(3)Scriptlet:格式:<%java代碼%>。
4.在JSP中的動作指令包括:Include、 Forward、 UseBean、 GetProperty、 SetProperty、 Plugin。
(1)include指令:表示包含一個靜態的或者動態的文件。子句能讓你傳遞一個或多個參數給動態文件,也可在一個頁面中使用多個指令來傳遞多個參數給動態文件。
(2)forward指令:表示重定向一個靜態html/jsp的文件,或者是一個程序段。
(3)Plugin指令:用於在瀏覽器中播放或顯示一個對象(典型的就是Applet和Bean),而這種顯示需要瀏覽器的Java插件。一般來說,元素會指定對象是Applet還是Bean,同樣也會指定class的名字和位置,另外還會指定將從哪里下載這個Java插件。
(4)useBean指令:表示用來在JSP頁面中創建一個Bean實例並指定它的名字以及作用范圍。
(5)setProperty指令:用來為一個Bean的屬性賦值。若在jsp:useBean后使用,jsp:setProperty將被執行。若jsp:setProperty出現在jsp:useBean標簽內,jsp:setProperty只會在新的對象被實例化時才將被執行。注意name值應當和useBean中的id值相同。
(6)getProperty指令:表示獲取Bean的屬性的值並將之轉化為一個字符串,然后將其插入到輸出的頁面中
Jsp詳解
在JSP頁面中,可分為JSP程序代碼和其他程序代碼兩部分。JSP程序代碼全部寫在<%和%>之間,其他代碼部分如JavaScript和HTML代碼按常規方式寫入。換句話說,在常規頁面中插入JSP元素,即構成了JSP頁面。
JSP工作原理
當客戶端請求瀏覽JSP頁面時,JSP服務器在把頁面傳遞給客戶端之前,先將JSP頁面編譯成Servlet(純Java代碼),然后由Java編譯器生成的服務器小程序編譯為Java字節碼,最后再轉換成純HTML代碼,這樣客戶端接收到的只是HTML代碼。
JSP到Servlet的編譯過程一般在第一次頁面請求時進行。因此,如果希望第一個用戶不會由於JSP頁面編譯成Servlet而等待太長的時間,希望確保Servlet已經正確地編譯並裝載,你可以在安裝JSP頁面之后自己請求一下這個頁面。
JSP頁面結構
JSP程序的成分主要有如下四種:注釋(Comment)、指令(Directive)、腳本元素(Scripting Element)、動作(Action)。JSP指令用來從整體上控制Servlet的結構;腳本元素用來嵌入Java代碼,這些Java代碼將成為轉換得到的Servlet的一部分;動作用來引入現有的組件或者控制JSP引擎的行為。
為了簡化腳本元素,JSP定義了一組由容器實現和管理的對象(內置對象)。這些內置對象在JSP頁面中可以直接使用,不需要JSP頁面編寫者實例化。通過存取這些內置對象,可以實現與JSP頁面Servlet環境的互訪。
注釋
和其他的程序語言一樣,JSP也同樣提供注釋語句。JSP注釋分為HTML注釋和隱藏注釋兩種。JSP隱藏注釋語句在JSP頁面執行的時候會被忽略,不會執行。並且注釋語句信息不會被送到客戶端的瀏覽器中,也就是說,用戶通過查看源文件是無法看到這些注釋信息的,所以稱之為隱藏注釋。HTML注釋和JSP注釋的不同之處在於HTML注釋在客戶端瀏覽器能通過查看源文件而被查看到。
1. JSP隱藏注釋
JSP注釋語句的語法:
<%--comment--%>
【例4.2】文件comment.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>測試JSP的注釋語句</title>
</head>
<body>
<h2>測試JSP注釋語句</h2>
<%-- 這是一些注釋信息,不會在查看網頁源文件的時候看到 --%>
</body>
</html>
還有一種使用Java注釋機制的注釋方法:
<% /**comment */ %>
在使用的時候,一定要注意<%--和--%>必須成對出現,否則會編譯出錯。
2. HTML注釋
HTML注釋語句的語法:
<!-- comment [ <%= expression %> ] -->
例如:
<!--該注釋可以被查看-->
在客戶端的HTML源代碼中產生和上面一樣的數據:
<!--該注釋可以被查看-->
又例如:
<!--該頁面生成於 <%= (new java.util.Date()).toLocaleString() %> -->
在客戶端的HTML源代碼中顯示為:
<!--該頁面生成於October 15, 2006 -->
這種注釋和HTML語言很像,它可以在“查看源代碼”中看到。唯一有些不同的就是,你可以在這個注釋中使用表達式。這個表達示是不定的,由頁面不同而不同,你能夠使用各種表達式,只要是合法的就行。
JSP指令
在JSP頁面中,可以使用JSP指令來指定頁面的有關輸出方式、引用包、加載文件、緩沖區、出錯處理等相關設置,主要作用是用來於JSP引擎之間進行溝通。
JSP指令常用以下形式:
<%@ directive attribute=”value”%>
可以將多個屬性寫在一個語句中:
<%@ directive attribute1="value1" attribute2="value2" attributeN="valueN" %>
主要的三種指令是page include指令taglib,下面對三種指令進行詳細說明。
4.3.1 page指令
在JSP文件中,可以通過<%@ page %>命令定義整個JSP頁面的屬性,通過這個命令定義的屬性會對該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" ]
[ info="text" ]
[ errorPage="relativeURL" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ isErrorPage="true | false" ]
%>
下面是使用Page命令的幾個小例子:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" buffer="5kb" autoFlush="false" errorPage=" error.jsp " %>
通過Page命令,你可以為整個JSP頁面定義上面提到的全局屬性,其中除了“import”之外,其他的都只能引用一次,import屬性和Java語言中的import非常相似,可以在JSP頁面中多次使用它。
關於<%@ page %>的位置可以不去考慮,放在任何地方都可以很好的工作,但出於良好的編程習慣,建議放在JSP頁面的頂部。幾乎所有的JSP頁面頂部都可以找到指令page。
1.language屬性
定義JSP頁面使用的腳本語言,若使用JSP引擎支持Java以外的語言,可指定所使用的語言種類。默認語言為Java
language=”java”
指明JSP文件中使用的腳本語言,目前只能使用Java。
2.contentType屬性
contentType屬性定義了JSP頁面字符編碼和頁面響應的MIME類型。默認的MIME類型是text/html,默認的字符集是ISO-8859-1。例如:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" %>
3.import屬性
該屬性用於JSP引入Java包中的類,如果你要包含多個包的話,將這些包的名稱用逗號隔開放在一個import中,或者使用多個import分別聲明。它是唯一可以多次指定的屬性。
在使用Java包中的元素之前一定要先聲明該包的import引用。下面一些Java包,是默認包含的,不用再在JSP頁面中聲明。
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
4.extends屬性
定義此JSP頁面產生的Servlet是繼承自哪個父類。請特別謹慎使用這一功能,因為,服務器也許已經定義了一個。JSP規范對不完全理解其隱意的情況下使用此屬性提出警告。
5.isErrorPage屬性
isErrorPage="true|false"
默認值為“true”,設置是否顯示錯誤信息。如果為true,可以看到出錯信息,如果為false,就看不到了。
6.errorPage屬性
errorPage="relativeURL"
設置處理異常事件的JSP文件的位置。表示如果發生異常錯誤,網頁會被重新指向一個URL頁面。錯誤頁面必須在其page指令元素中指定isErrorPage="true"。
7.session屬性
session="true|false"
默認值為“true”,定義是否在JSP頁面使用HTTP的session。如果值為true,則可以使用session對象;如果值為false,那么JSP頁面就不被加入到session中,session內置對象則不能使用,而同時會造成Bean的scope屬性值只能是“page”。
8.Buffer屬性
buffer="none|8kb|sizekb"
為內置對象out指定發送信息到客戶端瀏覽器的信息緩存大小。以kb為單位。默認值是8kb.你也可以自行指定緩存的大小。也可以設置為“none”,那么就沒有緩沖區,所有的輸出都不經緩存而直接輸出。
9.autoFlush屬性
autoFlush="true|false"
指定是否當緩存填滿時自動刷新,輸出緩存中的內容。如果為true,則自動刷新。否則,當緩存填滿后,可能會出現嚴重的錯誤。當你把buffer設置為none時,就不能將autoFlush設置為false。
10.isThreadSafe屬性
isThreadSafe="true|false"
指定JSP頁面是否支持多線程訪問。默認值是ture,表示可以同時處理多個客戶請求,但是你應該在JSP頁面中添加處理多線程的同步控制代碼。如果設置為false,JSP頁面在一個時刻就只能響應一個請求。
11.info屬性
info="text"
指定任何一段字符串,該字符串被直接加入到翻譯好的頁面中。可以通過Servlet.getServletInfo()方法得到。
4.3.2 include指令
Include指令的功能是在JSP編譯時插入包含的文件。包含的過程是靜態的。它可以把內容分成更多可管理的元素,如包括普通頁面的頁眉或頁腳的元素。包含的文件可以是JSP、HTML、文本或是Java程序。
include指令的語法:
<%@ include file="relativeURL" %>
其中只有一個file屬性,這個屬性指定了被包含文件的路徑。
如果路徑是以"/"開頭的,那么這個路徑應該就是相對於JSP應用程序上下文而言的。而如果以目錄名或文件名開頭則是以JSP文件所在路徑為當前路徑而言。例如:
"header.jsp"
"/templates/onlinestore.html"
"/beans/calendar.jsp"
在JSP中,你可以用Include指令將JSP文件,HTML文件,或Text文件包含到一個JSP文件中,這種包含是靜態包含,也就是說當使用這種方法包含文件的時候,會將被包含文件的內容插入包含文件中,替換掉<%@ include %>這行語句。如果你包含的是一個JSP文件,那么包含在這個文件中的JSP程序將被執行。
當你使用Include包含一個文件的時候,一定要注意,在被包含文件中不能含有<html>,</html>,<body>,</body>等HTML元素,否則的話會導致執行錯誤。因為被包含的文件會整個加入到JSP文件中去,這些標記會與JSP文件中類似的標記相沖突。
使用包含文件有以下一些優點:
(1)被包含文件可以在多個文件中被使用,實現了代碼共享和重用。
(2)當被包含文件修改后,包含此文件的JSP文件的執行結果也發生變化,這樣就提高修改效率,為維護提供方便。
【例4.3】
include.jsp
<html>
<head><title>An Include Test</title></head>
<body bgcolor="white">
The current date and time are
<%@ include file="date.jsp" %>
</font>
</body>
</html>
date.jsp
<%@ page import ="java.util.*" %>
<%= (new java.util.Date()).toLocaleString() %>
上面的例子在執行后,會在客戶端的瀏覽器中顯示和下面類似的信息:
The current date and time are
Aug 30,1999 2:38:40
4.3.3 taglib指令
taglib指令的功能是使用標簽庫定義新的自定義標簽,在JSP頁面中啟用定制行為。
taglib指令的語法:
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>
例如
<%@ taglib uri="http://www.jspcentral.com/tags" prefix="public" %>
<public:loop>
</public:loop>
<% @ taglib %>指令聲明此JSP文件使用了自定義的標簽,同時引用標簽庫,也指定了標簽的前綴。
這里自定義的標簽有標簽和元素之分。因為JSP文件能夠轉化為XML,所以了解標簽和元素之間的聯系很重要。標簽只不過是一個在意義上被抬高了點的標記,是JSP元素的一部分。JSP元素是JSP語法的一部分,和HTML一樣有開始標記和結束標記。元素可以包含其它的文本,標記,元素。使用自定義標簽之前必須使用<% @ taglib %>指令,而且可以在一個頁面中多次使用,但是同一前綴只能引用一次。
URI根據標簽的前綴對自定義的標簽進行唯一的命名prefix="tagPrefix",在自定義標簽前的前綴,比如,在<public:loop>中的public,如果不寫public,就是不合法的。請不要用jsp, jspx, java, javax, servlet, sun, 和sunw作為前綴。
JSP腳本元素
JSP腳本元素用來插入Java代碼,這些Java代碼將出現在由當前JSP頁面生成的Servlet中。腳本元素有三種格式:聲明格式<%! declaration; %>,其作用是把聲明加入到Servlet類(在任何方法之外);表達式格式<%= expression %>,作用是計算表達式並輸出其結果;Scriptlet格式<% code %>,作用是把代碼插入到Servlet的service方法。
4.4.1 JSP聲明
JSP聲明用來聲明JSP程序中的變量、實例、方法和類。聲明是以<%!為起始,以%>結尾。在JSP程序中,在使用一個變量或引用一個對象的方法和屬性前,必須先對使用的變量和對象進行聲明。聲明后,你才可以在后面的程序中使用它們。
JSP的聲明可以讓你定義頁面一級的變量以保存信息或定義該JSP頁面可能需要的方法。其內容必須是一個采用page指令所定義的語言編寫和完整有效的聲明。JSP內置對象在聲明元素中不可見,此時聲明的變量作為編譯單元的成員變量處理。
其語法如下:
<%! declaration; %>
例如:
<%! int i=0; %>
<%! int a,b,c; %>
注意:
1.編譯JSP時,腳本小程序生成於jspService()方法的內部,而聲明卻生成於jspService()方法之外,與源文件合成一體。使用<%! %>方式所聲明的變量為全局變量,即表示若同時n個用戶在執行此JSP網頁時將會共享此變量。因此應盡量少用聲明變量,若要使用變量時,請直接在scriptlet之中聲明使用即可。
2.每一個聲明僅在一個頁面中有效,如果你想每個頁面都用到一些聲明,最好把它們寫成一個單獨的JSP頁面或單獨的Java類,然后用<%@ include %>或<jsp:include >動作元素包含進來。
由於聲明不會有任何輸出,因此它們往往和JSP表達式或腳本小程序結合在一起使用。例如,下面的JSP代碼片斷輸出自從服務器啟動(或Servlet類被改動並重新裝載以來)當前頁面被請求的次數:
<%! private int accessCount = 0; %>
自從服務器啟動以來頁面訪問次數為:
<%= ++accessCount %>
4.4.2 JSP表達式
JSP表達式用來計算輸出Java數據,表達式的結果被自動轉換成字符型數據,結果可以作為HTML的內容,顯示在瀏覽器窗口中。JSP表達式包含在“<%= %>”標記中,不以分號結束,除非在加引號的字符串部分使用分號。開始字符和結束字符之間必須是一個完整合法的Java表達式。可以是復雜的表達式,在處理這個表達式的時候按照從左向右的方式來處理。
其語法如下:
<%= expression %>
例如:
<%= i %>
<%= "Hello" %>
<%= a+b %>
下面的代碼顯示頁面被請求的日期/時間:
當前時間為:<%= new java.util.Date() %>
為簡化這些表達式,JSP預定義了一組可以直接使用的對象變量。內置對象在表達式中可見。對於JSP表達式來說,最重要的幾個內置對象及其類型如下,后面我們將詳細介紹這些內置對象。
(1)request:HttpServletRequest。
(2)response:HttpServletResponse。
(3)session:和request關聯的HttpSession。
(4)out:PrintWriter,用來把輸出發送到客戶端。
例如:
Your hostname: <%= request.getRemoteHost() %>
4.4.3腳本小程序
如果要完成的任務比簡單的表達式復雜時,可以使用JSP腳本小程序(Scriptlet)。腳本小程序中可以包含有效的程序片段,只要是合乎Java本身的標准語法即可。通常我們核心程序都寫在這里,是我們實際編寫的JSP程序的主要部分。
JSP腳本小程序的語法如下:
<% Java Code %>
由於JSP和其他一些嵌入式語言一樣,都會嵌在HTML語言內部使用,所以JSP頁面中是由一段一段的JSP程序嵌在HTML語言里面組成的。腳本小程序能夠包含要用到的變量或方法的聲明和表達式。和JSP表達式一樣,腳本小程序可以訪問所有內置對象,所有的內建對象在小腳本中可見。例如,如果你要向結果頁面輸出內容,可以使用out變量。
<%
String queryData = request.getQueryString();
out.println("Attached GET data: " + queryData);
%>
注意:在程序段中定義的變量是局部變量,且程序段中的“表達式”必須使用“;”作為結束符,程序片段並不局限於一行代碼中。
編譯JSP時,編譯器在jspService()方法中只簡單地不作修改地包含腳本小程序的內容。當Web服務器響應請求時,Java代碼就會運行。在腳本片段周圍可能有純粹的HTML代碼,在這些地方,代碼片段可以使你創建執行代碼的條件,或調用另外的代碼片段。
例如,下面的JSP片斷混合了HTML語言和腳本小程序:
<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>
上述JSP代碼將被轉換成如下Servlet代碼:
if (Math.random() <0.5) {
out.println("Have a <B>nice</B> day!");
}
Else
{
out.println("Have a <B>lousy</B> day!");
}
【例4.4】 num.jsp
<html>
<head>
<title>JSP程序段</title>
</head>
<%@ page contentType="text/html;charset=GB2312" %>
<body>
<%
double num=0;
num=20;
if(num>10)
{ %> <%/*這里體現了JSP與HTML的結合*/%>
<h2>num的值大於10</h2> <%/*不屬於JSP的這段HTML用%>……<%隔開*/%>
<%
}
else out.println("num的值小於10");
%>
</body>
</html>
運行結果:num的值大於10
例如,以下的代碼組合使用表達式和代碼片段,顯示H1、H2、H3和H4標記中的字符串“Hello”。代碼片段並不局限於一行源代碼:
<% for (int i=1; i<=4; i++) { %>
<H<%=i%>>Hello</H<%=i%>>
<% } %>.
JSP動作
JSP動作利用XML語法格式的標記來控制Servlet引擎的行為。動作組件用於執行一些標准的常用的JSP頁面。利用JSP動作可以動態地插入文件、重用JavaBean組件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼。
JSP動作元素包括:
jsp:include:當頁面被請求時引入一個文件。
jsp:forward:請求轉到一個新的頁面。
jsp:plugin:根據瀏覽器類型為Java插件生成OBJECT或EMBED標記。
jsp:useBean:尋找或者實例化一個JavaBean。
jsp:setProperty:設置JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
4.5.1 include動作元素
<jsp:include>動作元素表示在JSP文件被請求時包含一個靜態的或者動態的文件。
語法:
<jsp:include page="path" flush="true" />
其中,page="path"表示相對路徑,或者為相對路徑的表達式。flush="true"表示緩沖區滿時會被清空,一般使用flush為true,它默認值是false。
例如:
inc.jsp
<%= 2 + 2 %>
test.jsp
Header
<jsp:include page="inc.jsp"/>
Footer
運行結果:4
【例4.5】 下面的JSP頁面把4則新聞摘要插入到 “WhatsNew.jsp”頁面。改變新聞摘要時只需改變new文件夾下的四個具體新聞文件,而主JSP頁面卻可以不作修改:
WhatNews.jsp
<HTML>
<HEAD>
<TITLE>What's New</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
VLINK="#551A8B" ALINK="#FF0000">
<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
<TR><TH class="TITLE">
What's New at JspNews.com</TABLE>
</CENTER>
<P>
Here is a summary of our four most recent news stories:
<OL>
<LI><jsp:include page="news/Item1.html" flush="true"/>
<LI><jsp:include page="news/Item2.html" flush="true"/>
<LI><jsp:include page="news/Item3.html" flush="true"/>
<LI><jsp:include page="news/Item4.html" flush="true"/>
</OL>
</BODY>
</HTML>
一般而言,不能直接從文件名稱上來判斷一個文件是動態的還是靜態的。但是<jsp:include>能夠自行判斷此文件是動態的還是靜態的,於是能同時處理這兩種文件。如果包含的只是靜態文件,那么只是把靜態文件的內容加到JSP網頁中;如果包含的是動態文件,那么把動態文件的輸出加到JSP網頁中。被包含的動態文件和主文件會被JSP Container分別編譯執行。
前面已經介紹過include指令,它是在JSP文件被轉換成Servlet的時候引入文件,而這里的jsp:include動作不同,插入文件的時間是在頁面被請求的時候。jsp:include動作的文件引入時間決定了它的效率要稍微差一點,而且被引用文件不能包含某些JSP代碼(例如不能設置HTTP頭),但它的靈活性卻要好得多。
include指令是在JSP文件執行時被轉換成Servlet的時候,將被包含文件調入到主文件,然后二者一起被JSP容器編譯,產生一個Servlet.
<jsp:include>動作是在JSP文件被請求時,被包含文件和主文件分別被JSP容器編譯,產生兩個Servlet,然后將被包含文件的Servlet調入到主文件的Servlet中。因此同樣引入文件,使用include指令要比使用<jsp:include>動作的響應速度快。
4.5.2 forword動作元素
<jsp:forward>將客戶端所發出來的請求,從一個JSP頁面轉交給另一個頁面(可以是一個 HTML文件,JSP 文件,PHP文件,CGI文件,甚至可以是一個Java程序段。
語法:
<jsp:forward page={"relativeURL"|"<%= expression %>"}/>
page屬性包含的是一個相對URL。page的值既可以直接給出,也可以在請求的時候動態計算,如下面的例子所示:
<jsp:forward page="/utils/errorReporter.jsp" /.>
<jsp:forward page="<%= someJavaExpression %>" />
有一點要特別注意,<jsp:forward>標簽之后的程序將不能被執行。
例如
<%
out.println("會被執行!!! ");
%>
<jsp:forward page="other.jsp" />
<%
out.println("不會執行!!!");
%>
上面這個范例在執行時,會打印出“會被執行!!!”,隨后馬上會轉入到other.jsp的網頁中,至於out.println("不會執行!!! ")將不會被執行。
【例4.6】該實例需要四個文件:login.jsp,test.jsp,ok.htm,no.htm
首先看一下login.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" errorPage="" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<body>
<center>
<form method=get action="test.jsp">
username<input type=text name=username>
<br><br>
password<input type=password name=password>
<br><br>
<input type=submit value="確定">
</form>
</center>
</body>
</html>
test.jsp代碼如下:
<html>
<%
string username=request.getparameter("username");
if(username.trim().equals("abc"))
{%>
<jsp:forward page="ok.html" />
<%}
else
{%>
<jsp:forward page="no.html" />
<%}
%>
</html>
ok.htm和no.htm非常簡單,可以分別寫為:
<html>ok</html>
<html>no</html>
運行效果是當你輸入用戶名為abc時,頁面會自動跳轉到ok.htm頁面,否則跳到no.htm頁面。
4.5.3 plugin動作元素
jsp:plugin動作用來根據瀏覽器的類型,插入通過Java插件運行Java Applet所必需的OBJECT或EMBED元素。
語法:
<jsp:plugin
type="bean|applet"
code="classFileName"
codebase="classFileDirectoryName"
[name="instanceName"]
[align="bottom|top|middle|left|right"]
[height="displsyPixels"]
[width="displsyPixels"]
[hspace="leftRightPixels"]
[vspace="topButtomPixels"]
[jreversion="java的版本"]
[<jsp:params>
[<jsp:param name="parameterName" value="參數的值"/>]
</jsp:params>]
[<jsp:fallback> 這里是在不能啟動插件的時候,顯示給用戶的文本信息</jsp:fallback>]
</jsp:plugin>
Plugin中的各個屬性如下:
(1)type="bean|applet"
插件將執行的對象的類型,必須指定。
(2)code="classFileName"
插件將執行的java類文件的名稱,在名稱中必須包含擴展名,且此文件必須在用"codebase"屬性指明的目錄下。
(3)codebase="classFileDirectoryName"
包含插件將運行的java類的目錄或指相對這個目錄的路徑。
4.5.4. param動作元素
param動作元素用於傳遞參數。我們還可以使用<jsp:param>將當前JSP頁面的一個或多個參數傳遞給所包含的或是跳轉的JSP頁面。該動作元素必須和<jsp:include>、<jsp:plugin>、<jsp:forward>動作一起使用。
和<jsp:include>一起使用的語法如下:
<jsp:include page="相對的URL值"|"<% =表達式%> " flush="true">
<jsp:param name="參數名1" value="{參數值|<%=表達式 %>}"/>
<jsp:param name="參數名2" value="{參數值|<%=表達式 %>}"/>
</ jsp:include>
和<jsp: forward>一起使用的語法如下:
<jsp:forward page="path"} >
<jsp:param name="paramname" value="paramvalue" />
</jsp:forward>
<jsp:param>中name指定參數名,value指定參數值。參數被發送到一個動態文件,參數可以是一個或多個值。要傳遞多個參數,則可以在一個jsp文件中使用多個<jsp:param>將多個參數發送到一個動態文件中。如果用戶選擇使用<jsp:param>標簽的功能,那么被重定向的目標文件就必須是一個動態的文件。
例如:
<jsp:include page="scripts/login.jsp">
<jsp:param name="username" value="Aqing" />
<jsp:param name="password" value="123456"/>
</jsp:include>
4.5.5 useBean及setProperty和getProperty動作元素
1.useBean動作元素
<jsp:useBean>動作用來查找或實例化一個JSP頁面使用的JavaBean組件。javaBean是特殊類型的java類,它與普通java類相比主要區別是包含了兩種特殊的方法:setXXX( )(設置屬性值的方法)、getXXX( )(取屬性值的方法)。
在程序中可把邏輯控制、數據庫操作放在javabeans組件中,然后在jsp文件中調用它。這個功能非常有用,因為它使得我們既可以發揮Java組件重用的優勢,同時也避免了損失JSP區別於Servlet的方便性。所以<jsp:useBean>動作幾乎是JSP最重要的用法。
其語法形式:
<jsp:usebean id="name" scope="page | request | session | application" typespec />
其中typespec有以下幾種可能的情況:
class="classname" | class="classname" type="typename" | beanname="beanname" type="typename" | type="typename" |
<jsp:useBean id="name" class="package.class" />
注意必須使用class或type,但不能同時使用class和beanname。beanname表示bean的名字,其形式為“a.b.c”。
只有當第一次實例化Bean時才執行Body部分,如果是利用已有的Bean實例則不執行Body部分,jsp:useBean並非總是意味着創建一個新的Bean實例。
獲得Bean實例之后,要修改Bean的屬性既可以通過jsp:setProperty動作進行,也可以在腳本小程序中利用id屬性所命名的對象變量,通過調用該對象的方法顯式地修改其屬性。當說“某個Bean有一個類型為X的屬性foo”時,就意味着“這個類有一個返回值類型為X的getfoo方法,還有一個setfoo方法以X類型的值為參數”。
通過jsp:setProperty和jsp:getProperty修改和提取Bean的屬性。
useBean動作元素屬性如下:
(1)id用來引用Bean實例的變量。如果能夠找到id和scope相同的Bean實例,jsp:useBean動作將使用已有的Bean實例而不是創建新的實例。
(2)class指定Bean的完整包名,表明bean具體是對哪個類的實例化。
(3)scope指定Bean的有效范圍,可取四個值分別為:page,request,session和application。默認值是page,表示該Bean只在當前頁面內可用(保存在當前頁面的PageContext內),有效范圍是當前頁面。request表示該Bean在當前的客戶請求內有效(保存在ServletRequest對象內)。有效范圍在一個單獨客戶請求的生命周期內。session表示該Bean對當前HttpSession內的所有頁面都有效。有效范圍是整個用戶會話的生命周期內。最后,如果取值application,則表示該Bean對所有具有相同ServletContext的頁面都有效。有效范圍是應用的生命周期內。
scope之所以很重要,是因為jsp:useBean只有在不存在具有相同id和scope的對象時才會實例化新的對象;如果已有id和scope都相同的對象則直接使用已有的對象,此時jsp:useBean開始標記和結束標記之間的任何內容都將被忽略。
(4)type指定引用該對象的變量的類型,它必須是Bean類的名字、超類名字、該類所實現的接口名字之一。請記住變量的名字是由id屬性指定的。
(5)beanName指定Bean的名字。如果提供了type屬性和beanName屬性,允許省略class屬性。
2.setProperty動作元素
<jsp:setproperty>標簽表示用來設置bean中的屬性值。在JSP表達式或Scriptlet中讀取Bean屬性通過調用相應的getXXX方法實現,或者更一般地,使用jsp:getProperty動作。
可以使用兩種語法實現方式:
(1)在jsp:usebean后使用jsp:setproperty:
<jsp:usebean id="myuser"/>
<jsp:setproperty name="user" property="user"/>
在這種方式中,jsp:setproperty將被執行。
(2)jsp:setproperty出現在jsp:usebean標簽內:
<jsp:usebean id="myuser">
<jsp:setproperty name="user" property="user"/>
</jsp:usebean>
在這種方式中,jsp:setproperty只會在新的對象被實例化時才將被執行。
在<jsp:setproperty>中的name值應和<jsp:usebean>中的id值相同。我們既可以通過jsp:setProperty動作的value屬性直接提供一個值,也可以通過param屬性聲明Bean的屬性值來指定請求參數,還可以列出Bean屬性表明它的值應該來自請求參數中的同名變量。該動作的含義是使用bean中相應的set()方法設置一個或多個屬性的值,值的來源是通過value屬性明確給出,或者利用request對象中相應的參數。
<jsp:setproperty>動作有下面四個屬性:
(1)name用來表明對哪個bean實例執行下面的動作,這個值和動作<jsp:useBean>中定義的id必須對應起來,包括大小寫都必須一致。這個屬性是必須的。
(2)property用來表示要設置哪個屬性。如果property的值是"*",表示用戶在可見的JSP頁面中輸入的全部值,存儲在匹配的bean屬性中。匹配的方法是:bean的屬性名稱必須與輸入框的名字相同。property property屬性是必需的。它表示要設置哪個屬性。有一個特殊用法:如果property的值是“*”,表示所有名字和Bean屬性名字匹配的請求參數都將被傳遞給相應的屬性set方法。這個屬性也是必須的。
(3)value屬性是可選的。該屬性用來指定Bean屬性的值。字符串數據會在目標類中通過標准的valueOf方法自動轉換成數字、boolean、Boolean、byte、Byte、char、Character。例如,boolean和Boolean類型的屬性值(比如“true”)通過Boolean.valueOf轉換,int和Integer類型的屬性值(比如“42”)通過Integer.valueOf轉換。
value和param不能同時使用,但可以使用其中任意一個。
(4)param屬性是可選的。它指定用哪個請求參數作為Bean屬性的值。如果當前請求沒有參數,則什么事情也不做,系統不會把null傳遞給Bean屬性的set方法。因此,你可以讓Bean自己提供默認屬性值,只有當請求參數明確指定了新值時才修改默認屬性值。
例如,下面的代碼片斷表示:如果存在numItems請求參數的話,把numberOfItems屬性的值設置為請求參數numItems的值;否則什么也不做。
<jsp:setProperty name="orderBean"
property="numberOfItems"
param="numItems" />
如果同時省略value和param,其效果相當於提供一個param且其值等於property的值。進一步利用這種借助請求參數和屬性名字相同進行自動賦值的思想,你還可以在property(Bean屬性的名字)中指定“*”,然后省略value和param。此時,服務器會查看所有的Bean屬性和請求參數,如果兩者名字相同則自動賦值。
3.getProperty元素
<jsp:getproperty>標簽表示獲取bean的屬性的值並將之轉化為一個字符串,然后將其插入到輸出的頁面中。該動作實際是調用了bean的get()方法。
在使用<jsp:getproperty>之前,必須用<jsp:usebean>來創建它。不能使用<jsp:getproperty>來檢索一個已經被索引了的屬性。
語法如下:
<jsp:getProperty name="beanInstanceName" property="propertyName"/>
jsp:getProperty有兩個必需的屬性,即:name,表示Bean的名字;property,表示要提取哪個屬性的值。
例如
<jsp:useBean id="itemBean" ... />
<UL>
<LI>Number of items:
<jsp:getProperty name="itemBean" property="numItems" />
<LI>Cost of each:
<jsp:getProperty name="itemBean" property="unitCost" />
</UL>
程序例子:
一共有三個文件:TestBean.java,register.jsp,register.html
TestBean.java



public class TestBean { private String userName; private String password; private int age; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
register.html

<html> <body> <form action="register.jsp" method="post"> <table> <tr> <td> 姓名:<input type="text" name="userName"> </td> </tr> <tr> <td> 密碼:<input type="text" name="password"> </td> </tr> <tr> <td> 年齡:<input type="text" name="age"> </td> </tr> <tr> <td> <input type="submit"> </td> </tr> </table> </form> </body> </html>

register.jsp

<%@ page language="java" pageEncoding="gb2312"%> <jsp:useBean id="user" scope="page" class="com.jsp.ch3.TestBean"/> <jsp:setProperty name="user" property="*"/> 或者用以下,param可以不填寫,其中param對應的是提交頁面的表單name <jsp:setProperty property="userName" name="user" param="userName"/> <jsp:setProperty property="password" name="user" param="password"/> <jsp:setProperty property="age" name="user" param="age"/> <html> <body> 注冊成功:<br> <hr> 使用Bean的屬性方法<br> 用戶名: <%=user.getUserName()%><br> 密碼: <%=user.getPassword()%><br> 年齡: <%=user.getAge()%><br> <hr> 使用getProperty<br> 用戶名:<jsp:getProperty name="user" property="userName"/><br> 密碼: <jsp:getProperty name="user" property="password"/><br> 年齡: <jsp:getProperty name="user" property="age"/> 客戶端名稱:<%=request.getRemoteAddr() %> </body> </html>