1. JSP頁面的基本結構
在傳統的HTML頁面中加入Java程序片和JSP標簽,就構成了一個JSP頁面。一個JSP頁面可由5種元素組合而成:(1)普通的HTML標記符;(2)JSP標記,如指令標記、動作標記;(3)成員變量和方法;(4)Java程序片;(5)Java表達式。
【例2-1】
<%@ page contentType="text/html;charset=UTF-8" %> <!--JSP指令標記-->
<%@ page import="java.util.Date" %> <!--JSP指令標記-->
<%! Date date; //數據聲明
int sum;
public int add(int m,int n){ //方法聲明
return m+n;
}
%>
<HTML><BODY bgcolor=cyan> <!--HTML標記-->
<FONT size=4><P>程序片創建Date對象:
<% date=new Date(); //Java程序片
out.println("<BR>"+date);
sum=add(12,34);
%>
<BR>在下一行輸出和:<BR>
<%= sum+100 %> <!--Java表達式-->
</FONT></BODY></HTML>
2. JSP的運行原理
當Tomcat服務器上的一個JSP頁面第一次被請求執行時,Tomcat服務器將啟動一個線程。該線程的任務是,首先將JSP頁面文件轉移成一個Java文件,再將這個Java文件編譯成一個字節碼文件,並將該字節碼文件加載到內存中,然后執行字節碼文件響應客戶的請求,該線程完成任務后,線程進入死亡狀態。這個字節碼的功能如下:
(1)把JSP頁面中普通的HTML標記符號,交給客戶的瀏覽器執行顯示。
(2)JSP標記、數據和方法聲明、Java程序片由Tomcat服務器負責執行,將需要顯示的結果發送給客戶的瀏覽器。
(3)Java表達式由Tomcat服務器負責計算,將結果轉化為字符串,交給客戶的瀏覽器負責顯示。
被加載到內存中的字節碼將常駐內存,當這個JSP頁面再次被請求執行時,Tomcat服務器將再啟動一個線程,直接執行常駐內存的字節碼文件來響應客戶。這也是JSP比ASP速度快的一個原因。而JSP頁面的首次執行往往由服務器管理者來進行。
當多個客戶請求一個JSP頁面時,Tomcat服務器為每個客戶啟動一個線程,該線程負責執行常駐內存的字節碼文件來響應相應客戶的請求。這些線程由Tomcat服務器來管理,將CPU的使用權在各線程之間快速切換,以保證每個線程都有機會執行字節碼文件,這與傳統的CGI為每個用戶啟動一個進程相比較,效率要高得多。
注:如果對JSP頁面進行了修改、保存,那么Tomcat服務器會生成新的字節碼。
下面是Tomcat服務器生成的example2_1.jsp的Java文件,我們把Tomcat服務器交給客戶端瀏覽器顯示的內容作了注釋(&)。在Tomcat服務器下的目錄work\Catalina\localhost\chapter2\org\apache\jsp中,可以找到Tomcat服務器生成的JSP頁面對應的Java文件和編譯Java文件得到的字節碼文件。
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.29
* Generated at: 2013-05-07 13:29:20 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.Date;
public final class example2_005f1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
Date date; //數據聲明
int sum;
public int add(int m,int n){ //方法聲明
return m+n;
}
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write(" <!--JSP指令標記-->\r\n"); (&)
out.write(" <!--JSP指令標記-->\r\n"); (&)
out.write("\r\n"); (&)
out.write("<HTML><BODY bgcolor=cyan> <!--HTML標記-->\r\n"); (&)
out.write("<FONT size=4><P>程序片創建Date對象:\r\n"); (&)
date=new Date(); //Java程序片
out.println("<BR>"+date);
sum=add(12,34);
out.write("\r\n"); (&)
out.write("<BR>在下一行輸出和:<BR>\r\n"); (&)
out.print( sum+100 ); (&)
out.write(" <!--Java表達式-->\r\n"); (&)
out.write("</FONT></BODY></HTML> "); (&)
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
3. JSP頁面的成員變量和方法
JSP頁面可包含HTML標記、JSP指令標記、成員變量和方法、Java程序片和Java表達式。
JSP頁面在標記符“<%!”和“%>”之間聲明他的成員變量和方法。
(1)聲明變量
可以在JSP頁面的標記符“<%!”和“%>”之間聲明變量,即在“<%!”和“%>”之間放置Java的變量聲明語句,變量的類型可以是Java語言允許的任何數據類型。
標記符“<%!”和“%>”之間聲明的變量稱為JSP頁面的成員變量。例如:
<%! Int x,y=100;
Date date;
%>
“<%!”和“%>”之間聲明的變量在整個JSP頁面內有效,因為Tomcat服務器將JSP頁面轉譯成Java文件時,將這些變量作為類的成員變量,這些變量的內存空間直到服務器關閉才釋放。當多個客戶請求一個JSP頁面時,Tomcat服務器為每個客戶啟動一個線程,這些用戶線程將共享JSP頁面的成員變量。這些用戶線程由Tomcat服務器來管理,Tomcat服務器將CPU的使用權在各個線程間快速切換,以保證每個線程輪流執行JSP頁面(對應的字節碼),因此任何一個線程對JSP頁面成員變量操作的結果,都會影響到其他線程。
【例2】利用成員變量被所有用戶共享這一性質,實現一個簡單的計數器。
Example2_2.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML><BODY bgcolor=pink><FONT size=4>
<%! int i=0;
%>
<% i++;
%>
<P>您是第<%=i%>個訪問本站的客戶。
</BODY></HTML>
效果如圖所示:
(2)聲明方法
JSP在“<%!”和“%>”之間定義若干個方法,這些方法可以在Java程序片中被調用執行。在例3中,我們在“<%!”和“%>”之間定義了兩個方法:add(int x,int y)和sub(int x,int y),然后在程序片中調用這兩個方法。
【例3】
Example2_3.jsp
<%@ page contentType="text/html;Charset=UTF-8" %>
<HTML><BODY bgcolor=yellow>
<%! int add(int x,int y){
return x+y;
}
int sub(int x,int y){
return x-y;
}
%>
<% out.println("<BR>調用add方法計算200與123之和:");
int a=add(200,123);
out.println(a);
out.println("<BR>調用sub方法計算200與123之差:");
int b=sub(200,123);
out.println(b);
%>
</BODY></HTML>
效果如圖所示:
4. JSP頁面中的Java程序片
可以在“<%”和“%>”之間插入Java程序片。一個JSP頁面可以有許多程序片,這些程序片按順序執行。在一個程序片中聲明的變量稱為JSP頁面的局部變量。該局部變量在JSP頁面后繼的所有程序片及表達式內都有效。這是因為,Tomcat服務器將JSP頁面轉譯成Java文件時,將程序片中聲明的變量作為類中某個方法的變量(即局部變量)使用。
當多個客戶請求一個JSP頁面時,Tomcat為每個客戶啟動一個線程,然后該線程執行JSP頁面,那么Java程序片將被執行多次,分別在不同的線程中執行。
Java程序片的執行具有如下特點:
(1)操作JSP頁面的成員變量
Java程序片中操作的成員變量是各線程共享的變量,任何一個線程對JSP成員變量操作的結果,都會影響到其他線程。
(2)調用JSP頁面的方法
Java程序片中可以出現方法調用語句,該方法必須是JSP頁面的方法。
(3)聲明操作局部變量
當一個線程享用CPU資源時,Tomcat讓該線程執行程序片。這時,程序片中的局部變量被分配內存空間,當輪到另一個線程享用CPU資源時,Tomcat讓該線程再次執行Java程序片,那么,程序片中的局部變量會再次分配內存空間。也就是說,程序片已經被執行了兩次,分別運行在不同的線程中,即運行在不同的時間片內。運行在不同線程中的程序片內的局部變量互不干擾,即一個用戶改變程序片中的局部變量不會影響其他用戶的程序片中的局部變量。
當一個線程的程序片執行完畢,運行在該線程中的局部變量釋放所占的內存。
【例4】計算1-100的連續和。
Example2_4.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML><BODY bgcolor=cyan><FONT size=6>
<%! int continueSum(int n){
int sum=0;
for(int i=1;i<=n;i++){
sum=sum+i;
}
return sum;
}
%>
<P>1-100的連續和:<BR>
<% long sum;
sum=continueSum(100);
out.print(sum);
%>
</BODY></HTML>
當多個客戶同時請求一個JSP頁面時,JSP頁面的程序片就會被多次調用運行,分別運行在不同的線程中。注意,一個線程在執行程序片期間可以調用JSP頁面的方法操作JSP頁面的成員變量,而這些成員變量是被所有的用戶共享的。在編寫JSP頁面時,對這種情況應多加注意。例如,如果一個用戶在執行程序片時調用JSP頁面的方法操作JSP頁面的成員變量時,可能不希望其他用戶也調用該方法操作成員變量,一面對其產生不利的影響,就應該將操作成員變量的方法用synchronized關鍵字修飾。當一個線程在執行程序片期間調用synchronized方法時,其他線程想在程序片中調用該synchronized方法時就必須等待,知道調用synchronized方法的線程調用執行完該方法。
【例5】通過一個synchronized方法操作成員變量來實現一個簡單的計數器。
Example2_5.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML><BODY>
<%! int count=0;
synchronized void setCount(){
count++;
}
%>
<% setCount();
out.println("您是第"+count+"個訪問本站的客戶");
%>
</BODY></HTML>
有時根據需要,可以將程序片分成幾個小的程序片,一邊插入JSP標記或HTML 標記。
【例6】在幾個程序片之間插入HTML標記
Example2_6.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML><BODY bgcolor=cyan>
<% int sum=0,i,j;
for(i=1;i<=6;i++){
%> <Font size=<%=i%>>
<b>大家好!</b>
</Font>
<% sum=sum+i;
}
if(sum%2==0){
out.print("<BR><b>"+sum+"</b>");
%> <b>是偶數。</b>
<% }
else{
out.print("<BR><b>"+sum+"</b>");
%> <b>是奇數。</b>
<% }
%>
</BODY></HTML>
5. JSP頁面中的Java表達式
“<%=”和“%>”之間可以是一個Java表達式(注意:“<%=”是一個完整的符號,“<%”和“=”之間不要有空格),這個表達時必須能求值。表達式的值由服務器負責計算,並將計算結果用字符串形式發送到客戶端顯示。
【例7】計算表達式的值
Example2_7.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML><BODY bgcolor=cyan><FONT size=4>
<P>Sin(0.9)除以3等於
<%=Math.sin(0.90)/3%>
<p>3的平方是:
<%=Math.pow(3,2)%>
<P>12345679 乘72等於
<%=12345679*72%>
<P>5的平方根等於
<%=Math.sqrt(5)%>
<P>99大於100嗎?回答:
<%=99>100%>
</BODY></HTML>
2.6 JSP中的注釋
注釋可以增強JSP文件的可讀性,便於JSP文件的維護。常見的JSP中的注釋有兩種。
(1)HTML注釋
在標記符號“<!--”和“-->”之間加入注釋內容:
<!--注釋內容-->
JSP引擎把HTML注釋交給客戶機,客戶機通過瀏覽器查看JSP的源文件時,能夠看到HTML注釋。
(2)JSP注釋
在標記符號“<%--”和“--%>”之間加入注釋的內容:
<%--注釋內容--%>
JSP引擎忽略JSP注釋,即在編譯JSP頁面時忽略JSP注釋。客戶通過瀏覽器查看JSP的源文件時,不能看到JSP注釋。
【例8】使用注釋
Example2-8.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML><BODY>
<!-- 以下是標題1 -->
<H1>大家要注意了,成員變量是大家共享的 </H1>
<%-- 下面是變量和方法的聲明,利用共享的sum和n計算連續和 --%>
<%! long sum=0,n=1;
void computer(){
sum=sum+n;
n=n+1;
}
%>
<%-- 下面是程序片,調用方法得到結果 --%>
<% computer();
out.println("當前連續和是:"+sum);
%>
</BODY></HTML>
2.7 在JSP頁面中使用HTML標記
JSP頁面可以含有HTML標記,當客戶通過瀏覽器請求一個JSP頁面時,Tomcat服務器將該JSP頁面中的HTML標記直接發送給客戶機的瀏覽器,由客戶機的瀏覽器負責執行這些HTML標記。而JSP頁面中的變量聲明、程序片及表達式由Tomcat處理后,再將有關的結果用文本的方式發送給客戶機的瀏覽器。
JSP頁面中的HTML標記是頁面中的靜態部分,即不需要服務器做任何處理,直接發送給客戶機的信息。通過使用HTML標記,JSP頁面可以為用戶提供一個友好的界面,即數據表示層。而JSP頁面中的變量聲明、程序片和表達式為動態部分,需要服務器作出處理后,再將有關處理后的結果發送給客戶。
編寫一個健壯的Web應用程序,提倡將數據的表示和處理分離。如果將數據表示和處理混雜在一個JSP頁面中,將導致代碼混亂,不利於Web應用的拓展和維護。學習JSP,有必要了解和掌握在JSP頁面中怎樣使用Java程序片來處理數據,因為JSP頁面在必要時可以使用少量的Java程序片,而在早期的許多Web應用程序中JSP頁面中有大量的Java程序片,這些項目可能需要維護或修改。
HTML是HyperText Marked Language的縮寫,即超文本標記語言。用HTML編寫的文件擴展名為.html(或.htm),稱為超文本文檔。JSP頁面中可以使用HTML標記來顯示數據,如“<br>你好</br>”將在一個新行中顯示“你好”,“<H1>你好</H1>”將用黑體1號字顯示“你好”。目前的HTML大約有100多個標記,這些標記可以描述數據的顯示格式。
1. 表單標記
表單的一般格式如下:
<FORM method=get|post action=”提交信息的目的地頁面” name=”表單的名字”>
數據提交手段部分
</FORM>
其中,<FORM>是表單標記,method取值get或post。Get方法與post方法的主要區別是:get方法提交的信息會在提交的過程中顯示在瀏覽器的地址欄中,而post方法提交的信息不會顯示在地址欄中。提交手段包括:通過文本框、通過列表、通過文本區等。例如:
<FORM action=”tom.jsp” method=”post”>
<Input type=”text” name=”game” value=”ok”>
<Input type=”submit” value=”送出” name=”submit”>
</FORM>
一個表單的數據提交手段部分經常包括如下子標記符號:
<Input,,,>
<Select...> <//Select>
<Option...> </Option>
<TextArea...> </TextArea>
2. <Input>標記
在表單中,用Input標記來指定表單中數據的輸入方式以及表單的提交鍵。Input標記中的type屬性可以指定輸入方式的GUI對象,name屬性用來指定這個GUI對象的名稱。其基本格式如下:
<Input type=”輸入對象的GUI類型” name=”名字”>
服務器通過屬性name指定的名字來獲取“輸入對象的GUI類型”中提交的數據。“輸入對象的GUI類型”可以是text(文本框)、checkbox(復選框)、submit(提交鍵)、hidden(隱藏)等。
(1)Text
當輸入對象的GUI類型是text時,除了用name為text指定名字外,還可以為text指定其他的一些值。例如:
<Input type=”text” name=”me” value=”hi” size=”12” algin=”left” maxlength=”30”>
其中,value的值是text的初始值,size是text對象的長度(單位是字符),algin是text在瀏覽器窗體中的對齊方式,maxlength指定text可輸入字符的最大長度。
(2)radio
當輸入對象的GUI類型是radio時,除了用name為radio指定名字外,還可以為radio指定其他一些值。例如:
<Input type=”radio” name=”rad” value=”red” algin=”top” checked=”Java”>
其中,value指定radio的值;algin是radio在瀏覽器窗體中的對齊方式;如果幾個單選鈕的name取值相同,那么同一時刻只能有一個被選中;服務器通過name指定的名字來獲取被選中的radio提交的由value指定的值;checked如果取值是一個非空的字符串,那么該單選框的初始狀態就是選中狀態。
(3)Checkbox
當輸入對象的GUI類型是Checkbox時,除了用name為checkbox指定名字外,還可以為checkbox指定其他值。例如:
<Input type=”checkbox” name=”ch” value=”pink” algin=”top” checked=”Java”>
其中,value指定checkbox的值。復選框與單選鈕的區別就是復選框可以多選。服務器通過name指定的名字來獲取被選中的checkbox提交的由value指定的值;checked如果取值是一個非空的字符串,那么該復選框的初始狀態就是選中狀態。
(4)Password
Password是輸入口令用的特殊文本框,輸入的信息用“*”回顯,防止他人偷看。例如:
<Input type=”password” name=”me” size=”12” maxlength=”30”>
服務器通過name指定的字符串獲取password提交的值,在口令框中輸入“12345”,那么“12345”將被提交給服務器。口令框僅僅起着不讓別人偷看的作用,不提供加密保護措施。
(5)Hidden
當<Input>屬性中的type值是hidden時,<Input>沒有可見的輸入界面,表單直接將<Input>屬性中value的值提交給服務器。例如:
<Input type=”hidden” name=”h” value=”123”>
服務器通過name指定的名字來獲取由value指定的值。
(6)Submit
為了能把表單的數據提交給服務器,一個表單至少要包含一個提交鍵。例如:
<Input type=”submit” name=”me” value=”ok” size=”12”>
單擊【提交】按鈕后,服務器就可以獲取表單提交的各數據。當然,服務器也可以獲取提交鍵的值,服務器通過name指定的名字來獲取由提交鍵提交的value指定的值。
(7)Reset
重置鍵將表單中輸入的數據清空,以便重新輸入數據。例如:
<Input type=”reset”>
【例2-9】 JSP頁面input.jsp用表單向receive.jsp頁面提交數據,input.jsp和receive.jsp均保存在Web服務目錄chapter2中。
Input.jsp
<%@ page contentType="text/html;Charset=GB2312" %>
<HTML><BODY bgcolor=cyan><FONT size=3>
<FORM action="receive.jsp" method=post name=form>
<P>請輸入下列信息:
<BR>輸入您的姓名:<Input type="text" name="name" value="張三"></BR>
<BR>選擇性別:<Input type="radio" name="R" value="男" checked="default">男
<Input type="radio" name="R" value="女">女
</BR>
<BR>選擇您喜歡的歌手:
<Input type="checkbox" name="superstar" value="張歌手">張歌手
<Input type="checkbox" name="superstar" value="李歌手">李歌手
<Input type="checkbox" name="superstar" value="劉歌手">劉歌手
<Input type="checkbox" name="superstar" value="王歌手">王歌手
</BR>
<Input type="hidden" value="這里是隱藏信息" name="secret">
<Input type="submit" value="提交" name="submit">
</FORM>
</FONT></BODY></HTML>
Receive.jsp
<%@ page contentType="text/html;Charset=GB2312" %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String yourName=request.getParameter("name");
String yourSex=request.getParameter("R");
String secretMess=request.getParameter("secret");
String personName[]=request.getParameterValues("superstar");
out.println("<P>您的姓名:"+yourName+"</P>");
out.println("<P>您的性別:"+yourSex+"</P>");
out.println("<P>您最喜歡的歌手:");
if(personName==null){
out.println("一個都不喜歡");
}
else{
for(int k=0;k<personName.length;k++){
out.println(""+personName[k]);
}
}
out.println("<P>hidden提交的值:"+secretMess);
%>
</FONT>
</BODY>
</HTML>
效果如圖所示:
(表問我為何亂碼,我也布吉島)
注意:上面的例子中要特別注意“<%@ page contentType=”text/html;Charset=GB2312” %>”中出現的“Charset”的大小寫拼寫,不要寫成“charset”,否則容易出現中文亂碼。
3.<Select>、<Option>標記
在表單中,可以使用下拉列表或滾動列表來選擇要提交的數據。下拉列表和滾動列表通過在<Select>標記中使用若干個<Option>子標記來定義。其基本格式如下:
<Select name=”下拉列表的名字”>
<Option value=”cat”>文本信息
<Option value=”dog”>文本信息
……
<Option value=”600”>文本信息
</Select>
服務器通過name的值獲取被選中的Option的值(參數value指定的值)。
在Select標記中增加size屬性,就變成了滾動列表。Size的值確定滾動列表中選項的可見數目。滾動列表的基本格式如下:
<Select name=”下拉列表的名字” size=”一個正整數”>
<Option value=”cat”>文本信息
<Option value=”dog”>文本信息
……
<Option value=”600”>文本信息
</Select>
服務器通過屬性name的值獲取被選中的Option的值(參數value指定的值)。
4.<TextArea>標記
<TextArea>是一個能輸入或顯示多行文本的文本區。在表單中,使用<Textarea>作為子標記,能使用戶提交多行文本給服務器。其基本格式如下:
<TextArea name=”名字” Rows=”文本可見行數” Cols=”文本可見列數”>
</TextArea>
5.表格標記<Table>
表格由<Table>、</Table>標記定義,一般格式如下:
<TABLE>
<TR width=”該行的寬度”>
<TH width=”單元格的寬度”>單元格中的數據</TH>
……
<TD width=”單元格的寬度”>單元格中的數據</TD>
</TR>
</TABLE>
其中,<TR>……</TR>定義表格的行,行標記通過使用<TH>或<TD>來定義該行的單元格,<TH>定義標記的單元格中的數據加粗顯示,<TD>不加粗顯示。在<TABLE>中增加border屬性,可指定該表格所帶邊框的寬度,如<TABLE border=2>。
【例2-10】 用一個3行的表格顯示數據。
Example2_10.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML>
<BODY bgcolor=yellow>
<TABLE align="Center" border=1>
<TR width=400>
<TD align="Center">welcome</TD>
<TD align="Right">to</TD>
<TD align="Left">Beijing</TD>
</TR>
<TR>
<TH valign="Top">We</TH>
<TD valign="Bottom">Love</TD>
<TD valign="Bottom" align="Center">JSP</TD>
</TR>
<TR>
<TD valign="Top">你好</TD>
<TD valign="Bottom">Hello</TD>
<TD valign="Bottom" align="Center">how are you</TD>
</TR>
</TABLE>
</BODY>
</HTML>
效果如圖所示:
6.圖像標記<IMG>
使用圖像標記可以顯示一幅圖像,<IMG>標記的基本格式如下:
<IMG src=”圖像文件的URL”>描述文字</IMG>
如果圖像文件和當前頁面在同一Web服務目錄中,圖像文件的地址就是該圖像文件的名字,如果圖像文件在當前Web服務目錄的子目錄中,如image子目錄,那么“圖像文件的URL”就是“image/圖像文件的名字”。
<IMG>標記中可以使用width和height屬性來指定被顯示圖像的寬和高。如果省略width和height屬性,<IMG>標記將按照圖像的原始寬度和高度來顯示圖像。
7.多媒體標記<EMBED>
使用<EMBED>標記可以播放音樂和視頻,當瀏覽器執行到該標記時,會把瀏覽器所在機器中的默認播放器嵌入到瀏覽器中,以便播放音樂和視頻文件。其基本格式如下:
<EMBED src=”音樂或視頻文件的URL”>描述文字</EMBED>
如果音樂或視頻文件在當前Web應用目錄中,音樂或視頻文件的地址就是該文件的名字。
<EMBED>標記中經常使用的屬性及取值如下:
Autostart——取值true或false,用來指定音樂或視頻文件傳送完畢后是否立即播放,默認值是false。
Loop——取值為正整數,用來指定音樂或視頻文件循環播放的次數。
Width,height——取值均為正整數,用width和height指定播放器的寬和高,如果省略width和height屬性,將使用默認值。
【例2-11】使用標記<IMG>和<EMBED>。用戶通過select.jsp頁面中的下拉列表選擇一幅圖像的名字,通過滾動列表選擇一個視頻或音樂文件的名字,單擊【提交】按鈕,將數據提交給show.jsp頁面,該頁面使用<IMG>標記顯示圖像、使用<EMBED>標記播放音樂或視頻。
select.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<FORM action="show.jsp" method=post name=form>
<BR>選擇一幅圖像:
<Select name="image">
<Option Selected value="img1.jsp">人物
<Option value="img2.jpg">風景
<Option value="img3.jpg">動物
</Select>
<BR>選擇視頻或音樂:
<Select name="video" size='3'>
<Option value="a.wmv">茉莉花
<Option value="b.wmv">動畫片
<Option value="c.avi">飛翔的鴿子
</Select>
<BR><Input TYPE="submit" value="提交你的選擇" name="submit">
</FORM>
</FONT></BODY></HTML>
Show.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String s1=request.getParameter("image");
String s2=request.getParameter("video");
if(s1==null){s1="img1.jpg";}
if(s2==null){s2="a.avi";}
%>
<IMG src=<%=s1 %> width=120 height=120>圖像</IMG>
<EMBED src=<%=s2 %> width=150 height=120>視頻</EMBED>
</FONT></BODY></HTML>
Show.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String s1=request.getParameter("image");
String s2=request.getParameter("video");
if(s1==null){s1="img1.jpg";}
if(s2==null){s2="a.avi";}
%>
<IMG src=<%=s1 %> width=120 height=120>圖像</IMG>
<EMBED src=<%=s2 %> width=150 height=120>視頻</EMBED>
</FONT></BODY></HTML>
小結
1.“<%!”和“%>”之間聲明的變量與“<%”和“%>”之間聲明的變量有何不同?
答:前者是成員變量,后者是局部變量。
2. 如果有兩個用戶訪問一個JSP頁面,該頁面中的Java程序片將被執行幾次?
答:2次。
3. 假設有兩個用戶訪問下列JSP頁面test.jsp,第一個訪問和第二個訪問test.jsp頁面的用戶看到的頁面的效果有何不同?
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML>
<BODY>
<%! String str=new String("你好");
synchronized void f(String s){
str=str+s;
}
%>
<% String s="abcd";
f(s);
%>
<%=str%>
</BODY>
</HTML>
答:第一個訪問的用戶看到的是你好abcd,第二個訪問的用戶看到的是你好abcdabcd。
4.請編寫一個簡單的JSP頁面,計算出100以內的素數。
答:
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
Text
</title>
</head>
<body bgcolor="#ffffff">
<%
int i,j;
for (i = 1; i <= 100; i++) {
for (j = 2; j < i; j++)
{
if (i % j == 0) break;
}
if (j >= i)
{
%>
<%=i %>
<%
}
}
%>
</body>
</html>
5.編寫兩個JSP頁面a.jsp和b.jsp。a.jsp頁面使用表單提交數據給b.jsp,要求a.jsp通過text方式提交一個字符串給b.jsp,b.jsp頁面獲取a.jsp提交的字符串,並使用Java表達式顯示這個字符串及其長度(所含字符的個數)。
答:
a.jsp
<%@ page contentType="text/html;Charset=GB2312" %>
<HTML><BODY bgcolor=cyan><FONT size=3>
<FORM action="b.jsp" method=post name=form>
<Input type="text" name="name" value="helloworld">
<Input type="submit" value="提交" name="submit">
</FORM>
</FONT></BODY></HTML>
b.jsp
<%@ page contentType="text/html;Charset=GB2312" %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<%!
public static int getStrLen(String str){
if (str==null || str.equals(""))return 0;
int j=0;
for(int i=0;i<str.length();i++)
{
if(((int)(str.charAt(i)))>255)j+=2;
else j++;
}
return j;
}
%>
<% String yourName=request.getParameter("name");
out.println("<P>您提交的字符串:"+yourName+"</P>");
out.println("<P>字符串的長度:"+getStrLen(yourName));
%>
</FONT>
</BODY>
</HTML>
6. 編寫頁面inputNumber.jsp和getNumber.jsp。inputNumber.jsp頁面使用表單提交數據給getNumber.jsp頁面,要求inputNumber.jsp通過text方式提交一個數字給getNumber.jsp。getNumber.jsp計算並顯示這個數的平方和立方。
答:
inputNumber.jsp
<%@ page contentType="text/html;Charset=GB2312" %>
<HTML><BODY bgcolor=cyan><FONT size=3>
<FORM action="getNumber.jsp" method=post name=form>
<Input type="text" name="number" value="5">
<Input type="submit" value="提交" name="submit">
</FORM>
</FONT></BODY></HTML>
getNumber.jsp
<%@ page contentType="text/html;Charset=GB2312" %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String s=request.getParameter("number");
try{
double d=Double.parseDouble(s);
out.println(d*d);
out.println("<BR>"+d*d*d);
}
catch(NumberFormatException exp){
out.println("<BR>"+exp);
}
%>
</FONT>
</BODY>
</HTML>