官术网_书友最值得收藏!

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>
主站蜘蛛池模板: 同心县| 嘉黎县| 阿城市| 东丰县| 安福县| 揭东县| 浙江省| 肃南| 丽水市| 柳江县| 鹿泉市| 阿坝县| 南昌县| 乌鲁木齐市| 本溪| 武功县| 灵川县| 宁阳县| 张北县| 乌鲁木齐县| 巴彦淖尔市| 荥经县| 晋中市| 武穴市| 阜宁县| 清新县| 兴仁县| 儋州市| 阿拉尔市| 太白县| 五华县| 上饶县| 柳州市| 龙井市| 玛多县| 阜宁县| 鞍山市| 弋阳县| 柘荣县| 濉溪县| 仪陇县|