又拾起天天寫博客的習慣了,以前一致忙於學後面的框架技術,因此在過年這段時間暫時更新博客了。如今又進入學習狀態,因此仍是堅持天天寫博客和課上學習的保持一致。接下來暫時告別Web開發,進入框架技術學習。過年這段時間接觸了一些,因此如今學起來仍是駕輕就熟的。期待接下來的學習,把本身的能力提高起來,fighting~~html
自定義框架:主要掌握的知識(反射,經常使用數據結構與算法,設計模式) MVC開發模式 (Controller前期項目是最複雜的地方) Controller: Servlet(控制器 if--else if---else if---else) *Servlet是能夠直接訪問的 Filter(過濾器也能夠做爲一個控制器) *Filter不能直接訪問,/*表明這個FIlter可以過濾器全部用戶請求 Struts1--------------->Struts2發展歷程中,就是一個由控制器(Servlet------>Filter) 總結: 使用自定義框架後,進行開發,程序員關注什麼? view本身寫 控制器的Filter不用寫 ,只關注業務控制器Action的實現類 Model:自已寫
一、是什麼? Struts2是一個M(模型---域--範圍模型)V(View視圖)C(控制器)框架(模型2)。框架都是一個半成品。提升開發效率。 Struts1是一個MVC框架,很是流行。有很大的缺點。此時一個webwork的框架設計超前,名氣不是很大。Struts1+webworkd=struts2。用的是struts1的名字,可是與sruts1沒啥關係,struts2的核心是webwork框架。 二、能幹什麼? web開發主要乾的工做: 獲取請求參數 封裝到JavaBean 驗證和轉換 調用業務代碼存數據 轉向某個頁面展現結果 表現層的開發技術
目錄結構: a). apps:框架自己提供一些案例(學習) b). docs:框架自己提供的文檔(指南和API)。不保證100%正確 c). lib:框架須要的jar包及第三方的jar包(不要全拷貝) d). src:源碼 Sturts2包介紹 struts2-core-2.3.1.1.jar:Struts 2框架的核心類庫 xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基於xwork ognl-3.0.3.jar:對象圖導航語言(Object Graph Navigation Language), struts2框架經過其讀寫對象的屬性 reemarker-2.3.18.jar:Struts 2的UI標籤的模板使用FreeMarker編寫 commons-logging-1.1.x.jar:ASF出品的日誌包,Struts 2框架使用這個日誌包來支持Log4J和JDK 1.4+的日誌記錄。 commons-fileupload-1.2.2.jar: 文件上傳組件,2.1.6版本後須要加入此文件 commons-io-2.0.1.jar:傳文件依賴的jar包 commons-lang-2.5.jar:對java.lang包的加強 StringUtils.isEmpty(str) javassist-3.11.0.GA.jar:動態代理的開發包 搭建步驟 1. 新建一個JavaWeb工程 2. 拷貝struts2運行所需的必要jar包。(方便辦法:struts2發行包\apps\struts-blank.war,拷貝其中的lib下的全部jar) 3. 在web.xml中配置核心過濾器:StrutsPrepareAndExcuteFilter(框架提供) 4. 在WEB-INF\classes目錄下創建一個名稱爲struts.xml的配置文件。內容以下:(能夠從struts2髮型包\apps\struts-blank.war中拷貝 5. 把應用部署到Tomcat中,啓動Tomcat,若是沒有報錯,說明搭建成功
一、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求; 二、這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin); 三、接着StrutsPrepareAndExecuteFilter被調用,StrutsPrepareAndExecuteFilter詢問ActionMapper來決定這個請求是否須要調用某個Action; 四、若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy; 五、ActionProxy經過Configuration Manager詢問框架的配置文件,找到須要調用的Action類; 六、ActionProxy建立一個ActionInvocation的實例。 七、ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用
1. 若是安裝Aptana編輯器 ,請不要用Aptana自帶xml編輯器 編寫struts2配置文件 struts.xml提示來自於 DTD約束, 若是能夠上網,自動緩存dtd,提供提示功能 若是不能上網,也能夠配置本地DTD提示\struts-2.3.20-all\struts-2.3.20\src\core\src\main\resources *** 導入DTD時,應該和配置DTD版本一致 2. struts2提示問題 Preference中輸入xml,查找Catalog,添加URI
struts2 配置文件 由核心控制器加載 StrutsPrepareAndExecuteFilter (預處理init(),執行過濾) init_DefaultProperties(); // [1] ---------- org/apache/struts2/default.properties init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml init_LegacyStrutsProperties(); // [3] --- 自定義struts.properties init_CustomConfigurationProviders(); // [5] ----- 自定義配置提供 init_FilterInitParameters() ; // [6] ----- web.xml init_AliasStandardObjects() ; // [7] ---- Bean加載 結論: 1、default.properties:在struts2-core-**.jar包中的org.pache.struts2.default.properties中(框架自己用的) 2、struts-default.xml:在struts2-core-**.jar包中(框架自己用的) 3、struts-plugin.xml:在struts2-**-plugin.jar包中(插件中,給插件用的) 4、struts.xml:在你應用的構建路徑中(程序員進行配置的地方。推薦) 5、struts.properties:在你應用的構建路徑中(程序員進行配置的地方) 6、web.xml:此處也能夠對struts2框架進行配置(不建議。只建議配置過濾器) * 後加載文件中struts2 常量會覆蓋以前加載文件 常量內容 顯示struts.action.extension在struts.xml中的取值 ,和web.xml中的取值
經常使用常量 truts.action.extension=action,, 框架要處理的後綴名稱。 struts.devMode = true 開發着模式。實際運行時建議爲false struts.i18n.encoding=UTF-8 框架默認使用的編碼。請求參數和輸入響應 struts.serve.static.browserCache=true 靜態資源要不要緩存。 其餘常量 (response.setHeader():Expires;Cache-Control;Progma) struts.ui.theme=xhtml 和顯示結果有關,顯示用的主題。simple等 struts.objectFactory = spring 指定實例化動做類的工廠(和Spring集成時用) struts.enable.DynamicMethodInvocation = false 是否容許動態方法調用 struts.multipart.maxSize=2097152 文件上傳時的大小限制
動做類的定義: 方式一:就是一個普通的POJO。不須要繼承或實現任何的類或接口。 方式二:實現com.opensymphony.xwork2.Action 該接口中定義了幾個常量: String SUCCESS = "success";//執行成功時用 String NONE = "none";//執行成功後,不轉向任何的視圖。好比文件下載。 String ERROR = "error";//執行失敗,遇到錯誤。 String INPUT = "input";//輸入驗證失敗或轉換失敗,轉向輸入原有頁面。 String LOGIN = "login";//沒有登陸時,轉向的頁面。 public String execute() throws Exception; 優勢:可使用常量,編碼能夠作到儘可能統一。 方式三:(推薦) 繼承com.opensymphony.xwork2.ActionSupport(默認的動做類) # 動做類的生命週期 動做類每次訪問都會從新被實例化,是線程安全的 # 動做方法:動做類中的定義的處理業務有關的方法 特色(重要):public 返回值類型是String 方法沒有任何的參數 # 動做方法通配符的匹配 *_* class="**.{1}" method="{2}" # 動做方法的動態調用 開啓動態常量struts.enable.DynamicMethodInvocation = true 在action的訪問路徑 中 使用 "!方法名"
一、 在Action 中解耦合方式 間接訪問 Servlet API --------- 使用 ActionContext 對象 在struts2 中 Action API 已經與 Servlet API 解耦合 (沒有依賴關係 ) * Servlet API 常見操做 : 表單提交請求參數獲取,向request、session、application三個範圍存取數據 actionContext = ActionContext.getContext(); *本質分析是否存在線程安全問題? 不會有 答案原碼:ActionContext (使用ThreadLocal存儲相關的值) 二、 使用接口注入的方式,操做Servlet API (耦合) ServletContextAware : 注入ServletContext對象 ServletRequestAware :注入 request對象 ServletResponseAware : 注入response對象 * 程序要使用哪一個Servlet的對象,實現對應接口 *本質分析 <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> 三、 在Action中直接經過 ServletActionContext 得到Servlet API(推薦) ServletActionContext.getRequest() : 得到request對象 (session) ServletActionContext.getResponse() : 得到response 對象 ServletActionContext.getServletContext() : 得到ServletContext對象 * 靜態方法沒有線程問題,ThreadLocal
Action處理請求後, 返回字符串(邏輯視圖名), 須要在struts.xml 提供 <result>元素定義結果頁面 一、 局部結果頁面 和 全局結果頁面 <action name="result" class="cn.itcast.struts2.demo6.ResultAction"> <!-- 局部結果 當前Action使用 --> <result name="success">/demo6/result.jsp</result> </action> <global-results> <!-- 全局結果 當前包中 全部Action均可以用--> <result name="success">/demo6/result.jsp</result> </global-results> 二、 結果頁面跳轉類型 * 在struts-default.xml 定義了 一些結果頁面類型 * 使用默認type 是 dispatcher 轉發 (request.getRequestDispatcher.forward) 1) dispatcher :Action 轉發給 JSP 2) chain :Action調用另外一個Action (同一次請求) 3) redirect : Action重定向到 JSP 4) redirectAction :Action重定向到另外一個Action
註解開發第一步 基於約定的自動掃描 約定只解決Action訪問和結果頁面跳轉問題 * 在開發中須要爲Action指定攔截器,進行更細節result配置 * 約定不夠靈活,註解的功能 是和 xml配置方式 等價的 使用 @Action註解配置訪問路徑 @Result註解 配置結果頁面 <constant name="struts.convention.classes.reload" value="false" /> Action類文件從新自動加載 @ParentPackage 配置<package> extends 繼承哪一個包 @Namespace 配置包名稱空間 必須以/開頭的命名空間 例如: @Namespace("/employee") @ParentPackage("struts-default") public class HelloAnn extends ActionSupport { @Actions(value={@Action(value="myAnn1",results=@Result(name="success",location="/02ann.jsp")), @Action(value="helloAnn1",results=@Result(name="success",location="/02ann.jsp")) }) public String add() throws Exception { System.out.println("HelloAnn--------->add()執行了"); return SUCCESS; } }