|
<>JSP入門(mén)教程(4) <BR> <BR> <BR>使用腳本 <BR>在有些地方,你大概要加一些好的,成熟的程序到你的JSP頁(yè)里,JSP的標簽雖然很強大,但是完成某些工作還是比較費力的困難的。這時(shí)你可以使用腳本語(yǔ)言段來(lái)補充JSP標簽。 <BR>使用的JSP引擎是支持腳本語(yǔ)言的,SUN的JSP參考文說(shuō)明,必須使用Java程序語(yǔ)言來(lái)編寫(xiě)腳本,但是其他第三方的JSP引擎允許使用其他語(yǔ)言來(lái)寫(xiě)腳本程。 <BR>如何增加腳本 <BR>首先,你必須了解一些增加腳本元素到JSP頁(yè)中的一些基本規則 <BR>1、 在JSP頁(yè)面里用Page指令定義腳本(默認值是Java,一般不需要定義) <BR>2、 聲明語(yǔ)法<%!……%>聲明變量和方法(函數)。 <BR>3、 表達式語(yǔ)法<%=……%>定義腳本語(yǔ)言表達式 <BR>4、 腳本語(yǔ)法〈%……%>可以操作聲明、表達式和其他類(lèi)型合法的代碼段在頁(yè)腳本語(yǔ)言。 <BR>5、 一定要在結尾加%>標簽 <BR>聲明、表達式、腳本使用起來(lái)有一些相似,但也有一些不同讓我們用一些例子來(lái)講述一下相同點(diǎn)和不同點(diǎn)吧。 <BR>聲明<%!……%>包含了一個(gè)或多個(gè)變量和方法,結尾以分號分隔。 <BR>例:<%! Int I=0 ; %> <BR><%! Int a, b ; double c ; %> <BR><%! Circle a = new circle(2.0) ; %> <BR>在頁(yè)面中使用變量和方法之前必須聲明 <BR>聲明的范圍通常是JSP頁(yè),但如果頁(yè)面中使用INCLUDE指令包含其他頁(yè)面,范圍應變得擴展到被包含的頁(yè)面。 <BR>表達式<%=……%>可以在頁(yè)面中包含任何合法的語(yǔ)言表達式,不用分號。 <BR>例:<%= Math.sqrt(2) %> <BR><%= item %> <BR><%= a+b+c %> <BR><%= new java.util.date() %> <BR>表達式和腳本的一個(gè)關(guān)鍵的不同點(diǎn)就是不需要分號。如果你需要在腳本中使用表達式就必須加分號。 <BR>腳本<%……%>允許你寫(xiě)的任何數量的腳本語(yǔ)言 <BR>例:<% String name=null ; <BR>If (request.getParmeter("name")==null{ <BR>%> <BR>記住在腳本中必須使用分號結尾。 <BR>猜數字游戲 <BR>猜數字游戲非常的有趣,而且從這里你還可以學(xué)到很多表達式的用法。 <BR>代碼 <BR>顯示用的主屏幕(numguess.jsp) <BR><!-- <BR>Number Guess Game <BR>Written by Jason Hunter, CTO, K&A Software <BR><a href="mailtjasonh@kasoftware.com" target="_blank" >jasonh@kasoftware.com</A>, <a href="http://www.servlets.com" target="_blank" >http://www.servlets.com</A> <BR>Copyright 1999, K&A Software <BR>Distributed by Sun Microsystems with permission <BR>--> <BR><%@ page import = "num.NumberGuessBean" %> </P>
<><jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session" /> <BR><jsp:setProperty name="numguess" property="*" /> </P>
<><html> <BR><head><title>Number Guess</title></head> <BR><body bgcolor="white"> <BR><font size=4> </P>
<P><% if (numguess.getSuccess() ) { %> </P>
<P>Congratulations! You got it. <BR>And after just <%= numguess.getNumGuesses() %>tries.<p> </P>
<P><% numguess.reset(); %> <BR>Care to <a href="numguess.jsp">try again</a>? </P>
<P><% } else if (numguess.getNumGuesses() == 0) { %> </P>
<P>Welcome to the Number Guess game.<p> <BR>I'm thinking of a number between 1 and 100.<p> </P>
<P><form method=get> <BR>What's your guess? <input type=text name=guess> <BR><input type=submit value="Submit"> <BR></form> </P>
<P><% } else { %> <BR>Good guess, but nope. Try <b><%= numguess.getHint() %></b>. <BR>You have made <%= numguess.getNumGuesses() %> guesses. <BR><p>I'm thinking of a number between 1 and 100. <BR><p><form method=get> </P>
<P>What's your guess? <input type=text name=guess> <BR><input type=submit value="Submit"> <BR></form> <BR><% } %> <BR></font> <BR></body> <BR></html> </P>
<P>操作程序(NumberGuessBean.java) <BR>// Number Guess Game <BR>// Written by Jason Hunter, CTO, K&A Software <BR>// <a href="mailtjasonh@kasoftware.com" target="_blank" >jasonh@kasoftware.com</A>, <a href="http://www.servlets.com" target="_blank" >http://www.servlets.com</A> <BR>// Copyright 1999, K&A Software <BR>// Distributed by Sun Microsystems with permission </P>
<P>package num; <BR>import java.util.*; <BR>public class NumberGuessBean { <BR>int answer; <BR>boolean success; <BR>String hint; <BR>int numGuesses; <BR>public NumberGuessBean() { <BR>reset(); <BR>} <BR>public void setGuess(String guess) { <BR>numGuesses++; <BR>int g; <BR>try { <BR>g = Integer.parseInt(guess); <BR>} <BR>catch (NumberFormatException e) { <BR>g = -1; <BR>} <BR>if (g == answer) { <BR>success = true; <BR>} <BR>else if (g == -1) { <BR>hint = "a number next time"; <BR>} <BR>else if (g < answer) { <BR>hint = "higher"; <BR>} <BR>else if (g > answer) { <BR>hint = "lower"; <BR>} <BR>} <BR>public boolean getSuccess() { <BR>return success; <BR>} <BR>public String getHint() { <BR>return "" + hint; <BR>} <BR>public int getNumGuesses() { <BR>return numGuesses; <BR>} <BR>public void reset() { <BR>answer = Math.abs(new Random().nextInt() % 100) <BR>+ 1; <BR>success = false; <BR>numGuesses = 0; <BR>} <BR>} </P>
<P>在JSP文件中使用腳本 <BR>numguess.jsp是一個(gè)非常有趣兒的用腳本寫(xiě)的例子,你看他的結構其實(shí)是一個(gè)很大的IF……ELSE結構,但是很一個(gè)從句又都是用HTML寫(xiě)的,看起來(lái)象一個(gè)大的程序段。 <BR>不過(guò)你也不一定非得象numguess.jsp那樣用HTML和JSP標簽一起來(lái)寫(xiě)腳本。在<%和%>標簽之間,你可以寫(xiě)任意多行的腳本代碼,在通常情況下,盡量少用腳本來(lái)處理程序,而盡可能的使用servlets或者Beans,這樣你的程序看起來(lái)會(huì )非常的清析,明了。話(huà)又說(shuō)回來(lái),怎么寫(xiě)JSP還得根據你的習慣和愛(ài)好,我不強迫非得使用任何一種方法,SUN的JSP詳細說(shuō)明書(shū)不規定腳本的長(cháng)度。 </P>
<P>用標簽組合腳本 <BR>使用HTML和JSP標簽來(lái)寫(xiě)腳本的時(shí)候,注意前后的標簽不要忘記,一定要“封”好。說(shuō)的不明白,舉個(gè)例子吧: <BR><% } else { %> <!-- 用JSP標簽的時(shí)候先關(guān)上 --> </P>
<P>... 這時(shí)候用JSP標簽吧 ... </P>
<P><% } %> <!-- 這樣你應該看懂了吧?! --> <BR>開(kāi)始的時(shí)候這種做法看起來(lái)可能有一點(diǎn)奇怪,但它以確保你JSP文件編譯的時(shí)候腳本的成功轉換。 </P>
<P>那么,腳本什么時(shí)候執行呢? <BR>一個(gè)JSP原文件的處理分為兩個(gè)階段:一個(gè)是HTTP的編譯時(shí)候,一個(gè)是請求的處理時(shí)間。 </P>
<P>HTTP編譯的時(shí)候,當用戶(hù)第一次讀JSP頁(yè)面的時(shí)候,JSP的原代碼被編譯成CLASS,通常是servlet。HTML標簽和JSP標簽在這個(gè)時(shí)候同時(shí)被處理了,這之前用戶(hù)還沒(méi)有任何的請求被提交。 </P>
<P>請求處理時(shí)間是當用戶(hù)在JSP頁(yè)面中提交了一個(gè)請求,這時(shí)請求由客戶(hù)端被request對象傳到了服務(wù)器端,JSP引擎根據用戶(hù)提交的值執行編譯過(guò)的JSP文件或者servlet。 </P>
<P>當你在JSP頁(yè)中使用腳本的時(shí)候,你必須知道他們什么時(shí)候被執行。聲明在HTTP編譯階段就已經(jīng)被處理了,其他腳本,表達式在編譯JSP文件的時(shí)候也可用。表達式在HTTP編譯的時(shí)候也被執行了。表達式的值被轉換成了字符串被插入到JSP文件中一塊兒被編譯。其實(shí)在請求階段,腳本也是可以利用的。 </P>
<P>如何運行例子 <BR>我現在給出的都是在UNIX風(fēng)格下的路徑,如果你用Windows,那么改成Windows風(fēng)格路徑 <BR>1、猜數字游戲在裝TOMCAT或者JSWDK的時(shí)候就已經(jīng)裝好了。 <BR>2、.jsp和.html文件在../jswdk-1.0.1/examples/num中 <BR>3、.java和.class文件在../jswdk-1.0.1/examples/WEB-INF/jsp/bean/num中 <BR>4、開(kāi)瀏覽器,http://機器名/examples/jsp/num/numguess.jsp <BR></P> |
|