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