- 零基礎學Struts
- 卜炟等編著
- 2607字
- 2019-04-24 11:12:48
1.2 MVC框架介紹
MVC框架是一些組織或企業基于MVC設計模式而開發出來的。目前比較流行的MVC框架有Struts 1、Struts 2及WebWork。這些框架除了很好地實現了MVC,還提供了大量的類庫供開發使用。
1.2.1 常用的MVC框架
下面來了解為什么要使用MVC框架。以前面編寫那個小項目為例,通過創建一個Servlet來接受用戶的參數,并通過調用業務邏輯組件來進行判斷。這樣的MVC設計肯定是可以的,但是隨著軟件行業的發展,許多組織以及企業發開出了基于MVC設計模式的MVC框架。開發人員不必自己來實現MVC設計模式,只需基于這類MVC框架之上進行開發。這些框架提供的功能可以減少開發人員的開發難度,增加開發效率,更重要的是這類框架提供了一種MVC設計的標準。以前大家肯定也學過MFC, MFC就是微軟的核心類庫,在開發程序時,用戶可以完全基于MFC這個類庫來進行開發,而不是完全自己去編寫每一個類。MVC框架已經實現好了MVC設計模式,只用在其上來開發就可以了。
目前常用的MVC框架非常多,其中廣泛應用的有Struts、WebWork,還有最新的Struts21-5等。下面來介紹一下Struts 1框架。
1.2.2 Struts 1框架簡介
Struts 1于2001年6月發布,是第一個發布的MVC框架。從發布至今一直深受廣大開發人員的擁護。其所擁有的開發人群也是其他MVC無法比擬的。
Struts 1通過核心控制器Action Servlet來接受用戶所有的請求,并將請求轉發給業務邏輯控制器。由業務邏輯控制器處理用戶請求,用戶請求處理完成后,業務邏輯控制器會根據業務邏輯將處理結果通過JSP的方式返回給用戶。
控制器是Struts 1的核心部分,包括核心控制器ActionServlet和業務邏輯控制器。其中ActionServlet由Struts 1框架提供,而業務邏輯控制器由開發人員根據特定的業務邏輯提供。下面是一個簡單的基于Struts 1開發的登錄案例流程圖,如圖1.9所示。

圖1.9 登錄案例程序執行流程
其中LoginAction為業務邏輯控制器,也就是由開發人員自行創建的。LoginForm是一個ActionForm, ActionForm用來封裝用戶的請求參數。ActionForm是一個普通的Java對象,它需要為用戶提交的每一個參數提供一個對應的屬性,并為每個屬性提供setter和getter方法。ActionForward可以理解為一個邏輯視圖名。
還有一個非常重要的文件就是Struts-config.xml配置文件,在該配置文件中可以配置業務邏輯控制器Action以及相應的ActionForm。邏輯視圖名和視圖資源之間的對應關系也是在該文件中定義。
1.2.3 下載并安裝Struts 1框架
Struts框架是由Apache開源組織開發并負責維護的,可以直接打開Struts的官方站點,這里只需要下載Struts框架,因此可以直接打開Apache的官方下載站點“http://people.apache.org/dist”,如圖1.10所示。
在該頁面里列出了所有Apache負責的項目。單擊其中的“struts”鏈接,頁面跳轉到Struts框架下載頁,如圖1.11所示。

圖1.10 Apache官方下載站點

圖1.11 Struts框架下載頁
這里選擇Struts 1.2.9版本,所以單擊“v1.2.9”鏈接,跳轉到Struts 1的1.2.9版本下載頁,如圖1.12所示。
該頁面中包含了許多的下載鏈接,大致歸類為3類:一類是“struts-1.2.9-src”,包含Struts框架的源代碼;一類是“struts-1.2.9-bin”,包含編譯后的文件;一類是“struts-1.2.9-lib”,包含的庫文件,這些庫文件在“struts-1.2.9-bin”中已經包含了。
其中gz是Linux、UNIX系統下的一種包格式,類似于Windows下的壓縮文件(如rar、zip)。這里單擊“struts-1.2.9-bin.zip”鏈接進行下載。下載完成后,解壓該文件,該文件結構如圖1.13所示。

圖1.12 Struts 1.2.9版本下載頁

圖1.13 文件結構
下面簡要介紹一下“struts-1.2.9-bin.zip”結構中的常用項。
? contrib:該文件夾中存放Struts 1表達式支持的類庫以及標簽庫文件。
? lib:該文件夾中存放Struts 1框架的核心類庫。
? webapps:該文件夾中存放Struts 1框架的示例程序以及文檔。
下面介紹如何在項目中安裝Struts 1框架。
安裝步驟如下。
(1)新建一個項目,將lib目錄下的全部jar文件復制到項目中的WEB-INF/lib下。
(2)將lib目錄下的全部TLD文件復制到WEB-INF下。
(3)將“validator-rules.xml”文件復制到WEB-INF下。
(4)如果需要使用EL表達式語言,就必須將contrib下的jar文件復制到WEB-INF/lib下。
(5)在編譯程序時,還必須將“struts.jar”文件增加到classpath環境變量中。
Struts 1框架已經安裝好了,下面通過Struts 1框架來改進以前那個登錄案例。
1.2.4 基于Struts 1框架實現登錄案例
其實使用Struts 1框架實現登錄案例非常簡單,將當時使用MVC設計模式改進后的代碼稍微修改,并增加一些Struts 1特有的配置和特性即可。下面來演示如何通過Struts 1框架來實現這個登錄案例。
步驟如下。
(1)新建Web項目,并通過上小節介紹的步驟安裝Struts 1框架。
(2)將前一項目中的“login.jsp”和“login_success.jsp”以及“login_failure.jsp”復制到項目中。
(3)配置“web.xml”文件,在該文件中配置Struts 1的核心控制器的名稱,配置Struts 1的核心控制器的實現類,配置Struts 1的初始化信息以及配置ActionServlet接受所有以“.do”結尾的請求,修改代碼如下。
<? xml version="1.0" encoding="UTF-8"? > <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <! --配置Struts 1的核心控制器的名稱--> <servlet-name>action</servlet-name> <! --配置Struts 1的核心控制器的實現類--> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <! --配置Struts 1的初始化信息--> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <! --配置ActionServlet接受所有以".do"結尾的請求--> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
注意
如果xml文件中使用中文(包括注釋),那么在xml中encoding必須定義為“gb2312”,或者使用“utf-8”的編碼格式來保存該文件。如使用EditPlus編寫該xml,則在保存文件時使用“utf-8”的編碼保存文件,如圖1.14所示。

圖1.14 設定文件編碼格式
(4)新建ActionForm,該ActionForm類名為LoginForm。LoginForm用來封裝用戶請求的參數,根據表單中的兩個參數“uname”和“upassword”,在LoginForm中必須定義setUname和setUPassword這兩個方法。Struts 1框架底層是通過這兩個方法將參數值設置到LoginForm的屬性上的,而不是通過LoginForm的屬性來設置值的。不過,一般情況下ActionForm中的屬性名稱還是定義為和用戶請求表單中的參數名相同,以便管理。
LoginForm中要為屬性添加setter和getter方法,但是它不是POJO(Plain Old Java Objects,普通Java對象)。它必須繼承Struts 1的ActionForm基類。LoginForm代碼如下。
package net.hncu.struts.form; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; public class LoginForm extends ActionForm { private String uname; private String upassword; //獲得uname值 public String getUname() { return uname; } //設置uname值 public void setUname(String uname) { this.uname = uname; } //獲得password值 public String getUpassword() { return upassword; } //設置password值 public void setUpassword(String upassword) { this.upassword = upassword; } }
(5)修改業務邏輯組件LoginCheck類,為該類定義包名,添加代碼如下所示。
package net.hncu. service;
(6)新建業務邏輯控制器Action,類名為LoginAction。LoginAction繼承Action,并包含一個execute方法。在該方法中獲得ActionForm的實例,其中封裝了用戶請求的參數。并調用業務邏輯組件處理登錄請求,根據返回結果調用不同的頁面來顯示登錄結果。LoginAction代碼如下所示。
package net.hncu.struts.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.hncu.service.LoginCheck; import net.hncu.struts.form.LoginForm; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //獲得ActionForm的實例,其中封裝了用戶請求的參數 LoginForm loginForm = (LoginForm)form; //取得用戶請求的參數 String name = loginForm.getUname(); String password = loginForm.getUpassword(); //new一個LoginCheck對象 LoginCheck lc = new LoginCheck(); //調用業務邏輯組件的判斷功能來判斷 if(lc.isLogin(name, password)){ //如果為合法用戶,在request范圍中添加屬性login,其屬性值為true,并設定跳轉的邏輯 視圖為"success"的頁面 request.setAttribute("login", "true"); return mapping.findForward("success"); }else{ //并設定跳轉的邏輯視圖為"failure"的頁面 return mapping.findForward("failure"); } }
(7)編譯業務邏輯控制器LoginAction、LoginForm以及業務邏輯組件LoginCheck。并將編譯后的class文件(包括完整的包名)放入項目的WEB-INF文件夾下的classes文件夾中。
(8)在Web項目的WEB-INF目錄下新建“struts-config.xml”文件,該文件用來配置Action、ActionForm以及邏輯視圖和視圖資源之間的映射關系。“struts-config.xml”代碼如下所示。
<? xml version="1.0" encoding="UTF-8"? > <! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <! --Struts 1配置文件的根元素--> <struts-config> <! --配置ActionForm,所有ActionFrom都必須定義在form-beans元素中--> <form-beans > <! --通過form-bean元素定義ActionForm,其中name屬性指定ActionForm的名稱, type屬性指定ActionForm的實現類--> <form-bean name="loginForm" type="net.hncu.struts.form.LoginForm" /> </form-beans> <! --配置Action,所有Action都必須定義在action-mapping元素中--> <action-mappings > <! --通過action元素定義Action,其中path屬性指定處理的URL, type屬性用來指定Action的實現類, name屬性用來指定對應的ActionForm的名稱,scope屬性用來指定ActionForm存放的屬性范圍--> <action path="/login" type="net.hncu.struts.action.LoginAction" name="loginForm" scope="request" > <! --定義邏輯視圖success,對應的jsp頁面為"login_success.jsp"--> <forward name="success" path="/login_success.jsp"></forward> <! --定義邏輯視圖failure,對應的jsp頁面為login_failure.jsp--> <forward name="failure" path="/login_failure.jsp"></forward> </action> </action-mappings> </struts-config>
(9)修改“login.jsp”,修改頁面提交頁,使頁面提交到“login.do”。
<form action="login.do" method="post">
(10)部署該項目。打開Tomcat安裝目錄下的conf文件夾下的“server.xml”文件。在文件的最下面的“</host>”標簽之前添加如下代碼。
<Context path="/03"docBase="E:\BookDemo\ch01\03"reloadable="true"crossContext="true"> </Context>
- 深入淺出Java虛擬機:JVM原理與實戰
- Vue.js 2 and Bootstrap 4 Web Development
- Vue.js快跑:構建觸手可及的高性能Web應用
- 編寫高質量代碼:改善Python程序的91個建議
- 人臉識別原理及算法:動態人臉識別系統研究
- Object-Oriented JavaScript(Second Edition)
- Python GUI Programming Cookbook
- 速學Python:程序設計從入門到進階
- Kubernetes源碼剖析
- Python開發基礎
- 零基礎輕松學C++:青少年趣味編程(全彩版)
- Mastering JavaScript
- 計算機組裝與維護(第二版)
- 從零開始構建深度前饋神經網絡:Python+TensorFlow 2.x
- Python全棧開發:數據分析