JSP 概念及用法


原文地址:

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

package  com.jsp.ch3;

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>

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM