解決在斷網環境下,配置文件無提示的問題 咱們能夠看到Struts.xml在斷網的狀況下,前面有一個歎號,這時,咱們按alt+/ 沒有提示,這是由於」 http://struts.apache.org/dtds/struts-2.0.dtd」是一個網絡地址,若是上網的話,IDE會自動幫咱們下載此文件,若是斷網就沒有辦法了,可是咱們仍是有解決方法的. 首先在源碼包裏找到struts-2.0.dtd這個文件 在MyEclipse中菜單欄中選擇:windowPreferencesMyEclipseFiles and Editors Xmlxml Catalog在右邊的下拉框中選擇User Specified Entries點擊Add按鈕左邊選中Catalog Entry右邊的location中點擊File System在彈出的對話框中將搜索到的文件全路徑複製上去,並選中struts-2.0.dtd在key type下拉框中選擇URIkey文本框中填寫: http://struts.apache.org/dtds/struts-2.0.dtd ,點擊OK便可. 這時咱們能夠看到Struts.xml文件中還有歎號,咱們能夠在Struts標籤與package標籤中打入一個回車後保存便可. 首先,咱們先配置一個HelloWorld程序 環境的搭建和前面講的如出一轍,導6個jar包,複製struts.xml文件到src目錄下,改寫web.xml文件,將struts整合到web工程中,這裏就再也不演示 如下是代碼: Chapter1Action package chapter1.action; public class Chapter1Action { private String message; public String getMessage() { return message; } public String execute() { message = "個人第一個Struts2程序"; return "success"; } } Struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <constant name="struts.devMode" value="false"/> <constant name="struts.i18n.encoding" value="UTF-8"/> <constant name="struts.serve.static.browserCache" value="false"/> <include file="chapter1.xml"/> </struts> chapter1.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="chapter1" namespace="/chapter1" extends="struts-default"> <action name="HelloWorld" class="chapter1.action.Chapter1Action" method="execute"> <result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result> </action> </package> </struts> HelloWorld.jsp <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>HelloWorld</title> </head> <body> ${message} </body> </html> 問題一:你們能夠看到這裏用到了EL表達式,咱們知道EL表達式只能取出page,request,session,application四個範圍之一里面的數據,可是我這裏並無將任何數據放入到四個範圍中,爲何這裏可以取出數據來呢? 問題二: Chapter1Action是一個很是普通的類,它不是Servlet,爲何可以處理用戶的請求呢? Struts2用於處理用戶請求的Action,沒有與Servlet API耦合,顯示沒法處理用戶請求,而Struts2提供了系列攔截器,該系列攔截器負責將HttpServletRequest請求中的請求參數解析出來,傳入到Action中,並調用Action的execute方法來處理用戶的請求. Struts.xml配置中包與action的介紹 <package name="chapter1" namespace="/chapter1" extends="struts-default"> <action name="HelloWorld" class="chapter1.action.Chapter1Action" method="execute"> <result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result> </action> </package> Struts2框架中使用包來管理action,避免了Servlet在web.xml中難以管理的與維護的局面.包的做用和java中的類包是很是相似的,它主要用於管理一組業務功能相關的action,在實際應用中,咱們應該把一組業務功能相關的action 放在同一個包下. 配置包時必須指定name屬性,該name屬性值能夠任意取名,但必須惟一,若是其餘包要繼承該包,必須經過該屬性進行引用,包的namespace屬性用於定義該包的命名空間,命名空間做用爲訪問該包下的action路徑的一部分,見示例.namespace屬性能夠不配置,若是不指定該屬性,默認的命名空間爲」」 一般每一個包都應該繼承struts-default包,由於struts2不少核心功能都是攔截來實現的,如,從請求中把請求參數封閉到action,文件上傳和數據驗證等都是經過攔截器實現的,struts-default定義了這些攔截器和Result類型,能夠這麼說,當包繼承了struts-default才能使用struts2提供的核心功能,struts-default包是在struts2-core-2.xx.jar文件中的struts-defalut.xml中定義,struts-default.xml也是struts2默認配置文件,struts2每次都會自動加載struts-default.xml文件. package還有一個abstract=」true」屬性,指定此包爲抽象包,和抽象類的概念差很少,說明此包只能被其餘包繼承,則它裏面不容許包含action元素. <action name="HelloWorld" class="chapter1.action.Chapter1Action" method="execute"> <result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result> </action> Action 元素method屬性,默認值爲method=」execute」,也就是當action接收到請求後,交給哪一個方法去處理,默認的是交給execute方法去處理,固然,也能夠交給其餘方法,後面會講解到. <result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result> result元素主要定義視圖的跳轉和返回的行爲及類型,後面會詳細介紹. struts.xml文件的分離 從上一個項目實踐中能夠看到,咱們的web.xml文件很是之大,到後來是愈來愈難的查找與維護,看得頭都是大的,Struts2配置文件能夠分離,很好的解決了此問題. 經過主次配置文件的分離,能夠增強團隊間的合做,而且互不打擾彼此的配置文件,出了問題也知道責任在哪裏. 在實例開發中也是這樣作的,經過一個主文件中,打開全局開關,引入其餘子配置文件,如: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <constant name="struts.devMode" value="false"/> <constant name="struts.i18n.encoding" value="UTF-8"/> <constant name="struts.serve.static.browserCache " value="false"/> <include file="chapter1.xml"/> </struts> 經常使用開關的介紹 <constant name="struts.i18n.encoding" value="UTF-8"/> 指定Web應用的默認編碼集,至關於調用HttpServletRequest的setCharacterEncoding方法 <constant name="struts.action.extension" value="do"/> 該屬性指定須要Struts 2處理的請求後綴,該屬性的默認值是action,即全部匹配*.action的請求都由Struts 2處理。 若是用戶須要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開。 <constant name="struts.serve.static.browserCache " value="false"/> 設置瀏覽器是否緩存靜態內容,默認值爲true,開發階段最好false <constant name="struts.configuration.xml.reload" value="true"/> 當struts的配置文件修改後,系統是否自動從新加載該文件,默認值爲false,開發階段最好true <constant name="struts.devMode" value="true"/> 開發模式下設爲true,這樣能夠打印出更詳細的錯誤信息 <constant name="struts.enable.DynamicMethodInvocation" value="false"/> 動態方法調用,能夠解決多個請求對應一個Servlet的問題,後面詳細講解,默認爲true,關閉則設爲false. 這裏只是列舉了一些經常使用的開關,固然還有許多其餘的開關,後面的學習中會逐漸介紹,你們在這裏先了解一下. 如下是從網上摘得的,比較全的一個資料 struts.serve.static.browserCache 該屬性設置瀏覽器是否緩存靜態內容。當應用處於開發階段時,咱們但願每次請求都得到服務器的最新響應,則可設置該屬性爲false。 struts.enable.DynamicMethodInvocation 該屬性設置Struts 2是否支持動態方法調用,該屬性的默認值是true。若是須要關閉動態方法調用,則可設置該屬性爲false。 struts.enable.SlashesInActionNames 該屬性設置Struts 2是否容許在Action名中使用斜線,該屬性的默認值是false。若是開發者但願容許在Action名中使用斜線,則可設置該屬性爲true。 struts.tag.altSyntax 該屬性指定是否容許在Struts 2標籤中使用表達式語法,由於一般都須要在標籤中使用表達式語法,故此屬性應該設置爲true,該屬性的默認值是true。 struts.devMode該屬性設置Struts 2應用是否使用開發模式。若是設置該屬性爲true,則能夠在應用出錯時顯示更多、更友好的出錯提示。該屬性只接受true和flase兩個值,該屬性的默認值是false。一般,應用在開發階段,將該屬性設置爲true,當進入產品發佈階段後,則該屬性設置爲false。 struts.i18n.reload該屬性設置是否每次HTTP請求到達時,系統都從新加載資源文件。該屬性默認值是false。在開發階段將該屬性設置爲true會更有利於開發,但在產品發佈階段應將該屬性設置爲false。 提示 開發階段將該屬性設置了true,將能夠在每次請求時都從新加載國際化資源文件,從而可讓開發者看到實時開發效果;產品發佈階段應該將該屬性設置爲false,是爲了提供響應性能,每次請求都須要從新加載資源文件會大大下降應用的性能。 struts.ui.theme該屬性指定視圖標籤默認的視圖主題,該屬性的默認值是xhtml。 struts.ui.templateDir該屬性指定視圖主題所須要模板文件的位置,該屬性的默認值是template,即默認加載template路徑下的模板文件。 struts.ui.templateSuffix該屬性指定模板文件的後綴,該屬性的默認屬性值是ftl。該屬性還容許使用ftl、vm或jsp,分別對應FreeMarker、Velocity和JSP模板。 struts.configuration.xml.reload該屬性設置當struts.xml文件改變後,系統是否自動從新加載該文件。該屬性的默認值是false。 struts.velocity.configfile該屬性指定Velocity框架所需的velocity.properties文件的位置。該屬性的默認值爲velocity.properties。 struts.velocity.contexts該屬性指定Velocity框架的Context位置,若是該框架有多個Context,則多個Context之間以英文逗號(,)隔開。 struts.velocity.toolboxlocation該屬性指定Velocity框架的toolbox的位置。 struts.url.http.port該屬性指定Web應用所在的監聽端口。該屬性一般沒有太大的用戶,只是當Struts 2須要生成URL時(例如Url標籤),該屬性才提供Web應用的默認端口。 struts.url.https.port該屬性相似於struts.url.http.port屬性的做用,區別是該屬性指定的是Web應用的加密服務端口。 struts.url.includeParams該屬性指定Struts 2生成URL時是否包含請求參數。該屬性接受none、get和all三個屬性值,分別對應於不包含、僅包含GET類型請求參數和包含所有請求參數。 struts.custom.i18n.resources該屬性指定Struts 2應用所須要的國際化資源文件,若是有多份國際化資源文件,則多個資源文件的文件名以英文逗號(,)隔開。 struts.dispatcher.parametersWorkaround 對於某些Java EE服務器,不支持HttpServlet Request調用getParameterMap()方法,此時能夠設置該屬性值爲true來解決該問題。該屬性的默認值是false。對於WebLogic、Orion和OC4J服務器,一般應該設置該屬性爲true。 struts.freemarker.manager.classname 該屬性指定Struts 2使用的FreeMarker管理器。該屬性的默認值是org.apache.struts2.views.freemarker.FreemarkerManager,這是Struts 2內建的FreeMarker管理器。 struts.freemarker.wrapper.altMap該屬性只支持true和false兩個屬性值,默認值是true。一般無需修改該屬性值。 struts.xslt.nocache 該屬性指定XSLT Result是否使用樣式表緩存。當應用處於開發階段時,該屬性一般被設置爲true;當應用處於產品使用階段時,該屬性一般被設置爲false。 struts.configuration.files 該屬性指定Struts 2框架默認加載的配置文件,若是須要指定默認加載多個配置文件,則多個配置文件的文件名之間以英文逗號(,)隔開。該屬性的默認值爲struts-default.xml,struts-plugin.xml,struts.xml,看到該屬性值,讀者應該明白爲何Struts 2框架默認加載struts.xml文件了。 在請求時,路徑後的後綴action可要可不要,即下面的兩種請求都是能夠的 http://localhost:8080/Struts2/chapter1/HelloWorld http://localhost:8080/Struts2/chapter1/HelloWorld.action Action配置中的各項默認值 請看下面的代碼 <action name="Login"> <result>/WEB-INF/JspPage/chapter1/Login.jsp</result> </action> 咱們發現,當咱們請求的路徑爲http://localhost:8080/Struts2/chapter1/Login時,一樣能夠實現頁面的跳轉,這是怎麼回事呢? 若是沒有爲action指定class,默認是ActionSupport類 <action name="Login"> 至關於 <action name="Login" class="com.opensymphony.xwork2.ActionSupport"> 若是沒有爲action指定method,默認執行action中的execute()方法 <action name="Login"> 至關於 <action name="Login" class="com.opensymphony.xwork2.ActionSupport" method="execute"> 若是沒有指定result的name屬性,默認值爲success. <result> 至關於 <result name="success"> 提出一個問題ActionSupport這個類究竟是個什麼類呢? 首先要確定的一點是他是一個具備execute方法的類,而且execute方法返回」success」字符串,由於只有這樣,前面的運行結果才能說的通. ActionSupport還實現了不少其餘的結果,提供了許多定製的功能. ActionSupport類的做用 struts2不要求咱們本身設計的action類繼承任何的struts基類或struts接口,可是咱們爲了方便實現咱們本身的action,大多數狀況下都會繼承com.opensymphony.xwork2.ActionSupport類,並重寫此類裏的public String execute() throws Exception方法。由於此類中實現了不少的實用藉口,提供了不少默認方法,這些默認方法包括國際化信息的方法、默認的處理用戶請求的方法等,這樣能夠大大的簡化Acion的開發。 Struts2中一般直接使用Action來封裝HTTP請求參數,所以,Action類裏還應該包含與請求參數對應的屬性,而且爲屬性提供對應的getter和setter方法。 課堂筆記 默認值 class="" ActionSupport method="" execute name="" 「success」 Action接口裏提供了一些常量及execute方法,一般咱們本身寫的Action能夠實現這個接口, ActionSupport已經實現了這個接口,而且還實現了驗證,國際化等功能的接口,因此咱們本身寫的Action類一般會繼承ActionSupport這個類來達到啓用驗證框架,國際化,自動轉換等功能的目的.