隨著WEB技術的發展,WEB內容從一些靜態的頁到內容豐富的動態頁。對於廣大WEB開發人員來講動態頁面的生成是一個挑戰。有許多的方法來試圖解決這個問題,如plug-in技術及基於服務器端的APIs等方法,但存在的一個問題是這些方法是針對某個特定的web服務器,如Microsoft提供的ASP技術就只針對它的IIS及Personal web服務器。
目前用於生成動態網頁較為流行的方法有CGI、PHP及JavaServer Page(JSP)技術等。其中:CGI通過訪問其它應用程序來獲取信息並返回給浏覽器,CGI程序通常用C或PERL語言來開發;Jsp則通過將Jsp組件編譯成Java Servlet在服務器端運行來實現動態內容。下面從幾個方面比較Jsp與傳統CGI的特性:
可移植性:
大多WEB服務器支持CGI接口,但CGI程序自身並不能跨平台運行; Java Servlet程序則具有JAVA程序的優點,可運行在任何平台之上,大多數WEB及應用服務器都支持JAVA及servlet API。
性能上:
傳統的CGI環境下,每一次client對CGI程序的請求,都使服務器產生一個新的進程來裝載、執行CGI程序。大量的並行請求大大降低了其性能;JSP則沒有這個局限,每個程序裝載一次,並駐留在服務器內存為以後請求服務。另外JSP在多線程的編寫與控制方面比CGI容易得多。
開發及發布:
由於Java Servelt具有JAVA的所有優點,開發起來也相對容易,java簡化了對異常的處理;它的面向對象特性使開發人員的協作成為一件簡單的事。JSP技術從如下幾個方面加快動態網站開發:
1) 將靜態頁面的開發和動態內容的生成分開
JSP中通過使用HTML或XML標記來規劃、設計WEB頁的布局和風格;而用JSP標記來實現動態的內容,生成動態內容的部分被封裝起來運行於服務器端;這樣頁面布局和風格可單獨編輯與調試而不影響動態內容生成。
2) 組件的重用
多數JSP頁通過重用無平台無關的組件—javaBeans來完成復雜的要求。這些組件可在開發人員中重復使用。
3) 通過標記來簡化頁面開發
通過JSP提供了標記,開發人員可以很容易使用beans組件,設置和訪問它們的屬性。同時JSP也允許用戶自定義標記,還可接受第三方開發的標記,從而可以方便使用第三方提供的功能組件。
在對JSP的特點有所了解之後,接下來就談談JSP的安裝與開發實例。(操作系統以Nt4.0為例)
為運行JSP page需要安裝jdk及jswdk。首先安裝jdk,在jdk安裝完成後,要確保javac及java能正常工作。然後安裝jswdk,實際上只需把jswdk解壓到一個目錄即可。為了使jswdk正常運行,還需要對環境變量CLASSPATH做如下修改:
如果使用JDK1.1,則不需修改CLASSPATH;如果使用JDK1.2,則設置環境變量JAVA_HOME,使其指向JDK安裝路徑。
完成上述工作後,就可以啟動Java WebServer了。
執行jswdk目錄下的startserver.bat文件來啟動Java Server,該Web server使用的默認端口為8080。如果Web server新動後,需要重新啟動則需要先停止已啟動的Web server,執行stopserver.bat可停止達到此目的。
JavaServer啟動後,如果正常則在浏覽器的地址中輸入:http://localhost:8080/ 就可顯示介紹Java Webserver Page的頁面。在jswdk目錄下還有一個examples目錄,這是jswdk中自帶的一個web 應用, 一個web應用包含jsps, servlets,html files, images等資源。我們也可以創建一個新的web應用,從而把自己相關的文件放入其中。讓我們來分析一下如何創建一個新的web 應用。
要創建一個新的web 應用,需要在jswdk安裝目錄下新建一個目錄,如創建一個名為myweb的web應用,其目錄結構如下:
jswdk_inatall myweb web-inf
servlets
jsp beans
webapp.properties
servlets.properties
mime.properties
mappings.properties
其中:jswdk_install表示jswdk的安裝目錄;以properties為後綴的四個文件為屬性文件,可從jswkd_install/web-inf下拷貝得到。修改jswdk_install目錄下的webserver.xml文件,加入如下一行,其作用是把myapp作相應的映射: <WebApplication id="mybase1" mapping="/myweb" docBase="myweb"/>
同時修改startserver.bat文件,把 myweb/web-info/jsp/beans目錄加到相應的環境變量beanJars中;也可通過在CLASSPATH環境變量中加入該路徑來實現。
要加入jsp文件,可把文件放到myweb目錄下或它的下一級目錄中;要加入servlet,只需把編譯正確的servlet放到servlets中;而把編譯正確的java beans放到beans目錄下。
請注意在對beans或servlet修改後,要使修改生效,需要重新啟動Web Server。
了解這些規則之後,下面就創建第一個JSP文件 myfirst.jsp,其內容如下:
<html>
<head><title> My first Jsp file<titile>
</head>
<body>
<% out.println("this is my first jsp file"); %>
</body>
</html>
將該文件放在jswkd_install\myweb目錄下,如果Web server已啟動,則在游覽器地址中輸入:
http://localhost:8080/myweb/myfirst.jsp
我們就可以看到執行的結果。在完成第一個簡單的jsp文件後,我們可以編寫一個java beans,並在jsp文件中調用該beans。
java bean源程序HelloWorld.java內容如下:
public class helloWorld {
public String name ;
public boolean setHello(String name){
this.name = new String(name);
}
public String sayHello()
{
return name;
}
}
用JDK編譯該文件:
javac helloWorld.java
在成功編譯後,將生成的字節碼文件HelloWorld.class放到myweb/web-inf/jsp/beans目錄下;
在下面jsp文件test.jsp中調用helloWorld,test.jsp內容如下:
<html>
<head>
<title> Jsp and java bean </title>
</head>
<body>
<jsp:useBean id="helloBean" scope="session" class="HelloWorld" />
<%
String hello = "this is a bean test";
helloBean.setHello(hello);
out.println(helloBean.sayHello() + "<br>");
%>
</body>
</html>
將該jsp文件放到jswdk_install\myweb\目錄下
重新啟動web Server,在浏覽器地地址中輸入:
http://localhost:8080/myweb/test.jsp
就可以顯示執行結果;
注意到在test.jsp中
<jsp:useBean id="helloBean" scope="session" class="HelloWorld" /> 的scope = "session"表明該對象創建後可在同一會話(session)的其它頁引用。如我們可以在aftertest.jsp中引用test.jsp中創建的對象,aftertest.jsp內容包含下面的代碼:
<%
helloWorld rebean = (helloWorld)session.getValue("helloBean");
out.println("bean used in aftertest.jsp"+rebean.sayHello());
%>
要注意的是要引用的對象必須已創建,否則會出現異常。
下面看看在jsp中使用訪問數據的java beans例子。我所使用的數據庫是oracle8,通過SQL*Net創建的數據庫連接串名為begpinter,數據庫服務器運行在名為begpinterserver的機器上,下面是JspJdbc.java的內容:
// You need to import the java.sql package to use JDBC
import java.sql.*;
import oracle.jdbc.driver.* ;
public class JspJdbc
{
Connection conn = null;
Public ResultSet rset = null;
public JdbcCheckup(){
// Load the Oracle JDBC driver
try{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
}catch(SQLException e1) {
System.err.println("executeQuery: " + e1.getMessage());
}
}
public ResultSet executeQuery(String sql) {
rset = null;
try {
conn = DriverManager.getConnection
("jdbc:oracle:thin:@bgpinterserver:1521:bgpinter","SCOTT", "TIGER");
Statement stmt = conn.createStatement();
rset = stmt.executeQuery(sql);
}catch(SQLException e1) {
System.err.println("error: " + e1.getMessage());
}
return rset;
}
}
編譯後將JspJdbc.class文件放入myweb\web-inf\jsp\beans目錄下。在下面的jsp文件中調用beans,jspdb.jsp內容如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Database in Jsp</title>
</head>
<body>
<%@ page language="java" import="java.sql.*,oracle.jdbc.driver.*" errorPage="errorpage.jsp" %>
<jsp:useBean id="jspdatabase" scope="page" class="JspJdbc" />
<%
ResultSet rset = jspdatabase.executeQuery("SELECT * FROM emp");
out.println("<table><tr><th>number</th><th>name</th></tr>");
while (reset.next()) {
out.println("<tr><td>"+rset.getInt("eptno")+"</td>");
out.println("<td>"+rset.getString("enameeptno")+"</td></tr>");
}
rest.close();
out.println("</table>");
%>
</body>
</html>
其中用於顯示異常的errorpage.jsp內容為:
<html>
<body bgcolor="red">
<%@ page isErrorPage="true" %>
<h1> The exception <%= exception.getMessage() %>
</body>
</html>
重新啟動Web server使新創建的java beans生效,如果與數據服務器連接正常,則在浏覽器地址中輸入
http://localhost:8080/myweb/jspdb.jsp
將顯示查詢結果。
通過上面的介紹,相信大家對Jsp有所了解。要進一步了解Jsp技術可訪問下面的站點:
http://java.sun.com/products/jsp