国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JSP入門教程

瀏覽:52日期:2024-07-04 11:14:53

JavaServer Pages (JSP)是基于Java的技術(shù),用于創(chuàng)建可支持跨平臺(tái)及跨Web服務(wù)器的動(dòng)態(tài)網(wǎng)頁(yè)。;

JSP可與微軟的Active Server Pages (ASP)相媲美,但JSP使用的是類似于HTML的標(biāo)記和Java 代碼片段而不是用VBScript。當(dāng)你使用不提供ASP本地支持的Web服務(wù)器(例如 Apache或Netscape服務(wù)器)時(shí),你就可以考慮使用JSP了。你雖然也可以為這些服務(wù)器弄一個(gè)ASP附加軟件模塊,但是太昂貴了。現(xiàn)在Sun公司并不會(huì)因你使用JSP向你收費(fèi)(雖然將來(lái)可能要收),況且用于Solaris、 Linux以及Windows系統(tǒng)的組件都很容易獲得。;

不要把JSP與服務(wù)器端的javascript語(yǔ)言搞混了。Web服務(wù)器自動(dòng)將通過(guò)JSP生成的Java代碼片段轉(zhuǎn)換成Java 片段(servlets)。 JSP也可自動(dòng)控制許多功能,如過(guò)去用Perl腳本編寫功能程序或像ASP這樣的服務(wù)器專用API(應(yīng)用編程接口)。;

我們馬上就要開始幫助你建立一個(gè)使用JSP 技術(shù)的網(wǎng)站范例了。;

準(zhǔn)備好計(jì)算機(jī)以使用JSP;

你需要Java2軟件開發(fā)工具箱(J2SDK),過(guò)去稱之為Java開發(fā)工具箱(JDK)、JavaServer 網(wǎng)絡(luò)開發(fā)工具箱(JSWDK)、Tomcat,或者其它能支持JSP的Web服務(wù)器。升陽(yáng)公司為Windows、Solaris以及 Linux平臺(tái)提供免費(fèi)的J2SDK和JSWDK。;

如果你想在現(xiàn)有的Web服務(wù)器上使用JSP,而此服務(wù)器本身不支持JSP和Java 代碼片段,可以試用Allaire公司的Jrun。它可以為Netscape的Enterprise Server和Fasttrack Server、微軟的Internet Information Server(IIS)和Personal Web Server(PWS)、Apache以及其他服務(wù)器充當(dāng)Web服務(wù)器附件。你也可以使用Apache服務(wù)器的Java版,其中包含最新的JSWDK。;

下載并安裝所需的軟件;

目前,版本號(hào)為1.2.2-001的J2SDK可下載版以可安裝的歸檔文件形式出現(xiàn)。這個(gè)大約20MB的下載量軟件可提供一個(gè)徹底的Java開發(fā)環(huán)境,讓你創(chuàng)造任何基于Java并且利用了而標(biāo)準(zhǔn)核心API的解決方案。其實(shí),你的Web服務(wù)器使用JSP的唯一條件是要有Java編輯器。要讓W(xué)eb服務(wù)器知道編輯器的位置,需要JAVA_HOME 環(huán)境變量設(shè)置為J2SDK安裝目錄。如果你已經(jīng)在Windows系統(tǒng)中進(jìn)行了安裝并且接受了默認(rèn)目錄, 請(qǐng)將“set JAVA_HOME=C:1.2.2添加到你的“autoexec.bat文件中,然后重新啟動(dòng)。;

安裝J2SDK后,下載并安裝JSWDK或者是Tomcat β版,即基于Java的Apache Web服務(wù)器的β版。你把JSWDK放在什么地方是無(wú)關(guān)緊要的,只要你以后能找到它就行。通常,將其放在頂層目錄中,這樣你在替換JSWDK或JSDK時(shí)無(wú)需刪除另一個(gè)軟件。安裝好這個(gè)文件后,準(zhǔn)備工作已經(jīng)就緒,你可以開始JSP開發(fā)工作了。;

正確地安裝JSWDK后,請(qǐng)運(yùn)行“startserver腳本程序,以啟動(dòng)Web服務(wù)器,使其按照默認(rèn)情況監(jiān)聽8080端口。你要在啟動(dòng)服務(wù)器之后查看您是否已正確地安裝了此工具,請(qǐng)加載一個(gè)JSP樣本文件(http://locahost:8080/examples/jsp/)。如果你能成功地運(yùn)行這些樣本文件,說(shuō)明你已經(jīng)正確地安裝了這個(gè)軟件。如果你在用來(lái)啟動(dòng)服務(wù)器的控制臺(tái)窗口中看到報(bào)錯(cuò)信息,你就需要做些修改。最經(jīng)常發(fā)生的問題是沒有設(shè)置或不正確地設(shè)置了JAVA_HOME環(huán)境變量。要看到當(dāng)前環(huán)境變量設(shè)置情況,要請(qǐng)?jiān)贒OS提示符下鍵入“set設(shè)置。;

開始;

在解釋 JSP語(yǔ)法前,創(chuàng)建一個(gè)快捷網(wǎng)頁(yè),顯示目當(dāng)前的日期和時(shí)間,并然后將之其保存為sample.jsp:;

<html>;

<head>;

<title>First Page</title>;

</head>;

<body>;

<H3>Today is:;

<%= new java.util.Date() %>;

</H3>;

</body>;

</html>.;

把這個(gè)文件以及你所有的HTML 和 JSP 頁(yè)面放在JSWDK安裝目錄下的網(wǎng)頁(yè)目錄里。你可以從http://localhost:8080/sample.jsp加載此網(wǎng)頁(yè)。該網(wǎng)頁(yè)首次被訪問時(shí),Web服務(wù)器會(huì)把JSP編譯成Java代碼片段,這樣你就能夠看到當(dāng)前的日期和時(shí)間了。;

你已經(jīng)下載、安裝并配置好了開發(fā)環(huán)境,你可以開始學(xué)習(xí)JSP語(yǔ)法并創(chuàng)建自己的基于JSP的解決方案了。

JSP基本語(yǔ)法;

講完安裝問題后,現(xiàn)在進(jìn)入來(lái)討論JSP語(yǔ)法。一個(gè)投機(jī)取巧的辦法是下載語(yǔ)法卡片。如果你不熟悉Java編程,也許你想看一下Sun的指南 。然而網(wǎng)頁(yè)創(chuàng)建者并不需要進(jìn)行太多的Java開發(fā)。除了一些方法調(diào)用,在你的JSP網(wǎng)頁(yè)里應(yīng)盡可能少用Java代碼。;

記住以上提示,我們首先來(lái)看一看JSP指令和腳本元素,之后我們會(huì)解釋JavaBeans和隱含對(duì)象。共有五種JSP指令和腳本元素。在JSP 1.0版中,大部分JSP被一個(gè)以“<% 開頭和以“%>結(jié)尾的的標(biāo)記括在其中。在更新的JSP 1.1規(guī)范出臺(tái)后,就有了與XML兼容的版本。;

JSP指令和腳本元素;

Directives <%@ directive %>;

Declarations <%! declaration %>;

Expressions <%= expression %>;

Code Fragment/Scriptlet <% code fragment %>;

Comments <%-- comment --%>;

指令;

JSP指令是為JSP引擎而設(shè)計(jì)的。他們并不直接產(chǎn)生任何可見輸出,而只是告訴引擎如何處理其余JSP頁(yè)面。這些指令始終被括在 “<%@ ?%>標(biāo)記中。兩個(gè)最重要的指令是“pagePage和“Include。“Taglib指令不在討論之列,但是在用JSP1.1創(chuàng)建自定義標(biāo)記可以使用它。;

幾乎在所有JSP頁(yè)面頂部都會(huì)看到“Page指令。盡管不是必須的,但它可以讓你指定:;

到何處查找起支持作用的Java類別:;

<%@ page import="java.util.Date" %>,;

出現(xiàn)Java運(yùn)行問題時(shí),將網(wǎng)上沖浪者引向何處:;

<%@ page errorPage="errorPage.jsp" %>,;

還有你是否需要管理用戶的會(huì)話級(jí)信息,這些信息可能來(lái)自多個(gè)網(wǎng)頁(yè)(在下面的JavaBeans一節(jié)將對(duì)此做進(jìn)一步講)述:;

<%@ page session="true" %>.;

“Include指令可以把你的內(nèi)容分成更多可管理的元素,比如包括一個(gè)普通頁(yè)面頁(yè)眉或頁(yè)腳的元素。包含的網(wǎng)頁(yè)可以是一個(gè)固定的HTML 頁(yè)面或更多的JSP內(nèi)容:;

<%@ include file="200453092147.htm.jsp" %>;

聲明;

JSP聲明用來(lái)讓你定義頁(yè)面級(jí)變量,以保存信息或定義JSP頁(yè)面的其余部分可能需要的支持方法。如果你發(fā)現(xiàn)代碼太多,通常最好把它們寫成一個(gè)獨(dú)立的Java類別。聲明一般都在“<%! ?%>標(biāo)記中。一定要以分號(hào)(;)結(jié)束變量聲明,因?yàn)槿魏蝺?nèi)容都必須是有效的Java語(yǔ)句:;

<%! int i=0; %>。;

表達(dá)式;

有了JSP表達(dá)式,表達(dá)式評(píng)估結(jié)果會(huì)被轉(zhuǎn)換成一個(gè)字符串,并且被直接包括在輸出頁(yè)面之內(nèi)。JSP 表達(dá)式包含在“<%= ?%> 標(biāo)記中,沒有分號(hào),除非在加引號(hào)的字符串部分使用分號(hào)。;

<%= i %>;

<%= "Hello" %> .

代碼片段/腳本片段;

代碼片段/腳本片段(Scriptlets) JSP代碼片段或腳本片段是嵌在“<% ?%>標(biāo)記中的。這種Java代碼在Web服務(wù)器響應(yīng)請(qǐng)求時(shí)就會(huì)運(yùn)行。在腳本片段周圍可能是原始的HTML或XML語(yǔ)句,在這些地方,代碼片段可以使你創(chuàng)建條件執(zhí)行代碼,或要用到另外一段代碼的代碼。例如,以下的代碼組合使用表達(dá)式和代碼片段,顯示H1、H2、H3和H4標(biāo)記中的字符串“Hello。代碼片段并不局限于一行源代碼:;

<% for (int i=1; i<=4; i++) { %>;

<H<%=i%>>Hello</H<%=i%>>;

<% } %>.;

注釋;

最后一個(gè)主要的JSP元素是嵌入式注釋。盡管你始終可以在文件中加入HTML注釋,但用戶在查看頁(yè)面源代碼時(shí)會(huì)看到這些注釋。如果你不想讓用戶看到它,你就應(yīng)該將其嵌入“<%-- ?--%> 標(biāo)記中:;

<%-- comment for server side only --%>.;

帶JavaBean 的JSP;

雖然你可以把大段的代碼放在腳本片段(scriptlet)內(nèi),但是絕大多數(shù)的Java代碼屬于可重復(fù)使用的名為JavaBea的組件。JavaBean類似于ActiveX控件:他們都能提供常用功能并且可以重復(fù)使用。;

JavaBean的值是通過(guò)一些屬性獲得的,你可通過(guò)這些屬性訪問JavaBean設(shè)置。以一個(gè)人來(lái)打比方,這個(gè)人就是一個(gè)JavaBean,這個(gè)人的名字、身份證號(hào)碼以及住址就是其屬性。在JSP網(wǎng)站,你基本上就是通過(guò)玩“Connect the beans)來(lái)使你的網(wǎng)站動(dòng)態(tài)化。;

假設(shè)JavaBean先于網(wǎng)站被創(chuàng)建出來(lái),你需要做的第一件事就是告訴JSP頁(yè)面它將要用到一個(gè)“Bean。你可以用“<jsp:useBean>標(biāo)記來(lái)做到這一點(diǎn):;

<jsp:useBean id="localName" class="com.jguru.Person" scope="application" />。;

“<jsp:useBean>標(biāo)記要求你用“id屬性來(lái)識(shí)鑒別Bean。這里你提供一個(gè)名字來(lái)JSP頁(yè)面其余部分的Bean。除了“id屬性,你還須告訴網(wǎng)頁(yè)面從何處查找Bean,或者它的Java類別名是什么。這種類別屬性提供確 認(rèn)Bean的功能,其他一些方法也可以做到這一點(diǎn)。最后一個(gè)必需的元素是“scope屬性。有了“scope屬性的幫助,你就能告訴Bean為單一頁(yè)面(默認(rèn)情況)[scope="page"]、為[scope="request"]請(qǐng)求為會(huì)話[scope="session"],或者為整個(gè)應(yīng)用程序[scope="application"]保持留信息。有了會(huì)話范圍,你就能非常容易地在JSP網(wǎng)頁(yè)面上維護(hù)購(gòu)物車等項(xiàng)目。;

一旦你聲名了一個(gè)JavaBean,你就可以訪問它的屬性來(lái)定制它。要獲得屬性值,請(qǐng)用“<jsp:getProperty>標(biāo)記。有了這個(gè)標(biāo)記,你就能指定將要用到的Bean名稱(從useBean的"id"字段得到)以及你想得到其值的屬性。實(shí)際的值被放在輸出中:;

<jsp:getProperty id="localName" property="name" />。;

要改變JavaBean屬性,你必須使用“<jsp:setProperty>標(biāo)記。對(duì)這個(gè)標(biāo)記,你需要再次識(shí)別Bean和屬性,以修改并額外提供新值。如果命名正確,這些值可以從一個(gè)已提交的表中直接獲得:參數(shù)獲得:;

<jsp:setProperty id="localName" property="*" />;;

可以從一個(gè)參數(shù)獲得,但你必須直接命名屬性和參數(shù):;

<jsp:setProperty id="localName" property="serialNumber" value="string" />;

或者直接用一個(gè)名字稱和值來(lái)設(shè)置: <jsp:setProperty id="localName" property="serialNumber" value= <%= expression %> />.;

關(guān)于JavaBean 的最后一件事: 為了Web服務(wù)器能找到JavaBean,你需要將其類別文件放在一個(gè)特殊位置。用JSWDK,最 方便的位置是安裝目錄下的類別目錄,如jswdk-1.0.1classes。;

JSP隱含對(duì)象;

與JSP語(yǔ)法相關(guān)的最后的元素是一些叫做“隱含對(duì)象的東西。在JSP代碼片段中,你可以利用這些隱含對(duì)象與JSP頁(yè)面的代碼片段執(zhí)行環(huán)境產(chǎn)生互動(dòng)。應(yīng)盡量少訪問這些內(nèi)置隱含對(duì)象。但是,在一某些情況下,訪問隱含對(duì)象是可被接受的。若要充分利用隱含對(duì)象,就需了解最新的Java Servlet API。;

下表列出可用的隱含對(duì)象集合。;

隱含對(duì)象說(shuō)明;

request 客戶端請(qǐng)求,包括從GET/POST請(qǐng)求傳遞過(guò)來(lái)的參數(shù);

response 網(wǎng)頁(yè)傳回客戶端的反應(yīng);

pageContext 在此管理網(wǎng)頁(yè)屬性;

session 與請(qǐng)求關(guān)聯(lián)的會(huì)話;

application 代碼片段的運(yùn)行環(huán)境;

out 傳送響應(yīng)的輸出流;

config 代碼片段配置對(duì)象;

page JSP網(wǎng)頁(yè)本身;

exception 有錯(cuò)的網(wǎng)頁(yè)中未被捕獲的例外;

這些都是用來(lái)做什么的,你又如何來(lái)使用它們呢?基本上說(shuō),在你的腳本片段里,你可以用它們進(jìn)入執(zhí)行JSP代碼的代碼片段。用不著深入了解太多的Servlet API細(xì)節(jié),我們來(lái)看看能用它們來(lái)做到的某些事情:;

你可以不用表達(dá)式,直接進(jìn)入“Out隱含對(duì)象,將某些內(nèi)容輸出到響應(yīng)中:;

<% out.println("Hello"); %>。;

用不著把一個(gè)參數(shù)直接送到JavaBean,你可以從請(qǐng)求對(duì)象獲取參數(shù)值:;

<% String name=request.getParameter("name"); out.println(name); %>.

在你用JSP進(jìn)行開發(fā)的過(guò)程中,進(jìn)行更多的開發(fā)的過(guò)程中,如果創(chuàng)建了JavaBeans或發(fā)現(xiàn)JSP文件中加入了太多的Java源代碼,你就需要?jiǎng)?chuàng)建起支持作用的Java分類(class)了,它可以協(xié)助你重復(fù)利用源代碼并減少JSP網(wǎng)頁(yè)編譯時(shí)間。當(dāng)你需要?jiǎng)?chuàng)建Java分類文件時(shí),你必須:;

將JDSWK installationin目錄添加到PATH中。在autoexec.bat文件PATH行的末尾,加入“C:1.2.2/bin。;

用這個(gè)命令將JAR文件復(fù)制到“jrelibext:目錄中: copy c:jswdk-1.0.1libservlet.jar c:jdk1.2.2jrelibext.;

創(chuàng)建一個(gè)JSP網(wǎng)站;

現(xiàn)在該是把所有這些JSP語(yǔ)法派上用場(chǎng)的時(shí)候了。我們將創(chuàng)建一個(gè)網(wǎng)頁(yè),它有一個(gè)輸入表單,可以使用戶輸入一個(gè)股票代號(hào)以獲得出當(dāng)前股價(jià)(有20分鐘)。如果輸入有誤,則顯示報(bào)錯(cuò)網(wǎng)頁(yè)。;

quote.jsp;

首先,用 這個(gè)代碼 創(chuàng)建一個(gè)quote.jsp網(wǎng)頁(yè)并將其保存在JSWDK安裝目錄下的網(wǎng)頁(yè)目錄中。大多數(shù)的網(wǎng)頁(yè)是標(biāo)準(zhǔn)的HTML,其間散布著JSP代碼。第六行是一個(gè)網(wǎng)頁(yè)指示,表示將把所有錯(cuò)誤發(fā)送到“errorPage.jsp文中。第13到15行是一個(gè)腳本片段,主要說(shuō)明只有提供“符號(hào)參數(shù)才會(huì)顯示表格。“If代碼段在32到34行結(jié)束。第17行定義了要用的JavaBean,第18行從參數(shù)加載JavaBean的符號(hào)屬性。第27行到29行顯示Bean的屬性。除了"if "代碼段,實(shí)際上并不涉及其它Java代碼。;

errorPage.jsp;

下一步,將下列JSP源代碼保存到網(wǎng)頁(yè)目錄中的“errorPage.jsp文件中。“這是一個(gè)錯(cuò)誤網(wǎng)頁(yè)的提示為第一行,它將isErrorPage網(wǎng)頁(yè)提示屬性設(shè)置為真。上一頁(yè)說(shuō)了明錯(cuò)誤網(wǎng)頁(yè)的位置,本頁(yè)則說(shuō)明這就是錯(cuò)誤網(wǎng)頁(yè)。其它JSP文件中的JSP專用代碼只有訪問隱含例外對(duì)象才用到。網(wǎng)頁(yè)只顯示其值:;

<%@ page isErrorPage="true" %>;

<html>;

<head>;

<title>Error Page</title>;

</head>;

<body>;

<h1>Our Error Page</h1></font>;

<!-- Print Exception -->;

We got ourselves an exception:;

<%= exception %>;

<a href="quote.jsp">Restart</a>;

</body>;

</html>。;

Quotes.java;

Quotes JavaBean 利用Yahoo資源來(lái)獲得股票價(jià)格。需要將此 資源保存到JSWDK安裝目錄下“classescomjguru目錄中的“quotes.java文件中。請(qǐng)?jiān)诖擞肑SDK中的Javac編輯器來(lái)編輯它。;

你的第一個(gè)JSP網(wǎng)頁(yè)。;

創(chuàng)建了這兩個(gè)JSP文件,建立了JavaBean資源文件并編輯了它后,你就可以從http://localhost:8080/quote.jsp加載“quote.jsp文件以查看結(jié)果,假設(shè)你沒有更改JSWDK安裝設(shè)置,轉(zhuǎn)而使用別的端口。這個(gè)網(wǎng)頁(yè)當(dāng)然能做得更漂亮,但是它已實(shí)現(xiàn)了需要實(shí)現(xiàn)的功能,并且很好地展示了JSP的功能。

歡迎使用JavaServer Pages(以下簡(jiǎn)稱JSP)技術(shù)—制作動(dòng)態(tài)內(nèi)容網(wǎng)頁(yè)的方法。;

如果你希望學(xué)習(xí)這篇教程的話,我想你一定是這項(xiàng)技術(shù)的新手。你可能想成為一名利用JSP技術(shù)開發(fā)網(wǎng)絡(luò)應(yīng)用程序的程序員或者網(wǎng)頁(yè)設(shè)計(jì)師。本教程中包含了一系列JSP的技巧和一些簡(jiǎn)單的代碼的寫法,每一步都舉了一組例子來(lái)講述原理。;

我建議你在學(xué)習(xí)本教程之前先去看一看FAQ,了解如果配置你的服務(wù)器好讓他能支持并運(yùn)行JSP。那樣你就可以跳過(guò)前邊的內(nèi)容直接看你感興趣的內(nèi)容了。;

OK,費(fèi)話少說(shuō),Let’s go!

第一課:真正的開始;

現(xiàn)在開始做我們的第一個(gè)JSP頁(yè)面。圖1-1展示了一個(gè)最簡(jiǎn)單的JSP頁(yè)面,接下來(lái)是兩段代碼。;

[dukebanner.html];

<table border=0 width=400 cellspacing=0 cellpadding=0>;

<tr>;

<td height=150 width=150> &nbsp; </td>;

<td width=250> &nbsp; </td>;

</tr>;

<tr>;

<td width=150> &nbsp; </td>;

<td align=right width=250>;

<img src=duke.waving.gif></td></tr></table><br>;

helloworld.jsp;

<%@ page info="a hello world example" %>;

<html>;

<head><title>Hello, World</title></head>;

<body bgcolor="#ffffff" background="background.gif">;

<%@ include file="dukebanner.html" %>;

<table>;

<tr>;

<td width=150> &nbsp; </td>;

<td width=250 align=right> <h1>Hello, World!</h1> </td>;

</tr>;

</table>;

</body>;

</html>;

頁(yè)面說(shuō)明:;

在很多JSP文件中你都要寫上這樣的說(shuō)明。在helloword.jsp中:;

<%@ page info="a hello world example" %>;

傻瓜也看得出來(lái),這句話沒什么大用,只是簡(jiǎn)要的說(shuō)明一下這段代碼的作用。;

你可以在JSP文件中的任何地方寫這種代碼,但是好的習(xí)慣是把他寫在最前面,還有,因?yàn)樗荍SP標(biāo)簽,記住一定要放在<html>前面,呵;

include說(shuō)明:;

include用來(lái)在主JSP文件中調(diào)用本地的一個(gè)其他文件,通常是一些版權(quán)信息啦,腳本語(yǔ)言啦等其他任何你想在其他文件中重復(fù)使用的代碼。在這個(gè)例子中就是調(diào)用了一個(gè)圖片其實(shí)。大家明白這個(gè)意思就得了。;

隨便說(shuō)兩句:;

在JSP中對(duì)寫法非常敏感,不可以有一點(diǎn)錯(cuò)誤。舉個(gè)例子,把<jsp:useBean>寫成<jsp:usebean>那樣服務(wù)器會(huì)出現(xiàn)錯(cuò)誤信息。一些如類名,包名,路徑名還有其他的敏感的標(biāo)簽等千萬(wàn)不要寫錯(cuò)。有一些JSP標(biāo)簽?zāi)貌粶?zhǔn)的話就去查一下JavaServer Pages語(yǔ)法卡片。;

代碼寫好了,如何試驗(yàn)一下呢?;

我這里寫的UNIX下的方法,如果你用Windows,那么換一下路徑就可以了;

1、 先建一個(gè)目錄:../jswdk-1.0/examples/jsp/tutorial/helloworld;

2、 把這些文件拷過(guò)去background.gif, duke.waving.gif, dukebanner.html, and helloworld.jsp;

3、 cd ../jswdk-1.0,然后startserver;

4、 開一個(gè)瀏覽器,;

5、 http://yourMachineName:8080/examples/jsp/tutorial/helloworld/helloworld.jsp

第二課:用HTML表單;

大多數(shù)情況下,商業(yè)的網(wǎng)站都要有一些表單,比如說(shuō)輸入一下消費(fèi)者的姓名啦,地址啦,或者敲一個(gè)詞來(lái)用搜索引擎來(lái)查一下啦,或者市場(chǎng)人員從來(lái)訪者處收集一些數(shù)據(jù)供參考什么的。;

那些表單傳回的數(shù)據(jù)怎么處理的?;

來(lái)訪者通過(guò)表單向JSP引擎輸入了數(shù)據(jù),并保存在了request對(duì)象中,那么接下來(lái)怎么辦?;

圖2-1向你展示了數(shù)據(jù)流是如何在服務(wù)器和客戶之間傳遞的(至少在SUN的JSP reference implementation是這么做的,別的JSP引擎工作起來(lái)可能會(huì)有一點(diǎn)點(diǎn)的不同,其實(shí)大同小異,都差不多);

字兒太小了,可能看不大清吧?俺來(lái)解釋一下了只好。;

首先,JSP引擎把存放在request對(duì)象中的數(shù)據(jù)發(fā)到JSP頁(yè)面指定的服務(wù)器端的組件(JavaBeans組件, servlet,或者enterprise bean),組件收到這些個(gè)數(shù)據(jù)以后,有可能再存這些數(shù)據(jù)到數(shù)據(jù)庫(kù)或者其他的地方存放起來(lái),同時(shí),返回一個(gè)response對(duì)象給JSP引擎。JSP引擎再把response對(duì)象傳給JSP頁(yè)面,這時(shí)的頁(yè)面包含了定義好的格式和從服務(wù)器端得到的數(shù)據(jù)。這時(shí)JSP引擎和Web服務(wù)器再發(fā)送一個(gè)整理好的完整的頁(yè)面給客戶,也就是這們?cè)跒g覽器上看到的結(jié)果。客戶和服務(wù)器間的通信協(xié)議可以用HTTP,當(dāng)然也可以用其他的。;

Request和Response對(duì)象在你制作的JSP原代碼中起作用。到于request對(duì)象到底怎么用,我要在接下來(lái)詳細(xì)的講給你聽。;

如何創(chuàng)建表單;

用HTML定義一些有代表性的表單做成一個(gè)JSP文件,然后用JSP標(biāo)簽在表單和服務(wù)器端對(duì)象(通常都用Bean)傳遞數(shù)據(jù)。一般情況下是這么干的:;

1、 寫JSP原文件,創(chuàng)建一些HTML的表單并命名。;

2、 在Java文件里寫B(tài)ean,定義屬性,GET或者SET方法來(lái)配合已經(jīng)被你指定好名字的表單。;

3、 回到JSP原文件中,增加<jsp:useBean>標(biāo)簽來(lái)創(chuàng)建一個(gè)或者調(diào)用一個(gè)現(xiàn)成的Bean。;

4、 增加<jsp:setProperty>標(biāo)簽設(shè)置HTML表單中需要SET方法的Bean的屬性。;

5、 增加<jsp:getProperty>標(biāo)簽設(shè)置HTML表單中需要GET方法的Bean的屬性。;

6、 如果需要處理更多的用戶數(shù)據(jù),用request對(duì)象。;

說(shuō)了半天你可能看不懂,其實(shí)看一個(gè)例子你就懂了。;

先看一個(gè)簡(jiǎn)單的hello的例子吧:;

這段程序其實(shí)還是計(jì)算機(jī)程序里那個(gè)最經(jīng)典的“hello,world的程序,只不過(guò)呢,我使他撓了一點(diǎn)彎兒,使他看起來(lái)比較智能和復(fù)雜。首先你輸入你的名字,然后Duke跟你說(shuō):“hello!

看看代碼吧:;

dukebanner.html;

<table border="0" width="400" cellspacing="0" cellpadding="0">;

<tr>;

<td height="150" width="150"> &nbsp; </td>;

<td width="250"> &nbsp; </td>;

</tr>;

<tr>;

<td width="150"> &nbsp; </td>;

<td align="right" width="250">;

<img src="duke.waving.gif"> </td>;

</tr></table><br>;

主JSP文件:hellouser.jsp;

<%@ page import="hello.NameHandler" %>;

<jsp:useBean id="mybean" scope="page" class="hello.NameHandler" />;

<jsp:setProperty name="mybean" property="*" />;

<html>;

<head><title>Hello, User</title></head>;

<body bgcolor="#ffffff" background="background.gif">;

<%@ include file="dukebanner.html" %>;

<table border="0" width="700">;

<tr><td width="150"> &nbsp; </td>;

<td width="550">;

<h1>My name is Duke. What's yours?</h1></td></tr>;

<tr><td width="150" &nbsp; </td><td width="550">;

<form method="get">;

<input type="text" name="username" size="25">;

<br>;

<input type="submit" value="Submit">;

<input type="reset" value="Reset">;

</td></tr>;

</form>;

</table>;

<%;

If ( request.getParameter("username") != null );

{;

%>;

<% @ include file="response.jsp" %>;

<% };

%>;

</body></html>;

回應(yīng)文件:response.jsp;

<table border="0" width="700">;

<tr>;

<td width="150"> &nbsp; </td>;

<td width="550">;

<h1>Hello, <jsp:getProperty name="mybean" property="username" />!;

</h1>;

</td>;

</tr>;

</table>;

處理數(shù)據(jù)的Bean:(namehandler.java);

package hello;;

public class NameHandler;

{;

private String username;;

public NameHandler() {;

username = null;;

};

public void setUsername( String name ) {;

username = name;;

};

public String getUsername() {;

return username;;

};

};

建立HTML表單;

一個(gè)HTML的窗分為三個(gè)部分:<form>標(biāo)簽,輸入方法,提交按鈕發(fā)數(shù)據(jù)到服務(wù)器。一般的HTML頁(yè)面里,是這么寫的<form method=get action=someurl>,在其他的頁(yè)面里的action屬性可能是其他特殊的CGI程序或者其他能處理數(shù)據(jù)的程序,那么在JSP里邊是怎么用的呢,呵,如果你想把數(shù)據(jù)發(fā)到Bean里的話那么你可以省略action里邊的東里了,直接寫<jsp:useBean>標(biāo)簽或者其他特定的JSP文件了。接下來(lái)的那些表單和普通的HTML差不多了,<input>的方法,然后加一個(gè)提交按鈕,可能還有一個(gè)Reset按鈕,對(duì)了,別忘了,還得給每一個(gè)input表單加一個(gè)名字。;

這么寫:<input type="text" name="username">;

使用GET和POST方法;

用GET和POST方法可以發(fā)數(shù)據(jù)到服務(wù)器,在JSP程序中GET和POST方法可以發(fā)數(shù)據(jù)到Bean、servlet、或者其他服務(wù)器端的組件。;

理論上說(shuō),GET是從服務(wù)器上請(qǐng)求數(shù)據(jù),POST是發(fā)送數(shù)據(jù)到服務(wù)器。事實(shí)上,GET方法是把數(shù)據(jù)參數(shù)隊(duì)列(query string)加到一個(gè)URL上,值和表單是一一對(duì)應(yīng)的。比如說(shuō),name=John。在隊(duì)列里,值和表單用一個(gè)&符號(hào)分開,空格用+號(hào)替換,特殊的符號(hào)轉(zhuǎn)換成十六進(jìn)制的代碼。因?yàn)檫@一隊(duì)列在URL里邊,這樣隊(duì)列的參數(shù)就能看得到,可以被記錄下來(lái),或更改。通常GET方法還限制字符的大小。事實(shí)上POST方法可以沒有時(shí)間限制的傳遞數(shù)據(jù)到服務(wù)器,用戶在瀏覽器端是看不到這一過(guò)程的,所以POST方法比較適合用于發(fā)送一個(gè)保密的(比如信用卡號(hào))或者比較大量的數(shù)據(jù)到服務(wù)器。;

寫B(tài)ean;

如果JSP程序用到了Bean,你就得按照J(rèn)avaBeans API的說(shuō)明設(shè)計(jì)你的Bean。;

記住下面兩個(gè)關(guān)鍵部分。;

如果JSP程序里用<jsp:getProperty>標(biāo)簽,那你就得在Bean里邊配合的GET方法。;

如果JSP程序進(jìn)而用 <jsp:setProperty>標(biāo)簽,那你就得在Bean里邊配合的Set方法。;

設(shè)置參數(shù)到Bean或者從里邊取參數(shù)將在以后的部分詳細(xì)介紹。;

傳數(shù)據(jù)到Bean;

把HTML表單的數(shù)據(jù)傳到Bean里需要兩個(gè)工作:;

· 用<jsp:useBean>標(biāo)簽創(chuàng)建或者定位到Bean;

· 在Bean里面用<jsp:serProperty>設(shè)置屬性值;

第一步用<jsp:useBean>標(biāo)簽創(chuàng)建或者定位到Bean一定要用在<jsp:setProperty>之前,<jsp:useBean>首先按照你指定的名字查找Bean,如果沒找到,會(huì)給你指定一個(gè)。允許在一個(gè)JSP文件中創(chuàng)建一個(gè)Bean,然后再另一個(gè)文件中調(diào)用,這就給了Bean一個(gè)很廣泛的運(yùn)行空間。;

第二步在Bean里面用<jsp:setProperty>設(shè)置屬性值。最簡(jiǎn)單的方法是把值定義成與表單名相配合。舉個(gè)例子,如果你把表單名定義成“username那么,你就在Bean里定義屬性“username然后用方法getUsername和setUsername。;

當(dāng)然也可以定義成不同的名字,只要你不認(rèn)為麻煩。誰(shuí)讓你記憶力好呢!;

Request對(duì)象;

用戶輸入的數(shù)據(jù)用來(lái)存放在Request對(duì)象里,用javax.servlet.HttpServletRequest來(lái)執(zhí)行(你也可以用其他不同的工具來(lái)執(zhí)行,但他們其實(shí)都是javax.servlet.HttpServletRequest的子集);

你也可以直接用scriptlet來(lái)直接訪問Request對(duì)象。Scriptlet將在下一講里邊詳細(xì)的討論,現(xiàn)在你只需要知道他是用腳本語(yǔ)言寫的一段放在<% 和%> 之間的代碼就足夠了。在JSP 1.0中,你必須用JavaTM程序語(yǔ)言作為你的腳本語(yǔ)言。;

你經(jīng)常會(huì)用到如下方法處理Request對(duì)象:;

方法;

說(shuō)明;

執(zhí)行結(jié)果;

getRequest;

Javax.servlet.jsp.PageContext;

返回當(dāng)前Request對(duì)象;

getParameterNames;

javax.servlet.ServletRequest;

返回當(dāng)前Request對(duì)象參數(shù)名;

getParameterValues;

javax.servlet.ServletRequest;

返回當(dāng)前Request對(duì)象參數(shù)值;

你將會(huì)發(fā)現(xiàn)其他方法包括ServletRequest,HttpServletRequest或者其他任何ServletRequest的子集。;

JSP引擎經(jīng)常在scenes之后使用Request對(duì)象,即使你沒有明確地在JSP文件中調(diào)用。;

從Bean中調(diào)數(shù)據(jù)到JSP頁(yè)面;

一旦用戶的數(shù)據(jù)被傳到Bean,你就想重新得到數(shù)據(jù),然后在JSP面頁(yè)中顯示出來(lái)。想達(dá)到這一步,你就得用到<jsp:getProperty>標(biāo)簽。傳Bean名和屬性名:;

<h1>Hello, <jsp:getProperty name="mybean" property="username"/>!;

<jsp:useBean>, <jsp:setProperty>, 和 <jsp:getProperty>標(biāo)簽必須相配,舉個(gè)例子:;

hellouser.jsp:;

<jsp:useBean id="mybean" scope="session" class="hello.NameHandler" />;

<jsp:setProperty name="mybean" property="*" />;

response.jsp:;

<h1>Hello, <jsp:getProperty name="mybean" property="username"/>!;

在這個(gè)例子里,標(biāo)簽被放在兩個(gè)文件中,但是指定的名字都是相同的,如果不同的話,那么系統(tǒng)會(huì)返回一個(gè)錯(cuò)誤信息。;

如何運(yùn)行例子;

我用的是UNIX主機(jī),如果你用windows,那么改相應(yīng)的路徑即可。;

創(chuàng)建路徑../jswdk-1.0/examples/jsp/tutorial/hellouser.;

把文件background.gif, duke.waving.gif, dukebanner.html, hellousr.jsp和response.jsp文件放進(jìn)去。;

創(chuàng)建一個(gè)目錄,../jswdk-1.0/examples/WEB-INF/jsp/beans/hello;

把文件NameHandler.java和NameHandler.class放進(jìn)去。;

cd../jswdk-1.0然后startserver;

打開瀏覽器http://計(jì)算機(jī)名:8080/examples/jsp/tutorial/hellouser/hellouser.jsp

使用腳本;

在有些地方,你大概要加一些好的,成熟的程序到你的JSP頁(yè)里,JSP的標(biāo)簽雖然很強(qiáng)大,但是完成某些工作還是比較費(fèi)力的困難的。這時(shí)你可以使用腳本語(yǔ)言段來(lái)補(bǔ)充JSP標(biāo)簽。;

使用的JSP引擎是支持腳本語(yǔ)言的,SUN的JSP參考文說(shuō)明,必須使用Java程序語(yǔ)言來(lái)編寫腳本,但是其他第三方的JSP引擎允許使用其他語(yǔ)言來(lái)寫腳本程。;

如何增加腳本;

首先,你必須了解一些增加腳本元素到JSP頁(yè)中的一些基本規(guī)則;

1、 在JSP頁(yè)面里用Page指令定義腳本(默認(rèn)值是Java,一般不需要定義);

2、 聲明語(yǔ)法<%!……%>聲明變量和方法(函數(shù))。;

3、 表達(dá)式語(yǔ)法<%=……%>定義腳本語(yǔ)言表達(dá)式;

4、 腳本語(yǔ)法〈%……%>可以操作聲明、表達(dá)式和其他類型合法的代碼段在頁(yè)腳本語(yǔ)言。;

5、 一定要在結(jié)尾加%>標(biāo)簽;

聲明、表達(dá)式、腳本使用起來(lái)有一些相似,但也有一些不同讓我們用一些例子來(lái)講述一下相同點(diǎn)和不同點(diǎn)吧。

聲明<%!……%>包含了一個(gè)或多個(gè)變量和方法,結(jié)尾以分號(hào)分隔。;

例:<%! Int I=0 ; %>;

<%! Int a, b ; double c ; %>;

<%! Circle a = new circle(2.0) ; %>;

在頁(yè)面中使用變量和方法之前必須聲明;

聲明的范圍通常是JSP頁(yè),但如果頁(yè)面中使用INCLUDE指令包含其他頁(yè)面,范圍應(yīng)變得擴(kuò)展到被包含的頁(yè)面。;

表達(dá)式<%=……%>可以在頁(yè)面中包含任何合法的語(yǔ)言表達(dá)式,不用分號(hào)。;

例:<%= Math.sqrt(2) %>;

<%= item[I] %>;

<%= a+b+c %>;

<%= new java.util.date() %>;

表達(dá)式和腳本的一個(gè)關(guān)鍵的不同點(diǎn)就是不需要分號(hào)。如果你需要在腳本中使用表達(dá)式就必須加分號(hào)。;

腳本<%……%>允許你寫的任何數(shù)量的腳本語(yǔ)言;

例:<% String name=null ;;

If (request.getParmeter("name")==null{;

%>;

記住在腳本中必須使用分號(hào)結(jié)尾。;

猜數(shù)字游戲;

猜數(shù)字游戲非常的有趣,而且從這里你還可以學(xué)到很多表達(dá)式的用法。;

代碼;

顯示用的主屏幕(numguess.jsp);

<!--;

Number Guess Game;

Written by Jason Hunter, CTO, K&A Software;

[email protected], http://www.servlets.com;

Copyright 1999, K&A Software;

Distributed by Sun Microsystems with permission;

-->;

<%@ page import = "num.NumberGuessBean" %>;

<jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session" />;

<jsp:setProperty name="numguess" property="*" />;

<html>;

<head><title>Number Guess</title></head>;

<body bgcolor="white">;

<font size=4>;

<% if (numguess.getSuccess() ) { %>;

Congratulations! You got it.;

And after just <%= numguess.getNumGuesses() %>tries.<p>;

<% numguess.reset(); %>;

Care to <a href="numguess.jsp">try again</a>?;

<% } else if (numguess.getNumGuesses() == 0) { %>;

Welcome to the Number Guess game.<p>;

I'm thinking of a number between 1 and 100.<p>;

<form method=get>;

What's your guess? <input type=text name=guess>;

<input type=submit value="Submit">;

</form>;

<% } else { %>;

Good guess, but nope. Try <b><%= numguess.getHint() %></b>.;

You have made <%= numguess.getNumGuesses() %> guesses.;

<p>I'm thinking of a number between 1 and 100.;

<p><form method=get>;

What's your guess? <input type=text name=guess>;

<input type=submit value="Submit">;

</form>;

<% } %>;

</font>;

</body>;

</html>;

操作程序(NumberGuessBean.java);

// Number Guess Game;

// Written by Jason Hunter, CTO, K&A Software;

// [email protected], http://www.servlets.com;

// Copyright 1999, K&A Software;

// Distributed by Sun Microsystems with permission;

package num;;

import java.util.*;;

public class NumberGuessBean {;

int answer;;

boolean success;;

String hint;;

int numGuesses;;

public NumberGuessBean() {;

reset();;

};

public void setGuess(String guess) {;

numGuesses++;;

int g;;

try {;

g = Integer.parseInt(guess);;

};

catch (NumberFormatException e) {;

g = -1;;

};

if (g == answer) {;

success = true;;

};

else if (g == -1) {;

hint = "a number next time";;

};

else if (g < answer) {;

hint = "higher";;

};

else if (g > answer) {;

hint = "lower";;

};

};

public boolean getSuccess() {;

return success;;

};

public String getHint() {;

return "" + hint;;

};

public int getNumGuesses() {;

return numGuesses;;

};

public void reset() {;

answer = Math.abs(new Random().nextInt() % 100);

+ 1;;

success = false;;

numGuesses = 0;;

};

};

在JSP文件中使用腳本;

numguess.jsp是一個(gè)非常有趣兒的用腳本寫的例子,你看他的結(jié)構(gòu)其實(shí)是一個(gè)很大的IF……ELSE結(jié)構(gòu),但是很一個(gè)從句又都是用HTML寫的,看起來(lái)象一個(gè)大的程序段。;

不過(guò)你也不一定非得象numguess.jsp那樣用HTML和JSP標(biāo)簽一起來(lái)寫腳本。在<%和%>標(biāo)簽之間,你可以寫任意多行的腳本代碼,在通常情況下,盡量少用腳本來(lái)處理程序,而盡可能的使用servlets或者Beans,這樣你的程序看起來(lái)會(huì)非常的清析,明了。話又說(shuō)回來(lái),怎么寫JSP還得根據(jù)你的習(xí)慣和愛好,我不強(qiáng)迫非得使用任何一種方法,SUN的JSP詳細(xì)說(shuō)明書不規(guī)定腳本的長(zhǎng)度。;

用標(biāo)簽組合腳本;

使用HTML和JSP標(biāo)簽來(lái)寫腳本的時(shí)候,注意前后的標(biāo)簽不要忘記,一定要“封好。說(shuō)的不明白,舉個(gè)例子吧:;

<% } else { %> <!-- 用JSP標(biāo)簽的時(shí)候先關(guān)上 -->;

... 這時(shí)候用JSP標(biāo)簽吧 ...;

<% } %> <!-- 這樣你應(yīng)該看懂了吧?! -->;

開始的時(shí)候這種做法看起來(lái)可能有一點(diǎn)奇怪,但它以確保你JSP文件編譯的時(shí)候腳本的成功轉(zhuǎn)換。;

那么,腳本什么時(shí)候執(zhí)行呢?;

一個(gè)JSP原文件的處理分為兩個(gè)階段:一個(gè)是HTTP的編譯時(shí)候,一個(gè)是請(qǐng)求的處理時(shí)間。;

HTTP編譯的時(shí)候,當(dāng)用戶第一次讀JSP頁(yè)面的時(shí)候,JSP的原代碼被編譯成CLASS,通常是servlet。HTML標(biāo)簽和JSP標(biāo)簽在這個(gè)時(shí)候同時(shí)被處理了,這之前用戶還沒有任何的請(qǐng)求被提交。;

請(qǐng)求處理時(shí)間是當(dāng)用戶在JSP頁(yè)面中提交了一個(gè)請(qǐng)求,這時(shí)請(qǐng)求由客戶端被request對(duì)象傳到了服務(wù)器端,JSP引擎根據(jù)用戶提交的值執(zhí)行編譯過(guò)的JSP文件或者servlet。;

當(dāng)你在JSP頁(yè)中使用腳本的時(shí)候,你必須知道他們什么時(shí)候被執(zhí)行。聲明在HTTP編譯階段就已經(jīng)被處理了,其他腳本,表達(dá)式在編譯JSP文件的時(shí)候也可用。表達(dá)式在HTTP編譯的時(shí)候也被執(zhí)行了。表達(dá)式的值被轉(zhuǎn)換成了字符串被插入到JSP文件中一塊兒被編譯。其實(shí)在請(qǐng)求階段,腳本也是可以利用的。;

如何運(yùn)行例子;

我現(xiàn)在給出的都是在UNIX風(fēng)格下的路徑,如果你用Windows,那么改成Windows風(fēng)格路徑;

1、猜數(shù)字游戲在裝TOMCAT或者JSWDK的時(shí)候就已經(jīng)裝好了。;

2、.jsp和.html文件在../jswdk-1.0.1/examples/num中;

3、.java和.class文件在../jswdk-1.0.1/examples/WEB-INF/jsp/bean/num中;

4、開瀏覽器,http://機(jī)器名/examples/jsp/num/numguess.jsp;

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 深夜爽爽爽gif福利免费 | 精品久久久久久中文字幕网 | 99国产精品久久久久久久日本 | 国产成人一区在线播放 | 亚洲加勒比在线 | 99热只有精品一区二区 | 特别福利视频在线观看 | 91精品人成在线观看 | 中文乱码字幕午夜无线观看 | 国产成人精品综合久久久软件 | 国产成人综合精品 | 欧美大片一区 | 大陆精品自在线拍国语 | 国产香蕉影视院 | 中文三 级 黄 色 片 | 久久欧美 | 性做久久久久久免费观看 | 精品免费国产一区二区三区 | 日韩乱码视频 | 深夜福利成人 | 千涩成人网 | 亚洲综合在线另类色区奇米 | 毛片久久久 | 成a人v| 日韩三级在线播放 | 中文字幕亚洲国产 | videosfree性欧美另类 | 大伊香蕉精品视频在线观看 | 八戒午夜精品视频在线观看 | 国产日韩在线视频 | 亚洲无吗视频 | 久久99精品免费视频 | 欧美一级毛片免费观看视频 | 真人毛片免费全部播放完整 | 国产日韩欧美在线一二三四 | 欧美午夜精品久久久久免费视 | 久久久久久久久免费影院 | 日本特黄特色高清免费视频 | 91视频国内 | 日本a级片免费看 | 日韩欧美在线观看 |