Jakarta Struts Framework 是一個開放源代碼的 Apache 項目,由 Craig R. McClanahan 於 2000 年建立,並捐贈給了 Apache 基金會,已經成爲基於 Java Servlet 和 Java Server Page (JSP)技術構建 Web 應用程序的最流行的框架包。 Craig 編寫了 Tomcat4 實現的大部份內容,同時他仍是 JCP 的資深成員,負責 Servlet 和 JSP 規範的制定。html
Struts 是一個基於模型 (Model) -視圖 (View) -控制器 (Controller)(MVC) 模式的應用架構的開源框架。若是您開發過大型 Web 應用程序,您就理解變化這個詞的含義。「模型 - 視圖 - 控制器」 (MVC) 就是用來幫助您控制變化的一種設計模式。 MVC 減弱了業務邏輯接口和數據接口之間的耦合。java
JSP 頁面中能夠很是容易地結合業務邏輯 (jsp:useBean) 、服務端處理過程( jsp:scriplet )和 HTML(<html>) ,在 JSP 頁面中同時實現顯示,業務邏輯和流程控制,從而能夠快速地完成應用開發。如今不少的 Web 應用就是由一組 JSP 頁面構成的。這種以 JSP 爲中心的開發模型咱們能夠稱之爲 Model 1 。固然這種開發模式在進行快速和小規模的應用開發時,是有很是大的優點,可是從工程化的角度考慮,它也有一些不足之處,主要在於不方便應用擴展,以及不利 於應用系統業務的重用和改動。考慮到這些問題在開發大型的 Web 應用時必須採用不一樣的設計模式——這就是 Model2 。web
Model 2 表示的是基於 MVC 模式的框架。 "Model" 表明的是應用的業務邏輯(經過 JavaBean , EJB 組件實現), "View" 是應用的表示面(由 JSP 頁面產生), "Controller" 是提供應用的處理過程控制(通常是一個 Servlet ),經過這種設計模型把應用邏輯,處理過程和顯示邏輯分紅不一樣的組件實現,這些組件能夠進行交互和重用。 Model 2 具備組件化的優勢從而更易於實現對大規模系統的開發和管理。apache
Struts 是一組相互協做的類、 Servlet 和 JSP 標記,它們組成一個可重用的 MVC 2 設計。這個定義表示 Struts 是一個框架,而不是一個庫,但 Struts 也包含了豐富的標記庫和獨立於該框架工做的實用程序類庫。 Struts 利用 taglib 得到可重用代碼和抽象 Java 代碼,利用 ActionServlet 配合 Struts-config.xml 實現對整個系統導航。加強了開發人員對系統的總體把握,提升了系統的可維護性和可擴充性。後端
Struts 是一個 Web Framework ,常見的 B/S Web Framework 以下:設計模式
Struts :主要關注於 Controller 流程,基於 JSP與 Taglib 實現的 View 。架構
Cocoon :用於處理 XML 的框架,將 XML 做爲 View 並能夠良好結合 XSLT 。app
Spring :這是一個服務於全部層面的 Application Framework ,提供了 bean 的配置基礎, AOP 的支持, JDBC 的提框架
取框架,抽象事務支持等。它有一個很是顯著的特色:在某個層面上若是你不須要 Spring 的支持,你就能夠jsp
不使用 String 的 class ,只使用它的某一部分的功能。
JSF :JavaServerFaces ,嚴格意義上講,它並不算是 Framework ,但 JSF 一樣提供了一種不一樣的 View 生成方式。
它能夠和多種 Framework 整合。在 J2EE1.4 中, JSP2.0 規範就包含了 JSF 標準。
Framework 有不少種, Struts 並非咱們惟一的選擇。咱們能夠根據具體的項目來選擇不一樣的 Framework 。 Struts 之因此如此流行,其主要緣由是它推出時間比較早,版本較穩定,而且是 MVC 及 core J2EE patterns 的標準實現。
Struts 師出名門,擁有諸多優勢,其中最關鍵的一點就是簡單易用,這也是正他迅速普及,愈來愈流行的根本緣由。與其同時代的 Tubine 、 Cocoon 等,均可以做爲 Web 框架,功能也很強大,但使用起來過於複雜,一直難以流行。做爲一名普通的 Java 開發者,只要稍具 JSP 開發水平,均可以在一週左右的時間內,基本學會 Struts 。
Struts 還提供了豐富的 Taglib ,熟練用之,將節省大量的開發時間。
Struts 具備良好的頁面導航功能,開發者能夠經過一個名爲 struts-config.xml 的文件,把握整個系統各部分之間的聯繫,這對於後期維護有着莫大的幫助,尤爲是當另外一批開發者接手該項目時,這種優點體現得更加明顯。
固然, Struts 也有一些不足之處。對於很大的項目,當 struts-config.xml 愈來愈龐大時,維護也就變得愈來愈複雜,甚至須要專人負責(對於這種維護狀況,建議採用專門的維護工具,如 Struts Console )。另外, Struts 框架主要是針對表示層設計的,對於後端的邏輯層支持不是很強。
未來的發展趨勢,頗有多是 JSF+Struts+Spring+Hibernate/JDO 的開發模式,建議你從 Struts 入手。
話很少說開始入門
web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>StrutsDemo</display-name> <!-- struts2框架的核心控制器,用戶對本程序的全部請求都先交給 StrutsPrepareAndExecuteFilter核心控制器進行處理 核心控制器就是根據struts.xml的文件來決定具體使用什麼業務邏輯控制器處理本次請求 --> <filter> <filter-name>struts</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <!-- 表示接收全部請求 --> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
這個是struts的模塊配置,他被struts.xml include放進模塊 hr-user.xml,不少公司都是模塊式開發,因此我也用模塊是開發 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hr" extends="struts-default" namespace="/"> <action name="user" class="org.heinrich.action.UserAction"> <result name="success">/success.jsp</result> </action> </package> </struts>
這個是struts的全局配置,在這個xml中的全部配置,在其餘的模塊中均可以用至關於定義了全局變量,在其餘模塊中的就是局部變量 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 在struts.xml文件中一般是配置一下模塊的引入配置和公共配置 公共的常量配置能夠參考struts2-core-2.3.15.1.jar中的default.properties文件中配置 --> <!-- 配置本項目容許的請求後綴 --> <constant name="struts.action.extension" value="action,do,,"/> <!-- 配置本工程是開發模式(會熱部署) --> <constant name="struts.devMode" value="true"/> <!-- 開啓動態方法調用,默認是開啓狀態 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"/> <!-- 爲了方便團隊分模塊開發,一般建議將不一樣的模塊的包(package)對應的單獨的文件中 而後使用include 標籤導入的struts.xml文件中 --> <include file="hr-user.xml"/> </struts>
UserAction 的配置
package org.heinrich.action; import org.heinrich.dao.UserDao; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private static final long serialVersionUID = 6161139006224338587L; private String key; private String value; public String add() { System.out.println("I am reading Book about Linux"); UserDao userDao = new UserDao(); userDao.add(key, value); return "success"; } public String delete() { System.out.println("I am reading Book about Linux"); UserDao userDao = new UserDao(); userDao.delete(key); return "success"; } public String update() { System.out.println("I am reading Book about Linux"); UserDao userDao = new UserDao(); userDao.update(key, value); return "success"; } public String get() { System.out.println("I am reading Book about Linux"); UserDao userDao = new UserDao(); String name = userDao.get(key); System.out.println(name); return "success"; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
定義了CURD四個方法,全部方法都採用
http://localhost:8080/Struts/user!add?key="color"&value="bule"
http://localhost:8080/Struts/user!delete?key="null"
http://localhost:8080/Struts/user!update?key="color"&value="red"
http://localhost:8080/Struts/user!update?key="color"
這種模式進行訪問,這樣能夠省去不少代碼,固然你也能夠有其餘的方式,好比動態方法調用,那樣須要修改局部的hr-user.xml的代碼
如今我配置給你們看 http://localhost:8080/Struts/user_add?key="color"&value="bule" http://localhost:8080/Struts/user_delete?key="null" http://localhost:8080/Struts/user_update?key="color"&value="red" http://localhost:8080/Struts/user_update?key="color"
hr-user.xml的配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hr" extends="struts-default" namespace="/"> <action name="user_*" class="org.heinrich.action.UserAction" method="{1}"> <result name="success">/success.jsp</result> </action> </package> </struts>
其實還有不少中配置方式,最簡單的方式就是
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hr" extends="struts-default" namespace="/"> <action name="add" class="org.heinrich.action.UserAction" method="add"> <result name="success">/success.jsp</result> </action> <action name="delete" class="org.heinrich.action.UserAction" method="delete"> <result name="success">/success.jsp</result> </action> <action name="update" class="org.heinrich.action.UserAction" method="update"> <result name="success">/success.jsp</result> </action> <action name="get" class="org.heinrich.action.UserAction" method="get"> <result name="success">/success.jsp</result> </action> </package> </struts>
請求URL是
http://localhost:8080/Struts/add?key="color"&value="bule" http://localhost:8080/Struts/delete?key="null" http://localhost:8080/Struts/update?key="color"&value="red" http://localhost:8080/Struts/update?key="color"
這個看起來是否是不少,可是他是最簡單的,每一個方法對應一個action,因此說公司不少都是用第一種或者第二種
下次我會寫關於Struts2怎麼接收請求參數,和獲取Request的幾個方式,和Struts2底層運行的狀況,帶你們Review一次源代碼,
求關注,求轉發