在Internet上最熱門的服務之一就是WWW服務。客戶端的瀏覽器通過HTTP協議發送請求,WEB服務器得到請求後返回一個相應的響應信息。以下是典型的WWW架構:
當Internet從最初的文檔發佈平台向一個網絡應用平台發展時,就出現了各種相應的技術。在服務器端,各種各樣的腳本運行環境也開發出來。利用CGI,ASP,PHP,JSP等技術,一個用戶可以將一個HTTP請求發送到一個可執行的應用程序而不是一個靜態的HTML文件,服務器將會運行這個程序,將處理結果返回給客戶,或者對數據記錄進行操作,通過這個模式就可以在服務器和客戶之間進行有效的動態交互。
JSP(JavaServer Pages)是Sun公司倡導、許多公司參與一起建立的一種動態網頁技術標准。在傳統的HTML(*.htm,*.html)文件中加入JAVA程序片段(Scriptlet)或JSP標記(Tag)就構成了JSP網頁(*.jsp)
粗略看來JSP網頁和HTML網頁非常相似──都包含用標簽封裝的文本。當HTML標簽(“<” “>”)被用戶的瀏覽器處理以顯示網頁的時候,JSP標簽(“<%” “%>”)能通過WEB服務器的處理來生成動態的內容。
大家都知道目前的服務器軟件,比如:Microsoft的Internet Information Server(IIS)都不支持JSP的,而要運行JSP程序就必須借助支持JSP的平台。當今JSP應用平台有Caucho公司的Resin,Apache公司的Tomcat,Sun公司的JSWDK,IBM Web Sphere Application,BEA Weblogic等。本教材所有代碼都在Tomcat試運行。
Tomcat的安裝:先安裝JDK,後安裝Tomcat。具體請參考教程“JAVA的配置”。
JSP頁面的生成是從一個請求開邕的,但是它所創建的一些Java對象的生命周期可以跨越多個請求。所有這些對象都有一個scope屬性,它定義了一個指向該對象的引用在何處可用以及容器何時刪除對象。
JSP容器支持4種不同的作用域:
1、 Page(頁面):JSP容器將在JSP頁面返回一個響頻或都將請求轉發給另一個頁面這後刪除對象。
2、 Request(請求):一個頁面可能經常將請求轉發給另一個頁面,這樣就會有多個頁面處理同一個請求。所有這些頁面都可以訪問請求作用域的對象。
3、 Session(會話):可以與創建該對象共享一個會話的任何頁面訪問這些些象。
4、 Application(應用程序):使用“會話作用域”在同一個WEB應用程序內的任何位置訪問對象。
指令page |
<HTML>
輸出注釋 |
這是一個JSP示例文件
模板(靜態的文本) |
<HEAD><TITLE>JSP示例</TITLE></HEAD>
<BODY>
隱藏的注釋 |
以下是網頁正文
--%>
JSP動作 |
JSP表達式 |
<%!
JSP聲明 |
%>
<%
JSP腳本小程序 |
String product=request.getParameter (“product”);
If(UserName==null){
out.println(“名字是空的”);
}
%>
</BODY></HTML>
可以輸出的注釋
語法:<!—comment[<%=expression%>]-->
輸出的注釋是發送到瀏覽器端的,你可以在網頁的源碼中看到它。
隱藏的注釋
語法:<%--comment--%>
用隱藏注釋標記的字符會在JSP編譯時被忽略,也不會顯示在客戶瀏覽中。
該指令用來定義當前頁面的屬性。
語法:
<%@ page {屬性=“屬性值”}*%>
屬性列表:language=”script語言”,定義的是Scriptlet所使用的語言,只有一種JAVA語言,所以一般可以不設。
extends=”繼承的類名”:參數值是完整的JAVA類名,限繼承了該類。
import=”引入的包名”:用來指明頁面的代碼中將會用到的類、接口的包名或類名。
session=”true|false”:用於設定用戶是否需要session(session就是客戶端與服務器的一次會話)。
buffer=”none|8kb|sizekb”:用於指定輸出緩存的大小,默認為8kb。
isThreadSafe=”true|false”:指定是否支持多線程處理,也就是說JSP是否能同時處理多個請求。
info=”message”:定義一個可以通過getServletInfo()方法提取的字符,即輸出info的message。
errorPage=”url”:指定一頁面的URL地址,當頁面執行有例外發生,即交給指定的URL處理。
isErrorPage=”true|false”:指明頁面是否為另一頁面的例外進行處理,默認為false。
contentType=”mimeType[;charset=characterSet]”|”text/html;charset=ISO-8859
Page指令示例
<%@ page contentType=”text/html;charset=Big
<%@ page import=”java.sql.*”%>
<%@ page errorPage=”error.jsp”%>在error.jsp頁裡可設<%@ page isErrorPage=”true”%>即可以輸出拋出的錯誤<%=exception.getMessage()%>。
<%@ page info=”Author:Andy v:
include指令用來向當前頁面中插入一個靜態文件的內容,這個文件可以是HTML文件,也可以是JSP文件或其它的文本文件(如:*.txt)。
指令格式如下
<%@ include file=”URL”%>
URL指包含文件的路徑名,如果路徑以”/”開頭是指網站的虛擬路徑的根目錄下,如果以文件名或目錄名開頭那麼就是當前路徑。
示例:
<%@ include file=”inc.jsp”%>即把inc.jsp文件的內容包含到當前頁面中。
Include的作用在實際應用中經常有到,可以用include來包含一個會在多個頁面中用到的文件,比如一個版權信頁、導航條、公司聯繫信息等。
但是對那些更新很快的信息,這種方法會顯麻煩,因為包含的頁面更新之後,只有在當前頁更新後,包含的頁面更新才能起作用。也就是說如果當前頁沒有更新,就看不到包含頁的更新。
當JSP使用標記來定義頁面元素,即要使用到tablib指令。
語法:
<%@ taglib uri=”URI To Tag Library” prefix=”tag prefix”%>
uri可以是絕對或相對路徑,它指明了“標記庫描述符(TLD)”的位置,prefix指定了標記的前綴。
示例:
<%@ taglib uri=”WEB-INF/struts-bean.tld” prefix=”bean”%>
頁面中可以如下調用:
<bean:write name=”NAME”/>write是struts-bean標記庫的一個標記,name指一個Bean。
聲明是在JSP程序中聲明合法的變量和方法。
JSP語法:
<%!聲明一;聲明二;…%>
JSP語法中的聲明語句用來聲明將要在JSP程序使用的變量和方法。變量和方法必須聲明,不然系統會報錯。可以一次聲明多個變量和方法,只要以”;”結束就可以了。
當聲明變量和方法時,請注意以下規則:
□一條完整的JSP語法中的聲明語名是以”;”結尾的,在這一點上JSP語法中的腳本小程序有同樣的規則,但JSP表達式不用”;”。
□可以直接使用<%@ page %>中被包含進來的已經聲明的變量的方法,不需要對它們重新進行聲明。
□一個聲明公在一個頁面有效,如果想在每個頁面都用到一些聲明,最好把它們寫成一個單獨的文作,然後用<%@ include %>或者<jsp:include>元素包含進來。如果我們在兩個不同的JSP文件聲明了相同的變量,而且在另外一個JSP文件中把這兩個文件都包含進去,那麼JSP服務器就會報錯。
□也可以在程序中聲明一個新類。
示例:
<%! int I=0;%>
<%! String name,sex,tel,email;%>
語法:
<%=某個表達式%>
表達式元素表示的是一個在Java腳本語言中被定義的Java表達式,在動作後被自動轉化為字符串,然後插入到表達式所在JSP文件的位置顯示。
使用表達式需注意以下不能用分號”;”作為表達式的結束符。
示例:
<%=(new java.util.Date()).toString()%>
<%=(1+4)*3%>
語法:
<% JSP Scriptlet的代碼段%>
寫在兩個”%”之間的JSP程序,包含有效的程序段。一個腳本小程序能夠包含多個JSP語句、方法、變量、表達式。
示例:scriptlet.jsp源代碼如下
<%@ page contentType="text/html; charset=Big5" %>
<html><head><title>scriptlet</title></head>
<body bgcolor="#ffffff">
<h3>
<%for(int i=0;i<7;i++){%>
行<%=i%><br>
<%}%>
</h3>
</body></html>
訪問scriptlet.jsp顯示如下:
該動作是定向一個HTML頁、JSP文件、或是一個程序段,即重定向。該動作只有一個page屬性。
語法:
<jsp:forward page={“relativeURL”|”<%=expression%>”}/>
或帶傳遞參數
<jsp:forward page={“relativeURL”|”<%=expression%>”}>
<jsp:param name=”parameterName” value=”{“parameter Value”|”<%=expression%>”}”/>
</jsp:forward>
page指定重定向的頁面,它的值可以是一個URL如“/login/login.htm”,或是一個JSP表達式。
<jsp:param>是可選標簽,能夠附帶參數給重定向的頁面,該頁面可以取得該參數的值。
示例:
如果在main.jsp頁面中有代碼如下:
<jsp:forward page=”/prog/login.jsp”/>即訪問main.jsp頁面時,執行到該標簽時被重定向到/prog/login.jsp頁面。
該動作是執行一個applet或Bean有關的指令。在網頁中插入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>
這個標簽的作用是把JavaBeans組件引入到JSP中來,從而使JSP的功能更為強大。將大多數Java處理移出JSP頁面的一種方法是將它封裝在一個JavaBean中。
語法:
<jsp:useBean id=”name” scope=”page|request|session|application” class=”className”|class=”className” type=”typeName”|beanName=”beanName” type=”typeName”|type=”typeName”/>
id:是在所定義的Beans的確認變量,能在後面的程序中使用此變量名來分辨不同的Beans。這個變量區分大小寫。
scope:是Beans存在的范圍(page,request,session,application)及id變量的有效范圍。默認值是page。
class:定義JavaBean實現的類的完全名稱,如果沒有指定type屬性,那麼必須指定class屬性
type:腳本變量的類型。這可以與對象、對象的超類或者由對象實現地Java接口。如果沒有指定class那麼必須指定type。
benaName:JavaBean的名稱。它必須是“A.B.C”形式。
示例:
<jsp:useBean id=”mybean” class=”mypack.Test” scope=”page” />
Test.java源程序
package mypack;
import java.util.Date;
public class Test {
private String abc="";
public String getString(){//返回一個字符串
return abc;
}
public void setString(String abc){
this.abc=abc;
}
public Date getDate(){//返回當前系統時間
Date date=new Date();
return date;
}
}
test.jsp源程序如下:
<%@ page contentType="text/html; charset=Big5" %>
<jsp:useBean id="test" scope="request" class="mypack.Test"/>
<html>
<head>
<title>
test
</title>
</head>
<%test.setString("這是一個測試例子");%>
<body bgcolor="#ffffff">
<h1>
<%=test.getString()%><br>
<%=test.getDate()%>
</h1>
</body>
</html>
訪問test.jsp顯示結果如下:
該標簽也是和Beans有關的動作,用於獲得Beans的屬性值,並可以將其使用或顯示在JSP頁面中,將其轉換成String型,然後輸出。在使用它之前,必須用<jsp:useBean>創建它,所以它們是成對出現的。
語法:
<jsp:getProperty name=”beanName” property=”propertyName”/>
name:其中name指向用useBean組件時的id值。
property:指明要想得到Beans的那個屬性。
示例:
在test.jsp加入該標簽,源程序如下:
<%@ page contentType="text/html; charset=Big5" %>
<jsp:useBean id="test" scope="request" class="mypack.Test"/>
<html><head><title>test</title>
name是<jsp:useBean>的id,property是Beans的一個屬性 |
<%test.setString("這是一個測試例子");%>
<body bgcolor="#ffffff">
<h1>
<%=test.getString()%><br>
<%=test.getDate()%>
</h1>
<jsp:getProperty name="test" property="date"/>
</body></html>
顯示結果如下:
這是<jsp:getProperty>輸出的字符 |
該動作是與Beans有關的指令,用於設置Beans的屬性。該動作使用Beans指定的設置方法,在Beans中設置一個或多個屬性值。在使用<jsp:setProperty>之前必須使用<jsp:useBean>聲明將要使用的Bean,在<jsp:useBean>中的id值與<jsp:setProperty>name的值完全相同。
語法:
<jsp:setProperty name=”beanName” property=”*”|property=”propertyName” [param=”parameterName”]|property=”propertyName” value=”{String|<%=expression%>}”/>
name:是表示已經存在的<jsp:useBean>中創建的Beans實例的名字,id的值。
property:匹配Beans中的屬性。
<jsp:setPropety>的兩種變化形式:
1、 可以直接從HTTP請求參數賦值。即可以直接用網頁表單給Beans屬性賦值。
如果表單參數與Beans屬性名稱一致即可以這樣使用property=”*”。
例如:一個網頁輸入表單的源程序如下:
<%@ page contentType="text/html; charset=Big5" %>
<html>
<head>
<title>
setpropertyinput
</title>
與Test類裡的setString()屬性相對應 |
<body bgcolor="#ffffff">
<form action="test.jsp" method="GET">
<input name="string" type="text">
<input type="submit" value="submit">
</form>
</body>
</html>
test.jsp源程序如下:
<%@ page contentType="text/html; charset=Big5" %>
<jsp:useBean id="test" scope="page" class="mypack.Test"/>
<html><head><title>test</title></head>
輸出的字符即為表單輸入的字符 |
<jsp:setProperty name="test" property="*"/>
<jsp:getProperty name="test" property="string"/>
</body></html>
如果表單參數與Beans屬性名稱不一致可以如下設置賦值:
<jsp:setProperty naem=”test” property=”string” param=”aa”/>
Beans屬性 |
網頁表單參數 |
2、 可以直接使用String常量或者JSP表達式賦值。
<jsp:setProperty name=”test” property=”string” value=”aaaaaaaa”/>
<jsp:setProperty name=”test” property=”string” value=’<%=new Date().toString()%>’/>
<jsp:include page=”path” flush=”True”/>
JSP1.1中規范要求JSP腳本語言支持一組常見的“內建”對象,這些對象之所以稱為內建的,是因為你不需要在使用它們之前進行聲明。
JSP提供9個預先定義的變量,它們是:
1、 out傳達響應的輸出流
2、 request包含客戶端的請求
3、 response對客戶端的響應
4、 page指向JSP頁面本身
5、 session客戶端請求時的一次對話
6、 application代碼段的運行環境
7、 exception頁面運行時拋出的例外
8、 pageContext頁面的管理屬性
9、 config代碼段的配置對象
在JSP程序中,out是用來向客戶端發送內容的打印輸出預定義變量。Out是專門為向客戶端發送輸出而設計的,它的基類的javax.servlet.jsp.Jspwriter。
out提供二種方法向客戶端輸出內容:
print()輸出完畢後,並不結束該行。
println()輸出完畢後,會結束當前行,下一個輸出語句將在下一行開始輸出。
其它重要的方法:
out.newLine()輸出一個換行符號
out.flush()輸出緩沖區裡的數據
out.close()將關閉輸出流,
out.clearBuffer()清除緩沖區裡的數據,並把數據輸出到客戶端
out.clear()清除緩沖區裡的數據,但不把數據輸出到客戶端
out.getBufferSize()獲得緩沖區的大小(int值)
out.getRemaining()獲得緩沖區中沒有被占用的空間大小(int值)
out.isAutoFlush()返回布爾值,其取值在於<%@ page autoFlush=”true|false”%>的設置
示例:
<%
out.newLine();
out.println(“<h1>A Example</h1>”);
out.close();
out.println(“這一行將不會輸出”);
%>
顯示結是如下圖:
request是JSP中最常用到的對象之一,它包含了客戶請求的信息,在那些與用戶交互的網頁中,這個對象是基礎,只有通過它,才能了解到用戶的需求。該對象主要用於接受客戶端通過HTTP協義鏈接傳輸到服務器端的數據。
request對象的主要方法如下:
1、 getCookies(String name)返回客戶端的Cookie對象,結果是一個Cookie數組
2、 getHeader()獲得HTTP協義定義的傳送文件頭的信息。比如getHeader(“User-Agent”)返回客戶端瀏覽器的版本號、類型
3、 getAttributeNames()返回request對象的所有屬性name,其結果是一個類舉實例(Enumeration)
4、 getParameterNames()獲得客戶端送給服務器端的所有參數的名字,結果也是一個類舉類的實例
5、 getHeaderNames()返回header的名字,結果也是一個類舉
6、 getHeaders(String name)返回指定名字的header的所有值,結果是一個類舉
7、 getMethod()獲得客戶端向服務器端傳送數據的方法(GET,POST,PUT)
8、 getParaemter(String name)獲得客戶端傳送給服務端的參數值,該參數由name指定
9、 getAttribute(String name)返回指定的屬性值,如果指定的屬性值不存在則返回null
10、getParameterValues(String name)獲得指定參數的所有值,參數由name指定
11、getQueryString()獲得查詢字符串,該字符串是由客戶端以GET方法向服務器端傳送的
12、getRequestURI()獲得發出請求的客戶端地址
13、getServletPath()獲得客戶端所請求腳本文件的文件路徑
14、setAttribute(String name,java.lang.Object o)設定名字為name的request參數的值
15、getServerName()獲得服務器名稱
16、getServerPort()獲得服務器端口號
17、getRemoteAddr()獲得客戶端的IP地址
18、getRemoteHost()獲得客戶端計算機的名稱
19、getProtocol()獲得客戶端向服務器端傳送數據所依據的協義名稱
示例:表單頁form.jsp源程序如下:
<%@ page contentType="text/html; charset=Big5" %>
<html><head>
<title>form</title></head>
<body bgcolor="#ffffff">
<form action="formok.jsp" method="GET">
姓名:<input name="name" type="text"><br>
愛好:<input name="like" type="checkbox" value="sing">唱歌
<input name="like" type="checkbox" value="ball">打球
<input name="like" type="checkbox" value="game">遊戲<br>
<input type="submit" value="submit">
</form>
</body></html>
接收數據的formok.jsp源程序如下:
<%@ page contentType="text/html; charset=Big5" %>
<%@ page import="java.lang.Object,java.util.Enumeration"%>
<html><head><title>formok</title></head>
<body bgcolor="#ffffff">
<h3>
從表單中獲取字符串:<%=request.getQueryString()%><br>
表單所提交的參數名枚舉:<br>
<%
Enumeration e=request.getParameterNames();
while(e.hasMoreElements()){
out.println(e.nextElement().toString());}
%>
<br>
相關參數的參數值如下:<br>
姓名:<%=request.getParameter("name")%><br>
愛好:<%
for(int i=0;i<request.getParameterValues("like").length;i++){
out.println(request.getParameterValues("like")[i]);
}
%>
</h3>
</body></html>
訪問form.jsp並輸入數據顯示如下:
提交後的結果如下所示:
該對象用於向客戶端發送數據,響應客戶端的請求,如Cookie、HTTP文件頭信息等。
該對象的方法如下:
1、 addCookie(Cookie cookie)添加一個Cookie對象,用來保存客戶端的用戶信息。用request的getCookies()方法可以獲得這個Cookie
2、 addHeader(String name,String value)添加HTTP文件頭,該header將會傳到客戶端去,如果同名的header存在,原來的header就會被覆蓋
3、 containsHeader(String name)判斷指定名字的HTTP文件頭是否存在並返回布爾值
4、 sendError(int sc)向客戶端發送錯誤信息,例如505服務器內部錯誤
5、 setHeader(String name,String value)設定指定名字的HTTP文件頭的值,如果該值存在,那麼它會被覆蓋
示例:
利用response來定時刷新頁面,定是為一秒鐘。源程序如下:
<%@ page contentType="text/html; charset=Big5" %>
<html><head>
<title>頁面定時刷新</title>
</head>
<body bgcolor="#ffffff">
<%
response.setHeader("Refresh","1");//定義header頭的Refresh的屬性,1秒刷新一次
%>
</body></html>
該對象就是指向當前的JSP頁面本身,有點象類中的this指針。該對象一般很少在JSP編程中用到。所以該方法不作詳細介紹。
session對象指的就是客戶端與服務器端的一次對話,此次對話從客戶端鏈接到服務器的第一個請求開始,直到客戶端與此服務器斷開鏈接。它用來在每一個用戶之間分別保存用戶信息,系統會為用戶生成一個獨一無二的session對象,用它來記錄用戶的個人信息,一旦用戶退出網站,那麼該session對象就會被注銷。
主要方法如下:
1、 getAttribute(String name)獲得指定名字的屬性,如果該屬性不存在,將返回null
2、 getAttributeNames()返回session對象中存儲的每一個屬性對象,結果是一Enumeration類實從例
3、 getCreationTime()返回該session對象創建的時間,以毫秒算,從
4、 getId()每生成一個session對象服務器都會給他一個唯一的編號,該主法返回編號
5、 getLastAccessedTime()返回當前session對象最後一次被操作的時間
6、 getMaxInactiveInterval()獲取session對象的生存時間
7、 removeAttribute(String name)刪除與指定名字name相聯繫的session信息
8、 setAttribute(String name,java.lang.Object value)設置指定名字的屬性值value,並把它存在session對象中
示例:session.jsp源程序如下:
<%@ page contentType="text/html; charset=Big5" %>
<html><head>
<title>session</title>
</head>
<body bgcolor="#ffffff">
<%!String se="sessionTest";%>
<%
session.setAttribute("sess",se);//把se保存到session對象中,它是名字是sess
%>
session的創建時間:<%=session.getCreationTime()%><br />
session ID:<%=session.getId()%><br>
最後操作時間:<%=session.getLastAccessedTime()%><br />
生存時間:<%=session.getMaxInactiveInterval()%><br />
這個session是:<%=session.getAttribute("sess").toString()%>
</body></html>
訪問session.jsp顯示如下:
application變量的對一個Web Application有效的全局變量,它開始於服務器的啟動,直到服務器關閉,在此期間,此對象將一直存在。與session不同的地方是,session是用戶作為主角,它將隨用戶的斷開而消失,application則是服務器作為主角,服務器的啟動和關閉決定了application的生命。
主要方法如下:
1、 getAttribute(String name)返回由name指定名字的application對象的屬性的值
2、 getAttributeNames()返回所有的application對象的屬性名字,結果是一個枚舉實例
3、 getInitParameter(String name)返回name指定的某個屬性的初始值
4、 getServerInfo()獲得當前版本Servlet編譯器的信息
5、 setAttribute(String name,Object object)用object來初始化某個屬性,該屬性由name指定
6、 log(String msg)把指定的消息寫入服務器的Servlet日志文件
7、 log(Exception exception,String msg)把指定例外的軌跡及錯誤消息寫入日志
8、 log(String message,Throwable throwable)指throwable例外寫入日志
9、 getMajorVersion()返回服務器支持的Servlet API的主版本號
10、getMinorVersion()返回服務器支持的Servlet API的次版本號
示例:application.jsp源程序如下:
<%@ page contentType="text/html; charset=Big5" %>
<html><head>
<title>application</title>
</head>
<body bgcolor="#ffffff">
JSP版本號:<%=application.getServerInfo()%><br />
Servlet API的主版本號:<%=application.getMajorVersion()%><br />
Servlet API的次版本號:<%=application.getMinorVersion()%>
</body></html>
訪問顯示如下:
示例:由於application一直存在於服務器,是一個全局變量,可以利用此特性做一個計數器。
Applicatincount.jsp源程序如下
<%@ page contentType="text/html; charset=Big5" %>
<html><head>
<title>applicationcount</title>
</head>
<body bgcolor="#ffffff">
<%
if(application.getAttribute("count")==null){
application.setAttribute("count","1"); } else{application.setAttribute("count",Integer.toString(Integer.valueOf(application.getAttribute("count").toString()).intValue()+1));
}
%>
你是第<%=application.getAttribute("count")%>位訪問者
</body></html>
顯示結果如下:
該對象是一個例外對象,當JSP頁面在運行過程中發生了例外,就產生這個對象。一個JSP頁面可以使用此對象,但必須設置<%@ page isErrorPage=”true”%>。
對象的方法如下:
1、 String getMessage()返回描述例外的消息字符串
2、 String toString()以字符串的形式,返回關於例外的簡短描述消息
3、 PrintStackTrace()以標准的形式輸出一個錯誤和錯誤的堆楗
示例:error.jsp,當錯誤指向該頁時即可補獲錯誤信息並顯示
<%@ page contentType="text/html; charset=Big5" %>
<%@ page isErrorPage="true"%>
<html><head>
<title>error</title>
</head>
<body bgcolor="#ffffff">
<%
//獲得並打印例外信息
String error=exception.getMessage();
out.println(error);
//獲得例外信息的描述
String errdesc=exception.toString();
out.println(errdesc);
%>
</body></html>
該對象提供了JSP頁面內所有的對象及名字空間的訪問,它可以訪問到本頁面所在Session,也可以取得本頁面所在的application的某一屬性值,它相當於頁面中所有對象功能的集成者。
對象的方法如下:
1、 getOut()返回當前向客戶端響應被使用的JspWriter流(out)
2、 getSession()返回當前頁中的session對象
3、 getPage()返回當前頁的Object對象
4、 getRequest()返回當前頁的Request對象
5、 getResponse()返回當前頁的Response對象
6、 getException()返回當前頁的Exception對象
7、 getServletConfig()返回當前頁的ServletConfig對象
8、 getServletContext()返回當前頁的ServletContext對象
9、 setAttribute(String name,Object o,int scope)在指定范圍內設置屬性入屬性
10、setAttribute(String name,Object attribute)值設置屬性及屬性值
11、getAttribute(String name)取屬性的屬性值
12、getAttribute(String name,int scope)在指定范圍內取屬性的屬性值
13、findAttribute(String name)尋找一個屬性,找到即返回屬性值,沒有即返回null
14、removeAttribute(String name)刪除某屬性
15、removeAttribute(String name,int scope)在指定范圍內刪除某屬性
16、getAttributesScope(String name)返回一個整形數值,指某屬性的作用范圍
17、getAttributeNamesInScope(int scope)返回指定范圍內可用的屬性名枚舉(Enumernation)
18、release()釋放pageContext所占的資源
19、forward(String URL)使當前頁面重定向另一頁面
上面指定范圍scope值的含義為:
page scope用1表示
request scope用2表示
session scope用3表示
application scope用4表示
示例:
<%
String a="aaa";
session.setAttribute("sess",a);
application.setAttribute("app",a);
%>
<%=pageContext.getAttribute("sess",3)%>
<%=pageContext.getAttribute("app",4)%>
該對象是在一個Servlet初始化時,JSP引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數及服務器的有關信息
方法如下:
1、 getServletContext()程序環境
2、 getInitParameter(String name)獲得該名稱初始化參數
3、 getInitParameterNames()獲得一個所有初始化參數名稱的枚舉
按照SUN公司的定義,JavaBeans是一個可重復使用的軟件部件,該部件可以用來生成其進行可視化處理的組件。一個組件即Java應用程序或Applet的可重復使用的部件就是一個Bean。
JavaBeans和Java並沒有清楚的界線,JavaBeans建立在Java的基礎之上。JavaBeans是一種Java類,通過封裝屬性和方法成為具有某種功能或者處理某個業務的對象。JavaBeans被組織成為數據包(Package)以便進行管理。JavaBeans類似於ActiveX控件,都能提供常用功能並且可以重復使用。
JavaBeans的屬性在程序中的具體體現就是類中的變量。在JavaBeans設計中,按照屬性的不同作用又細分為四類:Simple,Index,Bound,Constrained屬性。
一個簡單屬性表示一個伴隨有get/set方法的變量。屬性名與和該屬性相關的get/set方法名對應。例如:如果有setX和getX方法,則暗指有一個名為”X”的屬性。如是果有一個方法名為isX,則通常暗指”X”是一個布爾值。示例:alden1.java
package mypack;
public class alden1{
String ourString="Hello";//屬性名為ourString,類型是字符串
public void setString(String newString){//set方法
ourString=newString;
}
public String getString(){//get方法
return ourString;
}
}
一個Indexed屬性表示一個數組。使用該屬性對應的set/get方法可取得數組中的數值。該屬性也可一次設置或取整個數組的值。例如:
package mypack;
public class alden2 {
public alden2() {
}
String b[]=new String[]{"1","2","3","4"};//b是一個indexed屬性,一個數組
public String[] getString(){
return b;
}
public void setString(String[] b){
this.b=b;
}
}
綁定屬性提供一種機制,即通知監聽器一個JavaBeans組件的屬件發生了改變。監聽器實現了PropertyChangeListener接口並接收由JavaBeans組件產生的PropertyChangeEvent對象,該對象中封裝了屬性名、屬性的原值、屬性變化後的新值。
package mypack;
import java.beans.*;
public class alden3 {
public alden3() {
}
String ourString="Hello";
private PropertyChangeSupport changes=new PropertyChangeSupport(this);
public void setString(String newString){
String oldString=ourString;
ourString=newString;
changes.firePropertyChange("ourString",oldString,newString);
}
public String getString(){
return ourString;
}
public void addPropertyChangeListener(PropertyChangeListener pcl){
changes.addPropertyChangeListener(pcl);
}
public void removePropertyChangListener(PropertyChangeListener pcl){
changes.removePropertyChangeListener(pcl);
}
}
Servlet是Java2.0中新增的一個全新功能是一種采用Java技術來實現CGI功能的一種技術。Servlet看起來來像通常的Java程序。Servlet的主要功能在於交互式地瀏覽和修改數據,生成動態WEB內容。
JSP技術主要用來表現頁面,而Servlet技術主要用來完成大量的邏輯外得。也就是說JSP主要用來發送給前端的用戶,而Servlet主要來響應用戶的請求,充當控制者的角色。
1、 doGet處理HTTP的Get請求
這個GET操作僅僅允許客戶從HTTP服務器上獲取資源。
格式為:
protected void doGet(HttpServlerRequest request,HttpServletResponse response)
throws ServletException,IOException
2、 doPost處理HTTP的Post請求
POST操作包含了必須通過Servlet執行的請求中的數據。
格式為:
protected void doPost(HttpServlerRequest request,HttpServletResponse response)
throws ServletException,IOException
下面的一個Servlet程序輸出一個”Hello World!”字符串
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
從客戶端HTTP請求該Servlet,程序執行doGET方法,並輸出方法所生成的結果。
前面講的JSP內建request對象Servlet也一樣支持,即JSP的request對象的方法在Servlet中一樣可用。
在Servlet中首先要得到一個Session對象或創建一個Session:
HttpSession session=request.getSession();
創建Session對象後,方法與JSP的Session對象的方法一致。
在Servlet創建Cookie可以調用Cookie對象的構造函數來創建:
Cookie usernamecookie=new Cookie(name,value);
Name為參數名,Value為參數值。
也可以直接定義為一個Cookie數組,然後用request.getCookies()方法初始化。如:
Cookie[] cookies=request.getCookies();
首先編寫一個表單頁input.jsp源程序如下:
<%@ page contentType="text/html; charset=Big5" %>
<html><head>
<title>input</title>
</head>
<body bgcolor="#ffffff">
<form action="./input" method="POST">
提交到一個Servlet 方法是POST |
電話:<input name="tel" type="text"/><br>
Email:<input name="email" type="text"/><br>
<input name="submit" type="submit" value="提交"/>
</form>
</body></html>
訪問並輸入信息顯示如下:
Servlet源程序input.java
doPost方法處理請求 |
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class input extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=Big5";
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
收集提交的數據 |
if (var0 == null) {
var0 = "";
}
String var1 = request.getParameter("tel");
if (var1 == null) {
var1 = "";
}
String var2 = request.getParameter("email");
if (var2 == null) {
var2 = "";
}
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>input</title></head>");
out.println("<body bgcolor=\"#ffffff\">");
輸出數據 |
out.println("<p>"+var1+"</p>");
out.println("<p>"+var2+"</p>");
out.println("</body></html>");
}
}
提交後顯示表單輸入的信息。如果與數據庫嫁接,即可把數據保存在數據庫中。
JDBC是Java數據庫摙接技術(Java Daate Base Connectivity)的簡稱,是為各種常用數據庫提供無縫連接的技術。
DriverMananger類是JDBC的管理層,作用於用戶和驅動程序之間。可以使用該類的getConnection方法來建立與數據庫的鏈接。
以下是建立數據庫鏈接的范例:(在使用以下操作前先導入<%@page import=”java.sql.*”%>)
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);//加載驅動程序
String url=”jdbc:odbc:guest”;
DriverManager.getConnection(url,”sa”,”
Connection是代表與數據庫的連接,也就是在已經加載的Driver和數據庫之間建立連接。
創建該類的一個實例,然後鏈接到特定的數據庫:
Connection conn=DriverManager.getConnection(“jdbc:odbc:guest”,”sa”,”
guest是在ODBC設置輸入的一個“數據源”。
Connection對象的作用僅限於鏈接數據庫,要執行SQL語句,得到數據庫的返回結果,必須使用Statement對象。實際上該對象分為三種:Statement用於執行不帶參數的簡單的SQL語句,PreparedStatement執行帶或不帶IN參數的預編譯SQL語句,CallableStatement用於執行對數據庫已存儲過程的調用。
使用Statement對象執行語句,它提供三種執行語句的方法:
1、 executeQuery,該方法用於產生單個結果集,例如SELECT語句。
2、 executeUpdate,該方法用於執行INSERT,UPDATE或DELETE語句。
3、 execute,該方法用於執行返回多個結果集,多個更新計數或二者組合的店句。
ResultSet對象是JDBC中最重要的單個對象。幾乎所有的方法和查詢都將數據庫作為ResultSet返回。當獲得一個ResultSet時,它正好指向第一行之前的位置,可以用neat()方法得到其它每一行,當指向最後一行的下一行時,該方法回false。方法getXXX提供了獲取當前行中某例值的途徑。
示例:從數據庫authors的Authors表中取得字段”Author”,”YearBron”的列表
配置ODBC數據源名稱為author並幫定數據庫authors。列表guest.jsp的編碼如下:
<%@ page contentType="text/html; charset=Big5" %>
導入java.sql包 |
<%!
String DriverName="sun.jdbc.odbc.JdbcOdbcDriver";
聲明變量 |
Statement smt=null;
Connection conn=null;
ResultSet rs=null;
注冊驅動程序 |
<%
創建一個連接實例 |
Class.forName(DriverName);
conn=DriverManager.getConnection(url,"","");
執行語句並得到結果集 |
rs=smt.executeQuery("select Author,YearBorn from Authors");
}
catch(Exception e){
e.printStackTrace();
}
%>
<html><head>
取得每一行的數據並輸出 |
</head>
<body bgcolor="#ffffff">
<table>
<%while(rs.next()){%>
<tr>
<td><%=rs.getString("Author")%></td>
<td><%=rs.getString("YearBorn")%></td>
</tr>
<%}%>
</table>
</body></html>
<%
關閉結果集和鏈接 |
if(smt!=null)smt.close();
if(conn!=null)conn.close();%>
執行結果如下:
1、新建Jbuilder項目
開啟Jbuilder,新建一個項目名稱為guestbook
在guestbook項目裡新建一個WebModule,取名為Webguestbook:
2、數據表設計及配置ODBC數據源,名稱為guestbook。
使用ACCESS新建數據庫名為guestbook,表名稱為guestbook
字段 | 類型 | 說明 | 主鍵 |
Id | 自動編號(長整型) |
| 是(自增長) |
Username | 文字(20) | 留言人姓名 |
|
Address | 文字(50) | 留言人地址 |
|
Text | 備忘 | 留言內容 |
|
Dates | 時間日期 | 時間 |
|
Ipadd | 文字(30) | 留言人的IP地址 |
|
留言板結構
3、留言內容輸入頁面guestbookadd.jsp
效果如下圖:
源碼如下:
<%@ page contentType="text/html; charset=Big5" %>
<html>
<head>
<title>
guestbookadd
</title>
</head>
<body bgcolor="#ffffff">
<h3>請留言</h3>
<hr width="100%">
<form action="guestbookaddsave.jsp" method="GET">
<table>
<tr>
<td>名字:</td>
<td><input name="username" type="text" size="30"/></td>
</tr>
<tr>
<td>地址:</td>
<td><input name="address" type="text" size="30"/></td>
</tr>
<tr>
<td>內容:</td>
<td><textarea cols="30" rows="5" name="text"></textarea></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交留言"/><input type="reset" value="重設"/></td>
</tr>
</table>
</form>
</body>
</html>
4數據庫鏈接及操作JavaBean:Dbconn.java
package mypack;
import java.sql.*;
public class Dbconn {
//初始化變量
private String dbdriver = "sun.jdbc.odbc.JdbcOdbcDriver";
private String dburl = "jdbc:odbc:guestbook";
public Statement stmt = null;
public Connection conn = null;
public ResultSet rs = null;
//建立數據接口
public Dbconn() throws ClassNotFoundException, SQLException {
try {
Class.forName(dbdriver);
conn = DriverManager.getConnection(dburl);
}
catch (Exception e) {
System.out.print("Exception:" + e.getMessage());
}
}
//返回connection對象
public Connection getconn() {
return (conn);
}
//執行SQL查詢返回結果集
public ResultSet executeQuery(String SQL) {
rs = null;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(SQL);
}
catch (SQLException ex) {
System.out.print("EX:" + ex.getMessage());
System.out.print("SQL:" + SQL);
}
return rs;
}
//執行insert,updata,delete操作
public void executeUpdate(String SQL) {
try {
stmt = conn.createStatement();
stmt.executeUpdate(SQL);
}
catch (SQLException ex) {
System.out.print("EX:" + ex.getMessage());
System.out.print("SQL:" + SQL);
}
}
//關閉
public void destroy() {
try {
if(stmt!=null)stmt.close();
if(conn!=null)conn.close();
if(rs!=null)rs.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
//內碼轉換
public String convert(String s){
try{
return new String(s.getBytes("ISO-8859-1"),"BIG5");
}
catch(Exception e){
return null;
}
}
}
5留言內容保存頁面guestbookaddsave.jsp
<%@ page contentType="text/html; charset=Big5" %>
使用JavaBeans |
<jsp:useBean id="dbconn" scope="page" class="mypack.Dbconn"/>
<%
String name=dbconn.convert(request.getParameter("username"));
String address=dbconn.convert(request.getParameter("address"));
String text=dbconn.convert(request.getParameter("text"));
String ipadd=dbconn.convert(request.getRemoteAddr());
String sql="insert into guestbook(Username,Address,Texts,Dates,Ipadd) values(‘"+name+"‘,‘"+address+"‘,‘"+text+"‘,now(),‘"+ipadd+"‘)";
dbconn.executeUpdate(sql);
dbconn.destroy();
%>
<html>
<head>
<title>
guestbookaddsave
</title>
</head>
<body bgcolor="#ffffff">
留言成功,<a href="guestbooklist.jsp">點擊查看留言</a>
</body>
</html>
6留言列表頁面guestbookllist.jsp
<%@ page contentType="text/html; charset=Big5" %>
<%@ page import="java.sql.*"%>
<jsp:useBean id="dbconn" scope="page" class="mypack.Dbconn"/>
<html>
<head>
<title>
guestbooklist
</title>
</head>
<body bgcolor="#ffffff">
<a href="guestbookadd.jsp">點擊留言</a><br><br>
<%
String sql="select * from guestbook";
ResultSet rs=dbconn.executeQuery(sql);
while(rs.next()){
String username=rs.getString("username");
String address=rs.getString("address");
String dates=rs.getString("dates");
String ipadd=rs.getString("ipadd");
String texts=rs.getString("texts");
%>
<table>
<tr><td><b>姓名:</b><%=username%> | <b>地址:</b><%=address%> | <b>時間:</b><%=dates%> | <b>IP地址:</b><%=ipadd%></td>
</tr>
</table>
<table>
<tr><td><b>內容:</b><%=texts%></td>
</tr>
</table>
<hr>
<%}%>
</body>
</html>
联系客服