1、JSP運行環境:安裝JDK并進行相關的環境變量配置、安裝JSP引擎(J2EE、Resin和Tomcat等)。
2、創建第一個JSP程序:
(1)使用文本編輯工具創建一個JSP程序first.jsp:
<html>
<head><title>Firstjsp</title></head>
<body>
<%
out.println("Hello world.");%>
</body>
</html>
(2)在Tomcat服務器中建立Web應用程序目錄和運行程序:
§進入Tomcat的安裝目錄,在webapps下新建一個目錄,起名為myapp(名字任意)。
§在myapp下新建一個目錄WEB-INF(目錄區分大小寫)。
§在WEB-INF下新建一個文件web.xml。
§將first.jsp文件復制到myapp文件夾中。
§在瀏覽器中輸入:
http://127.0.01:8080/myapp/first.jsp,運行。
(3)修改web.xml文件,內容如下:
<? xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app-2-3.dtd">
<web-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
</web-app>
3、JSP注釋:一種是輸出注釋,另一種是隱藏注釋。
§輸出注釋:形式與HTML注釋一樣,但其可以包含代碼,如:
<!--加載此頁面的時間:<%= (new java.util.Date()).toLocaleString()%>-->
則客戶端顯示為:
<!--加載此頁面的時間:2008-8-15 21:18:08-->
§隱藏注釋:寫在JSP程序中,不發送給客戶端,其格式:<%-- 注釋內容 --%>
4、JSP腳本元素:聲明、表達式、腳本程序
§聲明的語法格式:<%! declarations %>。例如:
<%! int i=0; %>
<%! int a,b,c; %>
<%! Date date=new Date() ;%>
注意:每個頁面都用到的一些聲明可以寫到一個文件里,然后用<%@ include %>或<jsp:include>元素包含進來。
§表達式的語法格式:<%= expression %>。例如:
<%= i %>
<%= date %>
注意:結尾無分號,表達式必須是一個合法的java表達式,必須有返回值,且返回值被轉換為字符串,也可以作為其他JSP元素的屬性值,一個表達式可以多個表達式的組合,其順序是從左到右。
§腳本程序的語法格式:<% 代碼段 %>。例如:
<%
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd");
out.println(sdf.format(date));
%>
注意:
一個scriptlet能夠包含多個jsp語句,方法,變量,表達式 。 因為scriptlet,我們便能聲明將要用到的變量或方法(參考 聲明);編寫JSP表達式(參考 表達式);使用任何隱含的對象和任何用<jsp:useBean>聲明過的對象;編寫JSP語句 (如果你在使用Java語言,這些語句必須遵從Java Language Specification,);任何文本,HTML標記,JSP元素必須在scriptlet之外;當JSP收到客戶的請求時,scriptlet就會被執行,如果scriptlet有顯示的內容,這些顯示的內容就被存在out對象中。
5、JSP指令元素:Page、Include、Taglib,其格式為<%@ directive {attr="value"}* %>
(1)paget指令作用于整個JSP頁面,其屬性被用于與JSP容器通信,描述了與頁面相關的指示信息。在一個JSP頁面中,Page可以出現多次,但指令中的屬性卻只能出現一次(import屬性除外),重復的屬性設置將覆蓋先前的設置。 無論你把<% @ page %>指令放在JSP的文件的哪個地方,它的作用范圍都是 整個JSP頁面。不過,為了JSP程序的可讀性,以及好的編程習 慣,最好還是把它放在JSP文件的頂部。語法與例子:

<%
@ page
[ language="java" ] <%--指定腳本語言,默認為java--%>
[ extends="package.class" ] <%-- 指定JSP頁面轉換后的Servlet類從哪一類繼承,通常不用,父類由JSP容器提供。--%>
[ import="{package.class | package.*},
" ] <%-- 與java程序中的一樣,可重復使用 --%>
[ session="true | false" ] <%--是否可用session對象--%>
[ buffer="none | 8kb | sizekb" ] <%--緩沖區大小,none為不使用緩沖區,默認為8kb--%>
[ autoFlush="true | false" ] <%--如果buffer溢出,是否要強制輸出,默認為true--%>
[ isThreadSafe="true | false" ] <%--指定文件是否能多線程使用,默認為true--%>
[ info="text" ] <%--指定頁面的相關信息,該信息可以通過調用Servlet接口 的getServletInfo()方法得到--%>
[ errorPage="relativeURL" ] <%--指定JSP頁面發生異常時要轉向的處理頁面,其優先權高于web.xml的設置--%>
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ isErrorPage="true | false" ] <%--當前頁面是否是錯誤處理頁面,默認為flase--%>
[pageEncoding="peinfo"]<%--指定頁面的字符編碼,若未指定則使用contentType屬性的,若兩者都未指定,使用ISO-8859-1--%>
%>
例子

<%
@ page import="java.util.*, java.lang.*" %>

<%
@ page buffer="5kb" autoFlush="false" %>

<%
@ page errorPage="error.jsp" %>

注意:<% @ page %>指令不能作用于動態的包含文件,比如 <jsp:include> 。 import默認導入的包有java.lang.*、javax.servlet.*、javax.servlet.jsp.*和javax.servlet.http.*。
(2)Include指令用于在JSP頁面中靜態包含一個文件,該文件可以是JSP頁面、HTML網頁、文本文件或一段程序代碼。格式:<%@ include file="relativeURL" %>,例子:
<html>
<head><title>Include Demo</title></head>
<body bgcolor="white">
<font color="blue">
The current date and time are:

<%
@ include file="date.jsp" %>
</font>
</body>
</html>
被包含的文件:date.jsp

<%
@ page contentType="text/html; charset=GB2312"
language="java" import="java.util.*,java.text.*"
%>

<%
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
%>
<tr>
<td height="14" align="center">*當前日期:</td>
<td><%= sdf.format(date) %></td>
</tr>
注意:包含與被包含的文件,在HTML標簽、變量和方法上不能沖突。
(3)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語法的一部分,和XML一樣有開始標記和結束標記。元素也可以包含其它的文本,標記,元素。比如,一個jsp:plugin元素有<jsp:plugin>開始標記和</jsp:plugin>結束標記,同樣也可以有<jsp:params>和<jsp:fallback>元素。你必須在使用自定義標簽之前使用<% @ taglib %>指令,而且你可以在一個頁面中多次使用,但是前綴只能使用一次。
屬性:
uri="URIToTagLibrary"
Uniform Resource Identifier (URI)根據標簽的前綴對自定義的標簽進行唯一的命名,URI可以是以下的內容:Uniform Resource Locator (URL), 由 RFC 2396 定義, 查看 http://www.hut.fi/u/jkorpela/rfc/2396/full.html
Uniform Resource Name (URN), 由 RFC 2396定義
一個相對或絕對的路徑
prefix="tagPrefix"
在自定義標簽之前的前綴,比如,在<public:loop>中的public,如果這里不寫public,那么這就是不合法的。請不要用jsp, jspx, java, javax, servlet, sun, 和sunw做為你的前綴。
6、JSP動作元素:JSP容器支持兩種JSP動作,即標準動作和自定義動作。在JSP中,動作元素是使用XML語法來表示的。JSP中的標準動作包括<jsp:include>、<jsp:param>、<jsp:forward>、<jsp:useBean>、<jsp:getProperty>、<jsp:setProperty>和<jsp:plugin>。
(1)<jsp:include>動作元素允許在頁面被請求時包含一些其他的資源,如一個靜態的HTML文件或動態的JSP文件。語法:
<jsp:include page="{relativeURL | <%= expression%>}" flush="true" />

或
<jsp:include page="{relativeURL | <%= expression %>}" flush="true" >
<jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" />+
</jsp:include>
例子:
<jsp:include page="scripts/login.jsp" />
<jsp:include page="copyright.html" />
<jsp:include page="/index.html" />
<jsp:include page="scripts/login.jsp">
<jsp:param name="username" value="wzz" />
</jsp:include>
注意:
<jsp:include>對于靜態文件,僅僅是把包含文件的內容加到jsp文件中去,如果這個文件動態的,這個被包含文件也會被Jsp編譯器執行。不能從文件名上判斷一個文件是動態的還是靜態的,比如aspcn.asp就有可能只是包含一些信息而已。<jsp:include>能夠同時處理這兩種文件,因此你就不需要包含時還要判斷此文件是動態的還是靜態的。
屬性:
page="{relativeURL | <%= expression %>}"
參數為一相對路徑,或者是代表相對路徑的表達式.
flush="true"
這里你必須使用flush="true",你不能使用false值.缺省值為false
<jsp:param name="parameterName" value="{parameterValue | <%= expression %> }" />+
<jsp:param>子句能讓你傳遞一個或多個參數給動態文件
你能在一個頁面中使用多個<jsp:param>來傳遞多個參數。
(2)<jsp:forward>重定向一個HTML文件,JSP文件,或者是一個程序段,一般會停止當前JSP文件的執行。格式:
<jsp:forward page={"relativeURL" | "<%= expression %>"} />
或
<jsp:forward page={"relativeURL" | "<%= expression %>"} >
<jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" />+
</jsp:forward>
例子:
<jsp:forward page="/servlet/login" />
<jsp:forward page="/servlet/login">
<jsp:param name="username" value="wzz" />
</jsp:forward>
注意:
<jsp:forward>標簽從一個JSP文件向另一個文件傳遞一個包含用戶請求的request對象.<jsp:forward>標簽以下的代碼,將不能執行。
你能夠向目標文件傳送參數和值,在這個例子中我們傳遞的參數名為username,值為scott,如果你使用了<jsp:param>標簽的話,目標文件必須是一個動態的文件,能夠處理參數。
如果你使用了非緩沖輸出的話,那么使用<jsp:forward>時就要小心。如果在你使用<jsp:forward>之前,jsp文件已經有了數據,那么文件執行就會出錯。
屬性
page="{relativeURL | <%= expression %>}"
這里是一個表達式或是一個字符串用于說明你將要定向的文件或URL.這個文件可以是JSP,程序段,或者其它能夠處理request對象的文件(如asp,cgi,php).
<jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" />+
向一個動態文件發送一個或多個參數,這個文件一定是動態文件.
如果你想傳遞多個參數,你可以在一個JSP文件中使用多個<jsp:param>。name指定參數名,value指定參數值。
(3)<jsp:param>動作元素被用來以“name=value“的形式為其他元素提供附加信息,通常它會同<jsp:include>、<jsp:forward>、<jsp:plugin>等元素一起使用。語法格式:
<jsp:param name="name" value="value" >
(4)<jsp:plugin>執行一個applet或Bean,有可能的話還要下載一個Java插件用于執行它。語法:
<jsp:plugin
type="bean | applet"
code="classFileName"
codebase="classFileDirectoryName"
[ name="instanceName" ]
[ archive="URIToArchive,
" ]
[ align="bottom | top | middle | left | right" ]
[ height="displayPixels" ]
[ width="displayPixels" ]
[ hspace="leftRightPixels" ]
[ vspace="topBottomPixels" ]
[ jreversion="JREVersionNumber | 1.1" ]
[ nspluginurl="URLToPlugin" ]
[ iepluginurl="URLToPlugin" ] >
[ <jsp:params>
[ <jsp:param name="parameterName"
value="{parameterValue | <%= expression %>}" /> ]+
</jsp:params> ]
[ <jsp:fallback> text message for user </jsp:fallback> ]
</jsp:plugin>
屬性
type="bean | applet"
將被執行的插件對象的類型,你必須得指定這個是Bean還是applet,因為這個屬性沒有缺省值。
code="classFileName"
將會被Java插件執行的Java Class的名字,必須以.class結尾。這個文件必須存在于codebase屬性指定的目錄中。
codebase="classFileDirectoryName"
將會被執行的Java Class文件的目錄(或者是路徑),如果你沒有提供此屬性,那么使用jsp:plugin的jsp文件的目錄將會被使用。
name="instanceName"
這個Bean或applet實例的名字,它將會在Jsp其它的地方調用。
archive="URIToArchive, ..."
一些由逗號分開的路徑名,這些路徑名用于預裝一些將要使用的class,這會提高applet的性能。
align="bottom | top | middle | left | right"
圖形,對象,Applet的位置,有以下值:
bottom
top
middle
left
right
height="displayPixels" width="displayPixels"
Applet或Bean將要顯示的長寬的值,此值為數字,單位為象素。
hspace="leftRightPixels" vspace="topBottomPixels"
Applet或Bean顯示時在屏幕左右,上下所需留下的空間,單位為象素。
jreversion="JREVersionNumber | 1.1"
Applet或Bean運行所需的Java Runtime Environment(JRE)的版本。
缺省值是 1.1。
nspluginurl="URLToPlugin"
Netscape Navigator用戶能夠使用的JRE的下載地址,此值為一個標準的URL,如http://www.aspcn.com/jsp
iepluginurl="URLToPlugin"
IE用戶能夠使用的JRE的下載地址,此值為一個標準的URL,如http://www.aspcn.com/jsp
<jsp:params> [ <jsp:param name="parameterName"
value="{parameterValue | <%= expression %>}" /> ]+ </jsp:params>
你需要向applet或Bean傳送的參數或參數值。
<jsp:fallback> text message for user </jsp:fallback>
一段文字用于Java插件不能啟動時顯示給用戶的,如果插件能夠啟動而applet或Bean不能,那么瀏覽器會有一個出錯信息彈出。
例子:
<jsp:plugin type=applet code="Molecule.class" codebase="/html">
<jsp:params>
<jsp:param name="molecule" value="molecules/benzene.mol" />
</jsp:params>
<jsp:fallback>
<p>Unable to load applet</p>
</jsp:fallback>
</jsp:plugin>

注意:jsp:plugin元素用于在瀏覽器中播放或顯示一個對象(典型的就是applet和Bean),而這種顯示需要在瀏覽器的java插件。當Jsp文件被編譯,送往瀏覽器時,jsp:plugin元素將會根據瀏覽器的版本替換成object或者embed元素。注意,object用于HTML 4.0,embed用于HTML 3.2。一般來說,jsp:plugin元素會指定對象是Applet還是Bean,同樣也會指定class的名字,還有位置,另外還會指定將從哪里下載這個Java插件。
(5)<jsp:useBean>創建一個Bean實例并指定它的名字和作用范圍。語法格式:
<jsp:useBean
id="beanInstanceName"
scope="page | request | session | application"
{
class="package.class" |
type="package.class" |
class="package.class" type="package.class" |
beanName="{package.class | <%= expression %>}" type="package.class"
}
{
/> |
> other elements </jsp:useBean>
}
例子:
<jsp:useBean id="cart" scope="session" class="session.Carts" />
<jsp:setProperty name="cart" property="*" />
<jsp:useBean id="checking" scope="session" class="bank.Checking" >
<jsp:setProperty name="checking" property="balance" value="0.0" />
</jsp:useBean>
描述
<jsp:useBean>用于定位或示例一個JavaBeans組件。<jsp:useBean>首先會試圖定位一個Bean實例,如果這個Bean不存在,那么<jsp:useBean>就會從一個class或模版中進行示例。
為了定位或示例一個Bean,<jsp:useBean>會進行以下步聚,順序如下:
通過給定名字和范圍試圖定位一個Bean.
對這個Bean對象引用變量以你指定的名字命名.
如果發現了這個Bean,將會在這個變量中儲存這個引用。如果你也指定了類型,那么這個Bean也設置為相應的類型.
如果沒有發現這個Bean,將會從你指定的class中示例,并將此引用儲存到一個新的變量中去。如果這個class的名字代表的是一個模版,那么這個Bean被java.beans.Beans.instantiate示例.
如果<jsp:useBean>已經示例(不是定位)了Bean,同時<jsp:useBean>和</jsp:useBean>中有元素,那么將會執行其中的代碼.
<jsp:useBean>元素的主體通常包含有<jsp:setProperty>元素,用于設置Bean的屬性值。正如上面第五步所說的,<jsp:useBean>的主體僅僅只有在<jsp:useBean>示例Bean時才會被執行,如果這個Bean已經存在,<jsp:useBean>能夠定位它,那么主體中的內容將不會起作用
屬性以及用法
id="beanInstanceName"
在你所定義的范圍中確認Bean的變量,你能在后面的程序中使用此變量名來分辨不同的Bean
這個變量名對大小寫敏感,必須符合你所使用的腳本語言的規定,在Java Programming Language中,這個規定在Java Language 規范已經寫明。如果這個Bean已經在別的<jsp:useBean>中創建,那么這個id的值必須與原來的那個id值一致.
scope="page / request / session / application"
Bean存在的范圍以及id變量名的有效范圍。缺省值是page,以下是詳細說明:
page - 你能在包含<jsp:useBean>元素的JSP文件以及此文件中的所有靜態包含文件中使用Bean,直到頁面執行完畢向客戶端發回響應或轉到另一個文件為止。
request - 你在任何執行相同請求的Jsp文件中使用Bean,直到頁面執行完畢向客戶端發回響應或轉到另一個文件為止。你能夠使用Request對象訪問Bean,比如request.getAttribute(beanInstanceName)
session - 從創建Bean開始,你就能在任何使用相同session的Jsp文件中使用Bean.這個Bean存在于整個Session生存周期內,任何在分享此Session的Jsp文件都能使用同一Bean.注意在你創建Bean的Jsp文件中<% @ page %>指令中必須指定session=true
application - 從創建Bean開始,你就能在任何使用相同application的Jsp文件中使用Bean.這個Bean存在于整個application生存周期內,任何在分享此application的Jsp文件都能使用同一Bean.
class="package.class"
使用new關鍵字以及class構造器從一個class中示例一個bean.這個class不能是抽象的,必須有一個公用的,沒有參數的構造器.這個package的名字區別大小寫。
type="package.class"
如果這個Bean已經在指定的范圍中存在,那么寫這個Bean一個新的數據庫類型 。如果你沒有使用class或beanName指定type,Bean將不會被示例.package和class的名字,區分大小寫
beanName="{package.class / <%= expression %>}" type="package.class"
使用java.beans.Beans.instantiate方法來從一個class或連續模版中示例一個Bean,同時指定Bean的類型。
beanName可以是package和class也可以是表達式,它的值會傳給Beans.instantiate.tupe的值可以和Bean相同。
package 和 class 名字區分大小寫。
(6)<jsp:setProperty> 設置Bean中的屬性值。語法:
<jsp:setProperty
name="beanInstanceName"
{
property= "*" /
property="propertyName" [ param="parameterName" ] /
property="propertyName" value="{string / <%= expression %>}"
}
/>
例子:
<jsp:setProperty name="mybean" property="*" />
<jsp:setProperty name="mybean" property="username" />
<jsp:setProperty name="mybean" property="username" value="Steve" />
描述
<jsp:setProperty>元素使用Bean給定的setter方法,在Bean中設置一個或多個屬性值。你在使用這個元素之前必須得使用<jsp:useBean>聲明此Bean.因為,<jsp:useBean>和<jsp:setProperty>是聯系在一起的,同時這他們使用的Bean實例的名字也應當相匹配(就是說,在<jsp:setProperty>中的name的值應當和<jsp:useBean>中id的值相同)
你能使用多種方法利用<jsp:setProperty>來設定屬性值 :
通過用戶輸入的所有值(被做為參數儲存中request對象中)來匹配Bean中的屬性
通過用戶輸入的指定的值來匹配Bean中指定的屬性
在運行時使用一個表達式來匹配Bean的屬性
每一種設定屬性值的方法都有其特定的語法,下面我們會來講解
屬性及其用法
name="beanInstanceName"
表示已經在<jsp:useBean>中創建的Bean實例的名字.
property="*"
儲存用戶在Jsp輸入的所有值,用于匹配Bean中的屬性。在Bean中的屬性的名字必須和request對象中的參數名一致.
從客戶傳到服器上的參數值一般都是字符類型 ,這些字符串為了能夠在Bean中匹配就必須轉換成其它的類型
如果request對象的參數值中有空值,那么對應的Bean屬性將不會設定任何值。同樣的,如果Bean中有一個屬性沒有與之對應的Request參數值,那么這個屬性同樣也不會設定.
property="propertyName" [ param="parameterName" ]
使用request中的一個參數值來指定Bean中的一個屬性值。在這個語法中,property指定Bean的屬性名,param指定request中的參數名.
如果bean屬性和request參數的名字不同,那么你就必須得指定property和param ,如果他們同名,那么你就只需要指明property就行了.
如查參數值為空(或未初始化),對應的Bean屬性不被設定.
property="propertyName" value="{string / <%= expression %>}"
使用指定的值來設定Bean屬性。這個值可以是字符串,也可以是表達式。如果這個字符串,那么它就會被轉換成Bean屬性的類型(查看上面的表).如果它是一個表達式,那么它類型就必須和它將要設定的屬性值的類型一致。
如果參數值為空,那么對應的屬性值也不會被設定。另外,你不能在一個<jsp:setProperty>中同時使用param和value
技巧
如果你使用了property="*",那么Bean的屬性沒有必要按Html表單中的順序排序
(7)<jsp:getProperty>獲取Bean的屬性值,用于顯示在頁面中。語法:
<jsp:getProperty name="beanInstanceName" property="propertyName" />

例子:
<jsp:useBean id="calendar" scope="page" class="employee.Calendar" />
<h2>
Calendar of <jsp:getProperty name="calendar" property="username" />
</h2>

描述
這個<jsp:getProperty>元素將獲得Bean的屬性值,并可以將其使用或顯示在JSP頁面中.在你使用<jsp:getProperty>之前,你必須用<jsp:useBean>創建它.
<jsp:getProperty>元素有一些限制:
你不能使用<jsp:getProperty>來檢索一個已經被索引了的屬性
你能夠和JavaBeans組件一起使用<jsp:getProperty>,但是不能與Enterprise Bean一起使用
屬性
name="beanInstanceName"
bean的名字,由<jsp:useBean>指定
property="propertyName"
所指定的Bean的屬性名。
技巧:
在sun的JSP參考中提到,如果你使用<jsp:getProperty>來檢索的值是空值,那么NullPointerException將會出現,同時如果使用程序段或表達式來檢索其值,那么在瀏覽器上出現的是null(空)。