Struts——開源MVC框架

  【簡介】   

   Struts是Apache軟件基金會(ASF)贊助的一個開源項目。它最初是Jakarta項目中的一個子項目,並在2004年3月成爲ASF的頂級項目。它通過採用Java Servlet/JSP技術,實現了基於Java EE Web應用的Model-View-Controller〔MVC〕設計模式的應用框架〔Web Framework〕,是MVC經典設計模式中的一個經典產品。struts是一個基於javaee平臺的mvc框架,他是屬於一個表現層的開發框架,框架是一個模板,模板是一個半成品,自己本身是不能正常運行的。

   Struts最早是作爲Apache Jakarta項目的組成部分,項目的創立者希望通過對該項目的研究,改進和提高JavaServer Pages 、Servlet、標籤庫以及面嚮對象的技術水準。Struts這個名字來源於在建築和舊式飛機中使用的支持金屬架。這個框架之所以叫"Struts",是爲了提醒我們記住那些支撐我們房屋,建築,橋樑,甚至我們踩高蹺時候的基礎支撐。這也是一個解釋Struts在開發Web應用程序中所扮演的角色的精彩描述。當建立一個物理建築時,建築工程師使用支柱爲建築的每一層提供支持。同樣,軟件工程師使用Struts爲業務應用的每一層提供支持。它的目的是爲了幫助我們減少在運用MVC設計模型來開發Web應用的時間。我們仍然需要學習和應用該架構,不過它將可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的優點來建立可擴展的應用,Struts是一個不錯的選擇。

   Struts是Apache 基金會Jakarta 項目組的一個Open Source 項目,它採用MVC模式,能夠很好地幫助java 開發者利用J2EE開發Web應用。和其他的java架構一樣,Struts 也是面向對象設計,將MVC模式"分離顯示邏輯和業務邏輯"的能力發揮得淋漓盡致。Structs 框架的核心是一個彈性的控制層,基於如 Java Servlets,JavaBeans,ResourceBundles與XML等標準技術,以及 Jakarta Commons 的一些類庫。Struts由一組相互協作的類(組件)、Servlet以及jsp tag lib組成。基於struts構架的web應用程序基本上符合JSP Model2的設計標準,可以說是一個傳統 MVC設計模式的一種變化類型。

   【框架】

   struts是在jsp Model2的基礎上實現的一個MVC框架,具有組件的模塊化,靈活性和重用性的優點,同時簡化了基於MVC的web應用程序的開發。struts可以清晰地區分控制,事務邏輯和外觀,從而簡化了開發應用程序的過程。

   Struts對Model,View和Controller都提供了對應的組件。

   模型:JavaBean,EJB組件。

   視圖:Jsp,struts客戶化標籤。

   控制器:ActionServlet,Action。

      

   流程:web客戶端發出請求(request),ActionServlet系統核心(中央)控制器截取相關URL,通過struts-config.xml配置文件分發(dispatch)給不同的Action進行處理,Action調用model返回,將轉向的信息轉給ActionServlet,再轉給視圖(jsp)顯示到客戶端。

  具體流程:

   1、服務器啓動,Web應用啓動時就會加載web.xml初始化actionServlet和記載struts配置文件(struts-config.xml),讀配置信息到內存中,供以後action調用
   2、用戶通過客戶端向服務器發出一個請求,http://localhost:8080/struts_login/login.do 
   3、tomcat會創建出HttpRequest和HttpResponse實例,並根據用戶的Method請求方式,調用中央控制器的doGet或者doPost方法;
   我們已經在web.xml配置了所有符合某特定格式的請求都將由struts指定的Servlet來處理。比如:只要是以.do結尾的請求(*.do)都由 org.apache.struts.action.ActionServlet來對其進行處理.ActionServlet會拿到用戶的請求,並且去分析這個URL,ActionServlet中央控制器會截下 /login. 截下來之後,它是爲了去struts-config.xml這個配置文件裏面找<action>標籤path屬性的值等於所截部分的那個 Action,將Action標籤裏面的信息放在ActionMapping裏面。
   4、根據ActionMapping中的name名稱查找ActionForm,如果配置了ActionForm,那麼就到request或session中查找,如果在request或session中存在已經創建的ActionForm,那麼將返回;如果不存在,那麼會根據ActionForm的完成路徑採用反射進行創建,再將創建好的ActionForm放到reqeust或session中
   5、首先執行ActionForm中的reset方法進行重置,然後得到表單中所有輸入域的name名稱,再調用request.getParameterValues(),根據name名稱得到相應的值,最後將表單中的數據全部放到一個map中,map中的key爲表單輸入域的名稱,map的value位表單輸入域的值(字符串數組),接下來調用一個第三方組件BeanUtils,將Map中的值,根據ActionForm中的setter方法設置到ActionForm上。
   6、根據Action的完成類名稱到Map中查找,如果存在就在返回Action對象,否則根據Action類的完整名稱採用反射去創建,再將創建好的Action放到Map中。所以struts1的Action是單實例的,存在線程安全問題。找到對應的action之後,ActionServlet會把表單提交的數據給存放(生成對應調用 set/get方法)到struts-config中相應的action標籤的name屬性值指定的actionform類中(若有, [actionform的子類,並且在form-bean標籤中配置了,若要進行數據驗證可以在actionform中覆蓋validate方法,推薦使用js,減輕服務器負擔]).同時把actionform和當前HttpServletrequest 對象注入到代調用的action方法中.
   7、執行用戶自定義的Action中的Execute方法,將ActionMapping,ActionForm,request,response傳遞過去,將ActionForward返回給ActionServlet。
   8、根據返回的ActionForward完成轉向,ActionForward對象根據此action配置的<forward>匹配name進而調轉到對應path的jsp頁面上。

   Model部分

 由JavaBean組成,ActionForm用於封裝用戶的請求參數,封裝成ActionForm對象,該對象被ActionServlet轉發給Action,Action根據ActionForm裏面的請求參數處理用戶的請求。JavaBean則封裝了底層的業務邏輯,包括數據庫訪問等。

   View部分

   該部分採用JSP實現,對應上圖的JSP部分。Struts提供了豐富的標籤庫,通過標籤庫可以減少腳本的使用,自定義的標籤庫可以實現與Model的有效交互,並增加了現實功能。

   Controller組件有兩個部分組成——系統核心控制器(ActionServlet),業務邏輯控制器(Action)。

   系統核心控制器,對應上圖的ActionServlet。該控制器由Struts框架提供,繼承HttpServlet類,因此可以配置成標註的Servlet。該控制器負責攔截所有的HTTP請求,然後根據用戶請求決定是否要轉給業務邏輯控制器。

   業務邏輯控制器,對應上圖的Action部分。負責處理用戶請求,本身不具備處理能力,而是調用Model來完成處理。

   【實現】

   1、Struts只能應用於web項目,建立Web projcet項目

   2、配置Struts

     a.拷貝struts相關的jar到WEB-INF/lib下

     b.在web.xml文件中配置ActionServlet

     c.提供struts-config.xml(核心配置文件),需要放到WEB-INF下

     

    具體配置過程:

     a.找到相關jar,直接拷貝到WEB-INF/lib下即可。

     b.在web.xml文件中配置ActionServlet

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
      <servlet-name>action</servlet-name>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
      <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>2</param-value>
      </init-param>
      <init-param>
          <param-name>detail</param-name>
          <param-value>2</param-value>
      </init-param>
      <load-on-startup>2</load-on-startup>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.action</url-pattern>
  </servlet-mapping>
</web-app>
     c.提供struts-config.xml文件,放到WEB-INF下

<?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-config>

</struts-config>   
   3、新建jsp頁面,設置頁面信息

   4、在src下建立包和相關類(要繼承struts相關類)

     a.ActionForm類:定義頁面值,get,set方法(這個類需要繼承struts.action)

        注意: * 表單的屬性必須和ActionForm中的get和set的屬性一樣
     b.建立一個action類(必須繼承struts.action),需要重寫(override)execute方法()

       注意:Action中的代碼:這些值如何在前臺獲取

   

     前臺jsp通過EL表達式可以獲取後臺數值

   

   5、通過配置struts-config.xml文件將所有流程串起來

  

   【小結】

    Struts1、Struts2、SpringMVC都是對MVC模式的實現,下次要一起研究一下。Struts1的Action與SpringMVC的Controller一樣,都是單例的,不是線程安全的。這就意味着,每個Request請求,系統都會用原有的instance去處理。這雖然減少了對象的創建和垃圾收集的時間,但是處理多線程調用時,Controller不是線程安全的,而Struts2是線程安全的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章