回顧熟知的程序
如同我們使用 windows 下的程序一樣,任何程序都可以大致分類爲三類,它們的開發方法也不同:
l 具有可操作窗口的 windows 程序,比如目前 windows 操作系統下的許多工具,word,QQ 等;這些程序通常叫做“視窗編程”開發模式,就是有一個程序要使用VB 等工具設計這個菜單、窗口,給使用者操作;
l 需要使用瀏覽器訪問的程序,比如各種網站;這些程序通常叫做 web 程序,它也有基本的語言,就是熟知的 HTML,能夠設計出各種瀏覽界面;這種工具也很多,比如 frontpage,dreamweaver,甚至是文本編輯器;但做出的代碼文件都是固定的,不能根據用戶的具體操作動態顯示信息,如果要根據用戶的具體操作動態顯示信息,就需要編碼實現,最基本的就是 javascript,但如果涉及到數據庫操作,則還需要編程,這個時候,就用到了 java,jsp 等技術;
l 第三種常見的就是命令行程序,比如在 CMD 命令下執行的各種程序,是單一的命令,這在 Linux 下非常常見;
目前程序員開發的最常見的程序就是:視窗程序和web程序。
理解程序結構
由於計算機本身的侷限性,也就決定了我們要與計算機打交道,操控計算機,必須有程序來提供一個操作界面和環境,以便執行各種命令。目前,最常見的就是視窗程序和web程序了。他們實際上具有共同點,我們按照這個思路,就知道無論開發什麼程序,都要編寫相應的控制代碼:
從上圖可以看出,作爲程序開發人員,我們必須在以下幾個方面學會設計和編寫處理代碼:
1. 界面設計,爲了給使用軟件的人一個人機交互操作的界面,我們要設計這些界面。對於 windows 視窗編程,我們使用微軟等公司的開發工具,提供了菜單、窗口和控件,可以完成界面設計;對於 web 方式,我們則需要使用網頁設計工具來編寫界面;
2. 用戶操作的處理代碼,任何用戶操作,都要通過界面與計算機交互,這種交互其實已經成爲規範的標準,無非都是通過窗口和各種輸入框、選擇框、按鈕等來實現,我們需要編寫代碼來處理。對於 windows 視窗編程,則有一個套方法,大多是控件方式;對於 web 方式,則需要我們編寫更多的處理代碼來完成;
3. 用戶操作的方式和步驟控制代碼,用戶的操作方式和步驟千變萬化,是隨機發生的,我們要編寫出可能的組合處理代碼,也就是操作流程控制,以便完成用戶請求的各種操作;
4. 數據信息處理代碼,這部分代碼是處理數據的,包括磁盤文件,數據庫中的表格等,這部分代碼用來根據用戶的請求,處理各種數據信息,包括保存文件、查詢、添加等;
5. 權限控制代碼,這部分代碼往往用來控制用戶的操作權限,就像 windows 的登錄一樣,不同的權限,能夠使用的軟件功能不同,這些代碼往往和操作系統權限以及數據庫帳戶權限緊密結合,我們可以通過編碼控制用戶的軟件功能使用權限和數據訪問操作權限;
理解編碼結構
從程序結構,我們可以看出,程序開發人員必須在幾個層面上編寫代碼,從界面到控制代碼。目前,看似煙花繚亂的程序,其實設計思想是一致的,我們可以按照統一的思路來學習編程的技術知識。
圖中的 1 都是我們常見的 windows 下的視窗程序的開發過程,其中的 2 則是我們要學習的 java web 方式編程的過程。
Web 編程下的思路
既然任何程序都需要具備界面、控制代碼等控制,我們就要編寫相應的代碼。現在我們分析一下從哪裏下手來掌握各個層面的編程知識。我們將以最熟悉的 windows 下的各種程序作爲對比,來理解 web 編程模式。
1. windows 下常見的編程邏輯
首先看一個標準的 windows 程序界面,通過菜單、窗口和控件組合成用戶界面:
窗口+各種控件設計 各種控件設計 菜單設計
後面要編寫很多代碼來處理上面提出的問題:控制用戶操作、控制權限、數據處理等。這裏我們不作詳細介紹。
2. web 下對應的編程邏輯
在 web 方式下,我們同樣要有類似的界面,只不過這個界面是在瀏覽器下出現,瀏覽器成了虛擬的操作系統,依據的界面設計規則也不再是 windows 視窗的菜單、窗口和控件了,而是標準的、能夠被瀏覽器理解的 HTML 和腳本程序。下面是常見的 java 編寫的網站程序界面:
這裏也有任何程序必須具備的要素:界面代碼、界面操作控制代碼、數據處理代碼和用戶權限控制代碼。
Web 程序結構剖析
我們可以通過下圖看到我們必須掌握的編程知識,從界面到各種操作,對於 J2EE 來說,所有的編碼語言都是 JAVA 的,從 javascript 到 jsp 到 servlet,只要我們熟練掌握 java 語言就可以了。Jsp 中的很多內置對象和操作其實都是廠商使用 java 編寫好的代碼,讓我們直接使用,類似 windows 的控件。我們按照語法規則使用就可以了。包括 JDBC 部分也是如此,我們直接使用,但要有能夠運行這些現成的代碼的環境:JDK/JRE 和 tomcat 等 web 服務器,他們負責與後臺數據庫打交道,幫助我們把代碼中的數據庫操作命令發送給數據庫系統執行,並接受其返回的結果而已。
Web 結構與 javascript
Javascript 是最常用的控制 web 上的各種標記的程序片斷了。Html 語言本身可以理解爲是一組特殊格式的文件,每個都是類似 windows 的控件。通常設計一個網頁,其實就是編寫這些特殊的文件,通過規定的 html 標記語言實現。而這些標記語言,其實都可以通過 javascript 來編程控制,這也是 html 的特點。比如下面的一段 html 文件在瀏覽器中顯示的結果,我們很熟悉:
看似複雜,實際上,就是 html+javascript 實現的,網頁代碼如下:
<script src="richtext.js" type="text/javascript" language="javascript"></script>
<script src="config.js" type="text/javascript" language="javascript"></script>
這個網頁調用了一個 javascript 文件,通過這個文件實現界面的豐富,這個 javascript 文件就是:richtext.js 文件,具體內容很長,這裏不再列出,但都是操作 HTML 中的各種標記對象的,包括 HTML 中的任何語法描述的內容。通常,我們把這些叫做 HTML 的 DOM,就是網頁的“文檔對象模型”。我們可以認爲,html 標記語言的任何東西,都類似 windows 的界面控件。可以被 javascript、jsp、servlet 操作,哪怕一個超級鏈接:http://www.xxx.com 這個語法也是如此!
Web 界面部分
不象我們看到的 windows 程序,在 java 開發下,我們雖然可以通過 awt/swing 實現類似 windows 的窗口界面,但這並不是我們最終發揮 java 技術的長處,而是短處。要實現類似 windows 下的視窗編程,java 的 awt/swing 可是實現,但要麻煩得多,不如微軟的那套方法。
Java 的長處實際上是編寫 web 程序,通過 jsp、servlet、struts技術實現更加豐富的和靈活的網站開發。
通常,一個典型的網頁界面都要包含基本的操作界面元素:超級鏈接、表單和控件,如編輯框、列表框等,這和 windows 很相似。但是通過 HTML 語言描述的,不是簡單的控件。下面的代碼是這些用戶界面的設計結果和 HTML 原代碼。
HTML 表單 form 以及控件
HTML 標準語言結構,描述了瀏覽器中顯示的界面的樣子:
<!DOCTYPE HTML PUBLIC /"-//W
<Html>
<Head>
<Title>Java 論壇 - 論壇</Title>
<link rel="stylesheet" href="./css/forum.css" type="text/css">
</Head>
<Body>
<center><img src="./images/logo.jpg"></center>
<TABLE cellSpacing="0" cellPadding="0" width="100%" bgColor="#336699" border="0" align="center">
<TR>
<TD>
<TABLE cellSpacing="1" cellPadding="4" width="100%" border="0">
<TR bgColor="#ccccff">
<TD align=left colspan=1>
<FONT face=Verdana,Arial,Helvetica color=#003366 size=1>
<B>控制欄</B>
</FONT>
</TD>
<TR bgColor=#ffffff>
<TD align="left" valign="top" width=0>
<FONT face=Verdana,Arial,Helvetica color=#003366 size=1>
<table width="100%" height="0" border="0" cellpadding="0" cellspacing="0" class="infobar">
<tr>
<td width="50%" height="0" align="left" valign="top">
<form action="../servlet/forum.Login" method=POST name=form>
用戶名:<input type="text" name="username" size="10" maxlength="60">
密碼:<input type="password" name="password" size="10" maxlength="60">
<input type="submit" value="登錄">
</form>
</td>
<td width="50%" height="0" align="right" valign="top">
</td>
</tr>
</table>
</FONT>
</TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
<br>
<TABLE cellSpacing="0" cellPadding="0" width="100%" bgColor="#336699" border="0" align="center">
<TR>
<TD>
<TABLE cellSpacing="1" cellPadding="4" width="100%" border="0">
<TR bgColor="#ccccff">
<TD align=left colspan=1>
<FONT face=Verdana,Arial,Helvetica color=#003366 size=1>
<B>提示</B>
</FONT>
</TD>
<TR bgColor=#ffffff>
<TD align="left" valign="top" width=200>
<FONT face=Verdana,Arial,Helvetica color=#003366 size=1>
你需要先登錄!
<br>
<br>
如果你是第一次使用,請先 <a href="./register.jsp">註冊</a>
</FONT>
</TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
<br>
<center>
<span class="copyRight">© 2003 by </span><a href="mailto:[email protected]">Erwin Griekspoor</a>
<br><br>
Beta 1.0
</span>
</center>
</Body>
</Html>
可以看出,在 web 方式下,我們也可以設計類似 windows 的界面。並可以包含基本的界面元素:
1、 各種 HTML 標記命令,如 TD,DIV,BODY,TABLE 等,都可以理解爲控件對象,也可以使用 javascript 編程控制;
2、 超級鏈接:相當於菜單和按鈕的作用,實現主程序調用子程序的功能;
3、 表單 form,實現窗體功能,上面還可以有控件:輸入框、單選、複選、列表和編輯框等,並可以執行特定的程序:通過 action 語法實現調用另外一個程序,處理 form 中的數據;
4、 獨立的控件,form 中的控件可以獨立使用,無需有一個 form;並可以通過 javascript 來編碼控制;
5、 直接使用 frontpage,dreamweaver 等工具直接編輯界面,然後編寫控制代碼;
6、 一個網頁可以有多個 form,並可以分別操作,這樣可以控制用戶不同的操作方法;
實際上,這些界面的代碼是通過 jsp 的 java 程序輸出的,也就說明了,可以通過 java 編程的輸出命令,按照標準的瀏覽器可以識別的 HTML 語法,返回任何文字,瀏覽器都可以顯示出來,這就是動態網頁的含義。
可以看出,無論我們使用網頁設計工具設計的具體網頁文件,通過超級鏈接訪問也好,還是我們通過代碼輸出的信息也好,只要符合 HTML 語言格式,都會被瀏覽器理解,並正確顯示成一個頁面!
JSP(jsp 內置語言命令和servlet) 正是利用這一點,通過輸出讓瀏覽器理解的 HTML 信息,矇混過關!
動態 web 網頁的實現
所謂動態的 web 網頁,就是根據用戶操作的不同,動態顯示的網頁。固定的 html 文件中的信息都已經預先設計好,無法改變,而如果我們要根據用戶提交的信息動態顯示不同的數據,則需要動態網頁了。比如,根據用戶的用戶名和密碼,顯示不同的網頁頁面,這些信息在數據庫中,我們要查詢出來,並提交給瀏覽器顯示不同樣子的網頁,但 HTML 沒有這種編碼技術,我們只能通過 jsp 來實現。要記住,瀏覽器只認識 HTML 格式的數據,因此,任何程序返回到瀏覽器的數據格式必須是 HTML 語言格式的。Jsp 有兩種方法可以動態輸出一個網頁,讓瀏覽器顯示,我們必須理解一下技術:
1. java 語言本身沒有直接的輸出 html 語言文檔格式的方法,除非使用 applet 程序,就是在瀏覽器中嵌入了一個 java 的 awt/swing 界面的程序,實際上還是在瀏覽器中運行了一個窗口程序。目前的瀏覽器都可以運行,但10年前的瀏覽器不能。這種方法其實並不好,因爲我們說過,java 的 awt/swing 程序效果不好,速度慢,需要安裝 jre等。只有偶爾才使用。
2. 爲了解決這個問題,jsp 擴展的 java 語言,這些擴展部分不再是 java 虛擬機來執行,而是 web 服務器 tomcat 等調用 JRE 來執行了,並把結果返回給瀏覽器。因此,在編程語法上有所擴展。方法如下:
l 通過在普通的網頁中嵌入 jsp 語言<% %>標記,告訴 web 服務器 tomcat,把這段代碼翻譯一下,輸出標準 html 格式數據,<% %> 內部的代碼仍然是標準的 java 程序代碼:
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<head>
<title> 學習 JSP </title>
</head>
<body>
<%
java.util.Date date = new java.util.Date();
%>
當前時間 <%= date %>
</body>
</html>
當我們假設web 服務器幫助我們把 <% %> 中的java代碼執行了,其中,java代碼中的變量等都有了具體的數據,我們看到的瀏覽器中的結果是:
實際上通過 web 服務器 tomcat 解釋執行了 java 代碼,返回給瀏覽器的數據是:
<html>
<head>
<title> 學習 JSP </title>
</head>
<body>
當前時間 Tue Jan 02 18:46:43 CST 2007
</body>
</html>
其中:當前時間 Tue Jan 02 18:46:43 CST 2007 是 web 服務器把原來的 <% %> 中的java 代碼解釋執行了,並把運行結果返回到了瀏覽器中(別忘了,我們是通過瀏覽器來啓動程序的,而不是命令行!)。因此,在瀏覽器看來,數據就是一個標準的 HTML 文件格式,可以正常顯示了。
凡是<% %>中的,都是 jsp 對 java 語言的擴展,這些擴展就是爲了和瀏覽器接口。
3. servlet
servlet 也是一樣,只不過是無需 <% %> 標記混在 html 文件中,並把文件後綴改爲 .jsp。而是純粹的 java 程序,並是一個獨立的 java 程序文件。但,servlet 通過另外一種語法方式也能輸出標準的 HTML 格式數據。這些新的語法也是對 java 基本語言的擴展。看下面的網頁:
其標準的 HTML 文件是:
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head>
<title>helloapp</title>
</head>
<body>
<p><font size="10">你好!這是第一個主頁</font></p>
</body>
</html>
實際上,這個網頁是一個 servlet 輸出的,servlet 的 java 原代碼如下:
文件名:helloWWW.java
編譯後的文件:helloWWW.class,在 web-inf/class 目錄下
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWWW extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC /"-//W
"Transitional//EN/">/n" +
"<HTML>/n" +
"<HEAD><TITLE>Hello WWW</TITLE></HEAD>/n" +
"<BODY>/n" +
"<H1>Hello WWW</H1>/n" +
"</BODY></HTML>");
}
}
而在動態網頁中,也就是我們設計的程序代碼中,是這樣放置的:
<html>
<header>
<body>
<form action=”/helloapp/hellowww”>
</form>
</body>
</header>
</html>
這裏,通過 form 的 action 屬性調用了具體的 java 程序:helloapp 目錄下的 hellowww.class,用來處理用戶的操作,就是點擊了按鈕。
或者,直接在瀏覽器地址欄中輸入:http://localhost:8000/helloapp/hellowww
也可以直接運行程序 hellowww.class,相當於超級鏈接到這個程序。爲什麼瀏覽器知道呢?因爲是 web 服務器 tomcat 解釋的。爲了讓 tomcat 知道調用哪個 java 程序,我們還要作一些配置工作,就是在 web.xml 文件中,告訴 tomcat 調用哪個程序,瀏覽器地址輸入的 helloapp/hellowww,實際上是一個磁盤目錄的路徑:helloapp 目錄,其下有一個 web-inf 目錄,下面有一個 classes 目錄,其中有一個 java 編譯好的程序 hellowww.class。
通過這種 tomcat 規定的語法格式,告訴 tomcat 運行程序 hellowww.class,並把結果返回給瀏覽器。
因此,這種特殊的“超級鏈接”方式很靈活,我們可以根據需要來處理。在網頁上,要調用另外一個程序,可以通過以下方式:
l 超級鏈接;
l Form 表單的 action 屬性;
l 直接在瀏覽器地址欄輸入程序名稱,需要 web.xml 配合,其實這是 struts 的基礎,也是 jsp 的靈活性;否則,豈不要做很多超級鏈接或者表單了?很麻煩!
談談 javaBean
jabaBean 作爲一種特殊的程序,實際上還是基本的 java 語言編寫的程序,但類似 windows 的控件。在 java 的 awt/swing 開發中,也常用 javaBean,這就類似自己定義了一個控件。而在 web 開發中,一般來說,在以下兩種情況下使用:
l 把常見的處理代碼編寫成一個 java 文件,然後通過 jsp 的內部對象直接調用這個程序:語法是:
<jsp:useBean id="xxx" scope="request" class=”xxx”>
<jsp:setProperty name=”calculatOr” property=”*”/>
</jsp:useBean>
通過 jsp 的擴展命令就可以調用你編寫好的 java 程序,擴展了 jsp 內置的程序。javaBean 程序存放在網站的 classes 目錄中,tomcat 會自動尋找這個程序來執行。
l javaBean 實際上是 form 表單控件的擴展,可以執行各種功能,但侷限於具體的一種操作,類似一個函數,如果要同時使用多個 javaBean,則需要執行多個 jsp:useBean 標籤語言。相互之間調用也很麻煩。
l javaBean 有屬性和方法函數,通過這些與調用它的程序進行接口並傳遞信息;這些都是 javaBean 語法規定的要求,我們可以按照語法規定進行編寫程序。
javaBean 實際上是 jsp 的一種補充,同時可以作爲 jsp 語言補充的就是標籤功能。擴展了 jsp 現有的 <% %> 中的標籤,也就是命令或者稱爲傳統意義上的函數庫。
從 HTML 到 java 代碼的接口技術
上面我們已經看到,要能夠通過標準的 HTML 語言,或者理解爲一種特殊的界面,讓用戶操作很多功能,我們必須通過以下方式,來實現程序的調用:
l 超級鏈接;
l 表單的 action;
l 特殊的 jsp 擴展命令,就是 <% %> 中的 java 代碼;
爲了把標準的 HTML 頁面的信息提交給 java 程序,包括 jsp或者servlet,我們必須有一個套編碼規則,用來獲取 html 提交的信息,就是通過超級鏈接、表單的 action 或者控件的輸入的數據,傳遞給 java 程序,這些 java 程序包括 javascript,jsp <% %> 中的,也包括 javaBean,更包括 servlet程序。有以下方法:
l Javascript則通過 DOM 技術,參考教材的內容;
l Jsp,則通過<% %> 中的代碼實現;
l javaBean,則通過 javaBean 的屬性和方法實現;
servlet,則通過 doPost 等特殊的 java 擴展語法實現,這些語法在 javax.servlet.*和 javax.servlet.http.* 標準 API 中。可以查看相關幫助文件。
這樣,無論後面的 java 程序作什麼操作,在瀏覽器看來都無所謂,只要結果是 html 格式就行了。包括這些 java 程序進行數據庫操作。
Web 界面流程控制部分
由於 web 界面是一種特殊的 windows 界面,也有用戶可以操作的部分,比如超級鏈接,表單,控件,甚至任何標記部分,那麼,有時爲了控制用戶的操作方法和流程,比如驗證輸入的信息格式、控制能否超級鏈接、控制圖形顯示大小、控制動態的顏色顯示等。
可以把上圖中能夠看到的任何東西都理解成控件,都可以被編碼操作。這也是 web 頁面的靈活性,但也是導致編程控制更加有難度的原因。一旦靈活了,自然就變化多了,控制起來就繁瑣一些。好在,我們無須控制一切,只是根據需要控制很少一部分該控制的就行了!
我們需要通過編寫代碼來控制,這些編碼技術就是:
l javascipt——常用來控制 HTML 標記對象;
l jsp——常用來控制動態顯示的部分,並與其他程序接口,如其他java程序,數據庫程序等;
l javaBean——常用來擴展 jsp 基本元素;
l servlet——常用來控制動態顯示,並於其他程序接口,如其他 java 程序,數據庫程序等,實際上,所謂 jsp 編程,核心技術就是 servlet ,只不過 jsp 內置元素是一些公司幫助我們首先編寫好的 servlet ,無須我們自己編寫了,這在 windows 下可以理解爲系統提供的 dll 庫;
l struts——核心還是 servlet,但它把複雜的操作流程通過組織管理,讓我們更加清晰地管理起來,與其說是編程技術,不如說是一種程序代碼執行調用流程的組織管理配置技術;
對於用戶操作流程的控制,我們可以通過以下方法來設定:
l javascript 編碼控制;
l jsp和javabean,servelet的編碼,繁瑣,不靈活;
l 利用 struts 配置文件設置,靈活但缺乏豐富性,比如多個表單提交數據的處理;
數據庫連接部分
數據庫連接部分是實現從 java 代碼到操作數據庫的部分,歸根結底是通過 java 代碼給數據庫發送命令,執行數據庫操作,這些命令在 java 看來就是 sql,這些命令完全可以直接在數據庫管理系統中執行,但非常麻煩,也沒有用戶界面,因此,開發程序的主要目的就是要簡化這種技術性很強的操作,讓更多不懂得數據庫命令的用戶能方便使用數據庫。這些都是通過 SQL 命令完成。J2ee 提供了兩種方式執行數據庫命令:
l JDBC+Odbc 方式,通常用於 awt/swing 的類視窗程序的數據庫操作;
l JDBC 直接操作,無須配置 ODBC,就可以操作,通常用在 web 編程;
通過這些連接,都可以通過 java 代碼操作數據庫。
數據庫信息處理部分
數據庫信息處理主要通過 SQL 語言,無論我們使用什麼數據庫,比如 sql server,mysql,oracle 等,數據庫系統都會接受 java 通過 jdbc 傳遞的 sql 標準命令,就如同在數據庫管理系統中操作一樣。比如 sql server ,我們可以通過兩種方式執行 sql 命令,操作數據庫:
l 數據庫管理系統的操作界面,必須到數據庫管理系統中執行,沒有豐富的操作界面,要求所有用戶進入數據庫系統,這是可能的,比如 QQ ,有數據庫系統 oracle,是不是所有的 QQ 用戶都到騰訊公司服務器上操作呢?當然不現實,肯定要通過 QQ 程序通過互聯網操作數據庫!發送 SQL 命令給那個 oracle 數據庫系統。
我們看看如果直接在數據庫系統中操作,是什麼樣子:
用戶直接在數據庫管理系統中數據 SQL 命令
看來不可想象,有多少用戶會這些操作,並可以有數據庫操作權限呢?因此,必須提供給用戶一套程序,就是有界面,有控件,並可以通過網絡遠程操作數據庫,並用到服務器上操作。因此,這就是 java 網站編程的意義。如果通過 jsp 網站,則對用戶來說,簡單明瞭,比如我們前面提到的 jsp forum 網站,通過這個網站,就可以操作數據庫了。
l Sql server 數據庫中的設計:數據庫、表以及用戶權限;
Jsp forum 網站的後臺數據庫
l 用戶操作的網頁
其中通過 html,javascript,jsp,javabean,servlet,struts 提供給用戶一個方便的操作界面,並可以通過互聯網操作!而對於程序開發者來說,要編寫很多代碼,比如這個網站的主頁的代碼如下:
<% String requestPage = request.getParameter("page"); %>
<%
if(requestPage == null){
requestPage = "0";
}
%>
<% if(requestPage.equals("thread")){ %>
<% String forum_id = request.getParameter("forum_id"); %>
<jsp:include page="thread.jsp" flush="true" >
<jsp:param name="forum_id" value="<%= forum_id %>" />
</jsp:include>
<% }else if(requestPage.equals("message")){ %>
<% String forum_id = request.getParameter("forum_id"); %>
<% String thread_id = request.getParameter("thread_id"); %>
<% String start = request.getParameter("start"); %>
<jsp:include page="message.jsp" flush="true" >
<jsp:param name="forum_id" value="<%= forum_id %>" />
<jsp:param name="thread_id" value="<%= thread_id %>" />
<jsp:param name="start" value="<%= start %>" />
</jsp:include>
<% }else if(requestPage.equals("editmessage")){ %>
<% String forum_id = request.getParameter("forum_id"); %>
<% String thread_id = request.getParameter("thread_id"); %>
<% String reply_id = request.getParameter("reply_id"); %>
<% String start = request.getParameter("start"); %>
<jsp:include page="editmessage.jsp" flush="true" >
<jsp:param name="forum_id" value="<%= forum_id %>" />
<jsp:param name="thread_id" value="<%= thread_id %>" />
<jsp:param name="reply_id" value="<%= reply_id %>" />
<jsp:param name="start" value="<%= start %>" />
</jsp:include>
<% }else if(requestPage.equals("profile")){ %>
<jsp:include page="profile.jsp" flush="true" />
<% }else{ %>
<jsp:include page="forum.jsp" flush="true" />
<% } %>
其中很多知識都是我們要學習的編程技術,這也是程序員存在的價值!
特殊的 JAVA 程序組織形式
Java 開發,或者稱爲以 java 技術爲基礎的程序開發,包括 html,javascript,jsp,javabean,servlet,struts 等,我們都要明白自己編寫的程序代碼的結構和調用關係。
Java 編程很特殊,沒有更好的文件管理的集成開發環境,就像vb一樣的環境,可以幫助你管理和組織原代碼,我們要清楚我們編寫的代碼的存儲方式,以及調用方式。實際上,就是磁盤文件的存儲方式,java 開發依賴於這種磁盤文件保存方式。
l 目錄和包
最基本的 java 程序,組織形式實際上是磁盤目錄,如果我們有多個 java 程序,而這些程序之間相互調用,我們可以通過 package 語法,告訴另外一個程序,原來的程序在哪裏,在 java 編碼中叫做包,比如:
package forum;
import java.io.*;
import javax.servlet.*;
......
public class AddForum extends HttpServlet {
……
其中,forum 實際上是磁盤目錄,告訴 java 程序,如果調用的某個類沒有在自己的程序代碼文件中,則到這個目錄找!java 通常是一個類一個磁盤文件。
這個目錄告訴 java 程序,其他類文件在哪裏,在 java 代碼中,使用 package 命令說明!
l Web 超級鏈接和表單 action
超級鏈接一般可以連接到具體 HTML 文件,但也可以是一個磁盤目錄,其中包含了超級鏈接的位置。對於網頁設計者來說,喜歡超級鏈接是具體文件,而對於動態網站開發者來說,則可能是 java 類文件,比如前面提到的 hellowww。其實,hellowww是個 java 類文件,而不是磁盤目錄或者具體的 html 文件。但 tomcat 的 web.xml 中說明了如何找到它,因此超級鏈接也可以成功。
當然,如果在 action 中直接說明調用哪個 java 程序,也就簡單了。直接運行這個程序。
所有的 java 程序必須編譯成 .class 文件才能運行。
l 多個 java 程序的調用控制流程設置;
對於視窗視窗編程,也就是 applet,awt/swing來說,調用多個 java 程序,通過菜單、按鈕等就可以了。下圖是程序設計界面,很象 VB,其中的按鈕可以調用其它 java 程序。
通過代碼:
ivjJButton1.addActionListener(new ActionListener()
可以執行相關類的處理代碼。這是複雜的 java 的 awt/swing 設計方法。我們的課程中有相關實訓案例。
l Web 方式的調用組織形式
在 web 方式下,目錄,也就是 package,仍然有效,但因爲超級鏈接等的存在,程序代碼要複雜了,對於 java 代碼來說,仍然是 package,但,對於多個 java 程序處理一個 html 頁面來說,則需要藉助配置文件:web.xml和struts-config.xml。
通常,我們使用的是 web.xml文件,其中說明不同的 html 用戶操作應該調用哪個 java 程序。比如 jsp forum 網站的 web.xml 文件內容如下:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app>
<!-- Filters -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.alvin.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- servlets class-->
<servlet>
<servlet-name>forum.AddUser</servlet-name>
<servlet-class>forum.AddUser</servlet-class>
</servlet>
<!-- servlets url-->
<servlet-mapping>
<servlet-name>forum.AddUser</servlet-name>
<url-pattern>/servlet/forum.AddUser</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>forum.Login</servlet-name>
<servlet-class>forum.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forum.Login</servlet-name>
<url-pattern>/servlet/forum.Login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>forum.Logout</servlet-name>
<servlet-class>forum.Logout</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forum.Logout</servlet-name>
<url-pattern>/servlet/forum.Logout</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>forum.ChangeProfile</servlet-name>
<servlet-class>forum.ChangeProfile</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forum.ChangeProfile</servlet-name>
<url-pattern>/servlet/forum.ChangeProfile</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>forum.AddForum</servlet-name>
<servlet-class>forum.AddForum</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forum.AddForum</servlet-name>
<url-pattern>/servlet/forum.AddForum</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>forum.AddThread</servlet-name>
<servlet-class>forum.AddThread</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forum.AddThread</servlet-name>
<url-pattern>/servlet/forum.AddThread</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>forum.AddReply</servlet-name>
<servlet-class>forum.AddReply</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forum.AddReply</servlet-name>
<url-pattern>/servlet/forum.AddReply</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>forum.DeleteThread</servlet-name>
<servlet-class>forum.DeleteThread</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forum.DeleteThread</servlet-name>
<url-pattern>/servlet/forum.DeleteThread</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>forum.ChangeMessage</servlet-name>
<servlet-class>forum.ChangeMessage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forum.ChangeMessage</servlet-name>
<url-pattern>/servlet/forum.ChangeMessage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>forum.DeleteReply</servlet-name>
<servlet-class>forum.DeleteReply</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forum.DeleteReply</servlet-name>
<url-pattern>/servlet/forum.DeleteReply</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>forum.DeleteForum</servlet-name>
<servlet-class>forum.DeleteForum</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forum.DeleteForum</servlet-name>
<url-pattern>/servlet/forum.DeleteForum</url-pattern>
</servlet-mapping>
</web-app>
不用現在就理解其中的語法規則,但我們能夠看出,這裏告訴了網站 tomcat 服務器,到哪裏找到對應的程序。其中,register.jsp 網頁內容如下:
<%@ page contentType="text/html;charset=gbk" %>
<jsp:include page="./include/header.jsp" flush="true">
<jsp:param name="title" value="Forum" />
</jsp:include>
<jsp:include page="./include/body.jsp" flush="true" />
<br>
<jsp:include page="./include/table_start.jsp" flush="true" />
<jsp:include page="./include/table_title.jsp" flush="true">
<jsp:param name="title" value="註冊" />
<jsp:param name="colspan" value="1" />
<jsp:param name="align" value="left" />
</jsp:include>
<jsp:include page="./include/table_start_body.jsp" flush="true" />
<jsp:include page="./include/table_body.jsp" flush="true">
<jsp:param name="width" value="0" />
</jsp:include>
<form action="../servlet/forum.AddUser" method=POST name=form>
用戶名:<br>
<input type="text" name="user" size="62" maxlength="60"><br>
密碼:<br>
<input type="password" name="password" size="62" maxlength="60"><br>
再次輸入密碼:<br>
<input type="password" name="password2" size="62" maxlength="60"><br>
E-mail:<br>
<input type="text" name="email" size="62" maxlength="60"><br>
<input type="submit" value="註冊"><br>
</form>
<jsp:include page="./include/table_close_body.jsp" flush="true" />
<jsp:include page="./include/table_close.jsp" flush="true" />
<jsp:include page="./include/footer.jsp" flush="true" />
其中的表單 form 語法爲:
<form action="../servlet/forum.AddUser" method=POST name=form>
Tomcat 如何找到這個 HTML 表單提交的操作的程序(就是用戶的操作請求處理程序)?在 web.xml 中已經說明了,是在 tomcat 規定的相對磁盤目錄的 web-inf/classes 的forum 下,文件名是:AddUser.class,爲了符合 java 編程規則,必然要有包的說明,就是磁盤目錄 forum,這樣就告訴 tomcat,這個程序在 web-inf/classes/forum 下。具體使用則省略 web-inf/classes,這是默認的,無須說明,而後續目錄要說明,就是:
Forum/adduser.class。
這樣,當用戶點擊提交按鈕的時候,就會執行表單 form 的 action 動作,並執行程序 adduser.class java 程序。
Tomcat目錄結構
Tomcat目錄如圖所示。
● bin:包括startup,shutdown等批處理文件,其中tomcat.bat是主要文件,其他文都只是提供了一個tomcat.bat的入口,可以方便地執行啓動、關閉、編譯等某一項特定的功能。
●classes:Tomcat可以自行創建此目錄,並且把附加的類文件放置在此,凡是放在這
個目錄下的類文件將自動出現在CLASSPATH環境變量當中。
●conf:包括Tomcat的各種配置文件,其中server.xml和web.xml是兩個主要的配置文
件。
●doc:包括同Tomcat相關的各種文檔。
●lib:包括Tomcat使用到的各種jar文件,jar文件是Java的壓縮格式的庫文件。
●src:Servlet APl的源代碼,但是僅僅包含空的接口和抽象類,而沒有具體的實現。
●webapps:是放置Web應用的目錄,還包括一些例子,自己開發的應用也可以放在這個目錄下。
●work:如果不配置的話,Tomcat將自動創建這個目錄。Tomcat將編譯好的JSP文件
等臨時文件放在這個目錄下。
●logs:用於放置Tomcat的各種日誌文件,在配置和除錯時很有幫助。
2.Tomcat主配置文件——server.xml
server.xml是Tomcat的主配置文件,完成兩個目標:
(1)提供Tomcat組件的初始配置。
(2)說明Tomcat的結構和含義,使得Tomcat通過實例化組件完成啓動及構建自身。
配置管理問題
大家都知道 VSS,就是 microsoft visual sourcesafe。這是一個配置管理工具,實際上,配置管理是公司開發資源的管理,對於軟件開發來說,開發資源就是財富,比如代碼、文檔等,如果丟失或者被覆蓋,那將是嚴重損失。因此,程序員要養成配置管理的習慣,保護自己的勞動成果。
配置管理工具可以幫助我們備份保護開發成果,就是代碼,文檔等,也能控制不同的版本,防止相互覆蓋或者代碼混亂。在配置管理工具中,通過控制用戶權限,checkin,checkout來控制。
配置管理工具建立了一套數據庫,把我們的資源都保存到數據庫中,這個數據庫可以是一個磁盤目錄,也可以是 access,也可以是 sql server 等數據庫系統。具體的配置管理工具都有所不同。
安全性問題
軟件系統也是有安全性的,我們開發的軟件通常要考慮以下幾個層面的安全性問題,因爲如果安全性沒有管理好,會出現信息泄露,如果安全性設置限定過高,會導致程序無法運行:
l 操作系統的帳戶,這是第一層安全性,大家已經習慣了登錄,但有時候你的程序的安全性會與這個相關,通常見於 windows 程序;
l 數據庫系統帳戶,數據庫系統爲了保護自己,獨立有一套帳戶體系,脫離與操作系統帳戶之外,這樣,就算有操作系統權限,也不一定能操作數據庫,這在編寫代碼的時候很關鍵,比如我們連接數據庫的代碼一定要有數據庫帳戶;
l 網絡層安全,這涉及到防火牆控制,端口控制,比如 tomcat 安裝使用的端口是 8080,而不是 80,因爲在 windows 下,80 端口被其他程序佔用了。
l 程序開發者設置的帳戶,就是我們經常建立一張表格,其中有用戶名和密碼字段,我們通過程序來判斷用戶的帳戶,這是虛擬帳戶,許多 BBS 等都採用這種方式,因爲由於用戶太多,成千上萬,不可能都給一個系統級別的真實帳戶,那樣操作系統會崩潰的!