題外話:
自從由開發人員轉為培訓講師后,發現了很多技術的知識點是不全面的,在開發中只要只要能夠滿足功能就OK了。但是發現到了講師的職位后還需要掌握很多以前很多沒有接觸過的知識點。然而對于開發經驗少,代碼量不多,基礎有限的學員來說就很頭大了。所以我想將知識點進行整理,寫成一系列的文章,能夠讓他們快速的上手和開發,這也是為什么將這一系列文章起名叫做《SSH快速開發與整合》。本系列文章的書寫目的不是讓大家了解多么新的技術和多么炫的頁面效果,而是想為入門者提供一條更快的捷徑。
由于平時白天工作比較忙時間緊,一直擔心怕寫不完,但這次我下了很大決心將他寫完。由于是第一次寫這么系統的文章,里面會有很多不足,就請大家擔待吧。
開發環境:在本系列文章中,我們會用到的開發工具是 MyEclipse6.5 Blue 版本,服務為:Tomcat6.0,數據庫為:Mysql6.0 。
第1章基礎知識回顧
為了能夠更清晰的了解struts 框架工作原理,我們需要對 JSP 部分知識點進行回顧。
1.1 web應用程序中的Model1和Model2模型
在最早的 Java Web 應用程序中,JSP文件幾乎擔任了所有的工作如圖1-1所示。其中包括了頁面的顯示、請求跳轉的控制、業務的處理等等,這種方式在實際的項目開發中項目要是代碼量少點也就無所謂了,如果代碼量大的情況下要用這種方式開發出來的程序html代碼、java代碼、javascript腳本代碼混在一起對于后期代碼的維護是一件非常麻煩的事。所以這種方式的開發沒有被業界給出什么明確的定義。

為了解決這種問題Sun公司制定了兩種架構模式 Model 1 和 Model 2。
1.1.1 Model 1

為了解決直接在JSP頁面上寫代碼可讀性差的問題,我們將原先寫在JSP頁面上的業務邏輯代碼提出來寫到JavaBean中如圖1-2。此時JSP充當了視圖層為客戶端提供了請求和響應,再由Jsp調用JavaBean進行處理業務邏輯。這種架構方式我們往往稱之為 Model 1。
在Model1中,我們可以看出 Jsp 不但完成了對客戶端的請求和應答工作還擔任著調用不同業務類的請求跳轉工作。但這個架構比起直接在JSP頁面上寫代碼已經好多了,Model1中已經將業務代碼從頁面中的控制代碼和Html代碼中進行了分離。至少當程序業務代碼出現問題時,我們不再會到JSP頁面中去尋找修改業務邏輯代碼了。
此時Model1比起直接在JSP頁面上寫代碼已經強多了,但是對于大型項目而言還是不能夠滿足,畢竟JSP頁面中還有控制跳轉的代碼存在。
1.1.2 Model 2

為了解決Mdel1中控制器代碼和HTML、JavaScript代碼寫在一起,Sun公司制定了Model2,在Model2中引入了“控制器”概念,而控制器往往由Servlet充當。此時JSP頁面中只剩下了HTML代碼和一些客戶端javascript腳本代碼,請求由控制器Servlet進行控制跳轉到不同的JAVABean或者JSP頁面,這樣Jsp中只提供對客戶的界面視圖我們用英文單詞View表示,而Servlet只完成請求的跳轉工作我們可以用英文Controller表示,JavaBean中完成業務邏輯和數據的封裝我們可以用Model表示,這樣我們將 View - Controller - Model三個單詞的第一個字母提取出來就是我們所謂的 MVC 模式了。
1.2 MVC的概述
MVC是Model(模型) - View視圖()-Controller(控制器)三個單詞的縮寫。MVC是J2EE中的一種模式,是針對于整個應用程序結構而言的,所以MVC模式從尺度上來講要比我們平時所說的java設計模式要大。關于java設計模式在此就不做過多的講解了,讀者可以參考閻宏博士所寫的《Java與模式》 。
在J2EE中有很多技術都可以實現MVC模式比如我們馬上要學習的struts框架技術就是MVC的一種實現,還有 JSF、WebWork等等。
接下來我們需要搞清楚的一個問題就是J2EE、MVC、Struts他們之間樣的關系。在此我們拿 宇宙 、太陽系 、地球來進行說明,我們都知道我們的地球是隸屬于太陽系的,但是這個太陽系中不僅僅只有地球,還有火星、木星等等星球構成。例子中的太陽系就相當于MVC模式而地球相當于struts,從而我們知道MVC模式并不是只有struts能夠實現,還有其他很多技術可以實現,像上面提到過的JSF、WebWork等等技術,所以我們只能夠說struts是MVC模式的一種實現方式。而MVC和J2EE之間的關系就像太陽系和宇宙的關系一樣,宇宙中有很多類似于太陽系的星系,所以MVC知識J2EE中的一種模式,如圖1-4所示:

1.3 配置一個 Servlet
為了讓讀者對程序有更深的理解,在程序實例中全部都采取手工搭建和配置。(此處作者使用的是MyEclipse6.5Bule版本)
首先我們在MyEclipse中創建一個web應用程序步驟如下:
(1) 選擇 “File 菜單 → New → Project ”,如圖1-5所示。

(2)在彈出的New Project窗口中,選擇“Web Project”,然后點擊“Next”按鈕,如圖1-6所示。


圖1-6 圖1-7
(3)在“New Web Project”對話框的“Project Name:”為web工程起個名字,此處我們起名為 frist_Servlet 。將J2EE Specification Level選中 Java EE5.0 其他的不需要改變,默認就好了,單擊“Finish”按鈕,如圖 1-7 所示。
(4)對準創建好的web工程下的“src目錄右鍵” → 選擇“New” → 選擇“Class”,如圖1-8所示。

(5)在彈出的New Java Class對話框中的 “Name:”中輸入HelloWord,其他的不需改變,點擊“Finish”按鈕,如圖1-9所示。

(6)修改HelloWorld類的代碼,讓其繼承于javax.servlet.http.HttpServlet類,代碼如下:
2
3 import javax.servlet.http.HttpServlet;
4
5 public class HelloWorld extends HttpServlet{
6
7 }
8
注意:在web應用程序中要想使一個普通的Class類變成一個Serlvet 就必須讓這個普通類繼承與javax.servlet.http.HttpServlet類。
(7)讓HelloWorld重寫父類javax.servlet.http.HttpServlet中的“doGet” 方法,并輸出“HelloWorld”,具體代碼如下:
2 import javax.servlet.http.HttpServlet;
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5
6 public class HelloWorld extends HttpServlet {
7 @Override
8 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
9 throws ServletException, IOException {
10 System.out.println("HelloWorld");
11 }
12 }
13
(8)打開“WebRoot”目錄 → “WEB-INF” → “web.xml”文件,如圖所示。在打開的“web.xml”文件中配置 HelloWorld 。
2 <web-app version="2.5"
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
7 <servlet>
8 <servlet-name>helloWorld</servlet-name>
9 <servlet-class> com.study.struts.HelloWorld</servlet-class>
10 </servlet>
11 <servlet-mapping>
12 <servlet-name>helloWorld</servlet-name>
13 <url-pattern>*.do</url-pattern>
14 </servlet-mapping>
15 <welcome-file-list>
16 <welcome-file>index.jsp</welcome-file>
17 </welcome-file-list>
18 </web-app>
19
(9)打開“WebRoot”目錄中的“index.jsp”文件,并修改代碼如下:
2 <html>
3 <head>
4 <title>手工配置的第一個Servlet</title>
5 </head>
6 <body>
7 <a href="click.do">點擊測試Servlet程序</a>
8 </body>
9 </html>
10
注意:在“index.jsp”頁面第一句代碼中:
<%@ page language="java" pageEncoding="GB18030"%>
有一個pageEncoding 屬性,他表示當前jsp頁面的編碼格式,GB18030為編碼集,pageEncoding 屬性默認為ISO-8859-1編碼集,而ISO-8859-1編碼中是不支持中文字符的,換句話說也就是如果當前頁面pageEncoding="ISO-8859-1" 那么當前頁面中是不允許出現中文字符的,所以此處我們將pageEncoding的值改為“GB18030”。在Java編程中常見的編碼集有以下幾種:
編碼集名稱 |
是否支持中文 |
ISO-8859-1 |
不支持 |
UTF-8 |
支持 |
GB2312 |
支持 |
GBK |
支持 |
GB18030 |
支持 |
(10)部署應用程序,如圖1-11所示。

(11)運行web程序,如圖1-12所示,在 IE 瀏覽器地址欄輸入http://localhost:8080/frist_Servlet 如圖1-13所示。


由于我們在9步中寫過 <a href="click.do">點擊測試Servlet程序</a> 代碼當我們點擊超鏈接“點解測試Servlet程序”時,瀏覽器將會發出一個 click.do 的請求,此時web應用程序會接收到瀏覽器發出的click.do請求,因為我們在第8步中為web.xml配置過如下代碼:
2 <servlet-name>helloWorld</servlet-name>
3 <url-pattern>*.do</url-pattern>
4 </servlet-mapping>
5
6
其中 <url-pattern>*.do</url-pattern> 表示只要jsp頁面發出的所有以 .do 結尾的請求都會被攔截。攔截后的請求會自動找到 <servlet-name>helloWorld</servlet-name> 并取得到值 “helloWorld” ,并會帶著“helloWorld”值到下面這段代碼去尋找<servlet>的子標簽<servlet-name>的值和“helloWorld”相等的一項。
2 <servlet-name>helloWorld</servlet-name>
3 <servlet-class> com.study.struts.HelloWorld</servlet-class>
4 </servlet>
5
當請求被尋找到后程序會自動將請求跳轉到所對應的<servlet-class>標簽所配置的類中執行doGet 方法,調用流程如圖1-14所示。

程序最后會在Eclipse控制臺上打印“”,運行結果如圖1-15所示:
