春節假期終于結束了,假期內在北京只出去轉了兩天,感覺很好!剩余時間呆在屋子里寫了個練習程序收獲頗豐。
依然迫不及待,迫不及待的學完課程趕緊回大連。我想除了我,很多同學和網友也都期待著今天由張考祥老師主講的Struts2。張老師也說了,如果只講Struts2的應用一天足夠了。但我們都知道傳智的特色,就是往深里控,講應用+原理。
Struts2共為期四天的課程,且內容較多。我在做總結時不可能面面具到,也就把一些重點總結一下吧!張老師的精神依然另人敬佩,講了一天,休息的時間并不多。時而讓我想起在來傳智之前看他的視頻,他提到了個人的理想,讓我十分敬佩。
一、Struts2簡介
雖然Struts2號稱是一個全新的框架,但這僅僅是相對Struts 1而言。Struts 2 與Struts 1相比,確實有很多革命性的改進,但它并不是新發布的新框架,而是在另一個赫赫有名的框架:WebWork基礎上發展起來的。從某種程度上來講,Struts2沒有繼承Struts 1的血統,而是繼承WebWork的血統。或者說,WebWork衍生出了Struts2,而不是Struts 1衍生了Struts2。因為Struts2是WebWork的升級,而不是一個全新的框架,因此穩定性、性能等各方面都有很好的保證:而且吸收了Struts 1和WebWork兩者的優勢,因此,是一個非常優秀的框架。
如果你以前有學習過Struts1可以到網上搜索一下Struts1與Struts2的對比,真是改頭換面哈!~~
Struts2的官方:http://struts.apache.org/2.x/
二、HelloWorld!
我們依然使用eclipse做為開發工具,這款工具雖然開發效率沒有MyEclipse高。但在以后的企業開發中,Eclipse是比較常用的。
1.創建DynamicWebProject
2.導入Jar包(我們使用的是struts-
沒必要一個一個手動的往里加了,對于新人來說更沒必要(你知道都需要哪幾個包嗎?難道要重復的跑程序,導Jar包?)。在struts-
3.添加struts.xml
將WEB-INF\classes目錄下的struts.xml文件復制到工程的源碼目錄(src)下。修改其內容為:
<?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="default" namespace="/" extends="struts-default"> <action name="helloWorld" class="cn.itcast.cc.web.struts2.actions.HelloWorld" method="helloWorld"> <result name="say" type="dispatcher"> <param name="location">/WEB-INF/pages/helloworld.jsp</param> </result> </action> </package> </struts> |
4.添加類HelloWorld:
package cn.itcast.cc.web.struts2.actions; public class HelloWorld { public String helloWorld(){ return "say"; } } |
5.為web.xml添加一個過濾器:
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
6.我們的helloworld.jsp頁面內容(body部分):
<body> <h1>Hello World!</h1> </body> |
7.運行程序,在地址欄中輸入:“http://localhost:8080/Struts2HelloWorld/helloWorld”
OK,我們的HelloWorld跑起來了!
三、struts.xml詳解
張老師講課比較細致,這也是他對技術的研究和對學生負責的體現。網上的struts.xml配置文件詳解較多,在此就不列出了。(我們都知道他們的文檔做的十分好)
我們在配置文件中使用一個action配置一個請求路徑,那在應用開發中這是一件十分恐怖的事。Struts2為我們提供了一個特殊符號“!”,這是做什么用的呢?使用“!”相當于Struts1的DispatchAction。我們在請求路徑的最后(action)后邊添加“!”符號并在“!”符號后添加指定的類的方法名,我們的請求就會調用那個方法。
但struts2的文檔中不建議使用“!”,因為“!”會泄漏我們類的具休方法名稱,可能會帶個安全隱患。所以Struts2又為我們提供了通配符”*”,統配符十分方便,推薦使用!在action元素的其他屬性class和method以及result元素中可以引用*通配符在訪問期間實際匹配的內容。
四、StrutsPrepareAndExecuteFilter
我們先來看一下Struts2框架的工作原理:
FilterDispatcher是Struts2.0.X的過濾器,OtherFilter是其他過濾器必須放在FilterDispathcer之前,因為FilterDispatcher過濾到的內容不會向下傳遞。
FilterDispatcher接收到過濾內容后,傳給ActionProxy。ActionProxy會根據struts.xml配置文件調用相應的攔截器,然后再調用Action。Action返回結果,指定向應的頁面,然后再交由過濾器處理。最后返回給瀏覽器。
在我們使用的struts-
StrutsPrepareAndExecuteFilter有三種過濾:
1).什么也不是,直接交給Tomat。
2).是我的Action。
3).是我的靜態資源,這一點很特別。直接查看幫助手冊吧,不過它不并不常用。
五、攔截器
通過四我們知道,在進行Action調用的前后都可以添加過濾器。為我們HelloWorld的程序添加一個過濾器,實現在顯示HelloWorld頁面之前在控制臺輸出 ”你好!“,添加Class文件:
package cn.itcast.cc.web.struts2.interceptors; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class HelloWorldInterceptor implements Interceptor { private static final long serialVersionUID = @Override public void destroy() {} @Override public void init() {} @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("你好!"); return invocation.invoke(); } } |
修改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> <package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="nihao" class="cn.itcast.cc.web.struts2.interceptors.HelloWorldInterceptor" /> </interceptors> <action name="helloWorld" class="cn.itcast.cc.web.struts2.actions.HelloWorld" method="helloWorld"> <interceptor-ref name="nihao" /> <result name="say" type="dispatcher"> <param name="location">/WEB-INF/pages/helloworld.jsp</param> </result> </action> </package> </struts> |
OK,運行程序!訪問頁面,控制臺輸入了”你好!“。
六、contextMap和valueStack
我們在使用Struts1時,Struts1的Action為我們提供request、response...請求與回復信息。但在我們的Struts2的HelloWorld程序并未實現任何接口(也沒有超類)。那我們應該如何獲取這些數據?在Struts2的環境中ServletActionContext為我們提供了許多重要的靜態方法,包括獲取請求與回復信息對象。
ServletActionContext是從哪里獲取這些對象的呢?就當contextMap看,當初始化一個新的請求時,一些重要的數據會被添加到contextMap中。需要時,去拿就可以了!
Struts 2框架使用OGNL作為默認的表達式語言,今天我們使用<s:debug>查看了contextMap和valueStack在內存中的內容,使用十分方便!
今天的總結就到此結束吧!這只是一個框架,很多細節都沒有列出。但有視頻還好,即使沒有視頻,我想也難不住我。