分布式企業應用軟件結構復雜、涉及多種技術,對設計開發人員提出了很高的要求。在此情況下,運用設計模式――可復用的設計方案進行軟件的設計開發十分必要。MVC模式已被證明是一種成功的軟件設計模式,本文主要討論了一種實現MVC模式的應用框架――Struts,並通過一個實例展示了Struts框架實現MVC模式的方法。
MVC設計模式
MVC(Modle-View-Controller,模型-視圖-控制器)模式是Xerox PARC在20世紀80年代為編程語言Smalltalk-80所設計的一種軟件設計模式,至今已被廣泛使用,並被推薦為Sun公司J2EE平台的設計模式,其為開發交互式應用系統提供了一個優秀的設計模式,受到越來越多開發者的歡迎。
MVC模式主要由3個部分組成:模型、視圖和控制器,其結構如圖1所示。
圖1 MVC模式框架
模型表示業務邏輯和業務規則等,在MVC的三個部件中擁有最多的處理任務。它可以用JavaBean和EJB等組件技術來處理數據庫的訪問。模型能為多個視圖提供數據。由於應用於模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性。
視圖是屏幕上的顯示。模型進行操作之後,其結果就是通過視圖來顯示的。在視圖中其實沒有真正的處理發生,只是作為一種輸出數據並允許用戶操作的方式。
控制器用於管理用戶與視圖發生的交互。一旦用戶想對模型進行處理時,它不能直接去執行模型,而是通過控制器來間接地實現。控制器能從視圖中取值,然後將相應的值傳給模型進行處理。控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求。
由上述可知,MVC模式的處理過程是:首先由控制器接收用戶的請求,並決定應該調用哪個模型來進行處理,然後模型用業務邏輯來處理用戶的請求並返回數據,最後控制器用相應的視圖返回數據,並通過表達層呈現給用戶。
MVC本身就是一個非常復雜的系統,所以采用MVC實現Web應用時,最好選一個現成的MVC框架,在此之下進行開發,從而取得事半功倍的效果。現在有很多可供使用的MVC框架,由於Struts有完整的文檔並且相對來講比較簡單,所以用它開發MVC系統還是比較方便地。
Struts框架
Struts是Apache組織的一個開放源碼項目。Struts是一個比較好的MVC框架,提供了對開發MVC系統的底層支持,它采用的主要技術是Servlet,JSP和Custom tag library。其基本構成如圖2所示。
圖2 Struts框架圖
由圖2可以看出,在Struts框架中Controller功能由ActionServlet和ActionMapping對象構成,核心是一個Servlet類型的對象ActionServlet,它用來接受客戶端的請求。ActionServlet包括一組基於配置的ActionMapping對象,每個ActionMapping對象實現了一個請求到一個具體的Model部分中Action處理器對象之間的映射。
Model部分由Action和ActionForm對象構成。所有的Action處理器對象都是開發者從Struts的Action類派生的子類。Action處理器對象封裝了具體的處理邏輯,調用業務邏輯模塊,並且把響應提交到合適的View組件以產生響應。Struts提供的ActionForm組件對象可以通過定義屬性描述客戶端表單數據。開發者可以從它派生子類對象,利用它和Struts提供的自定義標記庫結合可以實現對客戶端的表單數據的良好封裝和支持,Action處理器對象可以直接對它進行讀寫,而不再需要和request、response對象進行數據交互。通過ActionForm組件對象實現了對View和Model之間交互的支持。
View部分是通過JSP技術實現的。Struts提供了自定義的標記庫,通過這些自定義標記可以非常好地和系統的Model部分交互,通過使用這些自定義標記創建的JSP表單,可以實現和Model部分中的ActionForm的映射,完成對用戶數據的封裝。
基於MVC模式的Struts框架的應用
下面通過一個具體實例說明如何應用Struts框架構建應用程序。該實例是一個全面預算管理系統中的預算資料模塊,包括資料錄入、資料查詢、資料修改和資料刪除四個功能,用於完成預算資料的錄入、查詢、修改及刪除。
具體在使用Struts框架時,對應各個部分的開發工作主要包括:
1、構建視圖
在Struts框架中,視圖的實現主要采用JSP技術,但與傳統的JSP相比有兩個顯著的不同。
首先,在Struts下使用JSP開發視圖,在頁面中沒有包含任何的腳本程序,只是單純的完成數據傳送以及接收和顯示返回的數據。對數據的處理以及頁面的跳轉都在業務層中來實現。這樣做實現了業務邏輯和表示邏輯的完全分離,提高了一個應用程序的性能和可擴展性,並有利於程序的復用。
第二,Struts框架提供了一組可擴展的自定義標記庫,主要包括: Bean標記、 Logic標記、HTML標記和模板標記。通過使用標記,可以簡化創建用戶界面的過程,並且更好地實現數據的封裝。通過使用這些自定義標記創建的JSP表單,可以實現和業務層中的ActionForm的映射,非常好地和系統的業務邏輯部分交互。
下面給出資料錄入頁面的部分實現代碼:
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html>
<head>
<title>
前期准備資料錄入
</title>
<link rel="stylesheet" type="text/css" href="../images/mobile.css">
</head>
<body bgcolor="#ffffff">
<html:form action="/information/budgetinfoadd" enctype="multipart/form-data">
<table width="95%" border="1" cellspacing="1" cellpadding="2" bordercolor="#CBE7F8" align="center">
<tr bgcolor="#F2F9FD">
<td width="20%">類型:</td>
<td>
<html:select property="infoType" styleClass="input2">
<html:options collection="TypeList" property="id" labelProperty="typeName"/>
</html:select>
</td>
</tr>
……
</table>
</html:form>
</body>
</html>
程序中首先引入了HTML、Bean和Logic標記庫,然後用action指出調用的Action組件的絕對路徑,標記<html:form>和</html:form>封裝了表單數據,在業務層中用相應的ActionForm組件可以將輸入的數據全部得到。
可以看出在視圖中沒有進行任何的業務邏輯的處理,其主要作用是給出客戶端顯示的信息和處理結果,以及請求的轉發,它是和用戶交互的接口。
2、構建模型
模型采用JavaBean和EJB組件,設計和實現系統的業務邏輯。根據不同的請求從Action派生具體Action處理對象,完成“做什麼”的任務來調用由Bean構成的業務組件,創建由ActionForm 的派生類實現對客戶端表單數據的封裝。
下面以BudgetInfoAddForm這個ActionForm Bean進行說明:
……
public final class BudgetInfoAddForm extends ActionForm {
private String infoType;
private String title;
private String content;
private FormFile infoFile;
這裡表示BudgetInfoAddForm繼承於ActionForm,在這個Bean中定義了視圖中所要顯示數據信息的參數,包括infoType,資料分類;title,資料標題;content,資料內容;infoFile, 資料文件。同時在BudgetInfoAddForm中提供了設定和訪問這些參數的方法:
public String getInfoType()
public void setInfoType(String infoType)
public String getTitle()
public void setTitle(String title)
public String getContent()
public void setContent(String content)
public FormFile getInfoFile()
public void setInfoFile(FormFile infoFile)
public void reset(ActionMapping mapping, HttpServletRequest request) {
title = null;
content = null;
infoFile = null;
}
3、構建控制器
在Struts應用框架中,中心控制器(ActionServlet)是由Struts框架本身所提供,開發人員一般無須對該ActionServlet進行再次開發;負責具體業務處理的Action類則是開發者開發實現的重點,在這些Action對象中會進行所有的業務操作,處理完畢,由Struts的ActionServlet轉向到jsp頁面,將處理結果返回給客戶端。
在預算資料模塊中,實現了四個Action:BudgetInfoAddAction,用於資料錄入; BudgetInfoContentAction,用於資料查詢; BudgetInfoUpdateAction,用於資料修改;BudgetInfoDelAction,用於資料刪除。
4、建立配置文件
Struts框架中有兩個配置文件web.xml和struts-config.xml,用於配置Struts系統中的各個模塊之間的交互。通過對這兩個配置文件的配置,把Struts框架中MVC的各個部分聯系起來,實現了一個真正的MVC系統。
結束語
Struts是一種基於MVC設計模式的企業級Web應用開發框架,它的設計目的是從整體上減輕構造企業Web應用的負擔。其自帶的標記庫,能大大提高開發效率,同時提高了系統的可維護性和可擴充性。本文在總結Struts框架技術及其工作原理的基礎上給出了一個應用實例,為今後更好的應用Struts框架開發Web應用程序提供了參考。