Struts2.x教程(一) Struts2介绍
一、Struts2是什么 Struts2是在WebWork2基礎發(fā)展而來的。和Struts1一樣, Struts2也是基于MVC的web層框架。 那么既然有了Struts1,為何還要Struts2? Struts2和Struts1盡管都是基于MVC的Web框架,可是它們的實現(xiàn)機制全然不同。
Struts1是基于Servlet的實現(xiàn),而且Struts1的API過分依賴容器。導致了Action開發(fā)、測試都非常繁瑣,而Struts2是基于過濾器的實現(xiàn),API不再依賴容器,測試過程中不必再模擬Web容器環(huán)境,開發(fā)、測試較Struts1都有非常大的進步。 Struts1的Action是單例模式全部請求共享一個ActionServlet。所以線程必須是安全的,而Struts2每一個請求都會綁定一個Action,不再有線程安全問題。 Struts2開始支持注解并提供了更為強大的OGNL標簽庫以及值棧。從類到頁面的開發(fā)都更加簡潔高效。
? Struts2和Struts1都是基于MVC的Web層框架。所以,他們工作原理還是一樣的。都是對請求進行攔截、分發(fā)、處理,之后返回頁面。僅僅只是他們的實現(xiàn)機制不同罷了。 因此。Struts2的工作原理就不再過多介紹。以下我們來看怎樣使用Sturts2搭建一個Web開發(fā)環(huán)境。
? 二、Struts2的使用 讓我們先用Sturts2 展示一個Helloworld。 1、創(chuàng)建web項目struts2_helloworld,加入Struts2的依賴支持
struts2-core-2.3.8.jar xwork-core-2.3.8.jar commons-lang3-3.1.jar ognl-3.0.6.jar javassist-3.11.0.GA.jar asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar freemarker-2.3.19.jar commons-fileupload-1.2.2.jar commons-io-2.3.jar
2、在web.xml中配置struts2
??<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>
3、創(chuàng)建Struts2配置文件struts.xml
<?xml version="1.0"?encoding="UTF-8"??>
<!DOCTYPE?struts PUBLIC
????"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
????"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
????<package?name="default"?namespace="/"?extends="struts-default">
????????<action?name="hello"?class="com.boya.struts2.web.HelloAction">
????????????<result>
????????????????/helloWorld.jsp
????????????</result>
????????</action>
????</package>
</struts>
注意,與Struts1不同。Struts2的配置文件并不放在WEB-INF文件夾下。而須要放置在src源代碼根文件夾下 4、創(chuàng)建Action類
public?class?HelloAction {
????public?String execute() {
????????return?"success";
????}
}
5、創(chuàng)建返回頁面helloWorld.jsp ? 如今就完畢了一個簡單的Struts2應用。啟動Webserver,訪問: http://localhost:8080/struts2_helloworld/hello 就能夠看到我們創(chuàng)建的helloWorld.jsp頁面了。 ? 三、Sturts2的配置介紹 1、在web.xml配置Strut2過濾器攔截 Sturts1是通過servlet映射實現(xiàn)的對請求的攔截,Struts2是通過Filter完畢的對請求攔截。前者會在ActionSerlvet中載入核心配置文件,后者會在StrutsPrepareAndExecuteFilter過濾器中載入。
因此,與Struts1不同的是,我們要在web.xml里面配置Struts2的Filter來攔截請求。
配置方式見上文。
???????? 2、Strtus2核心配置文件 Struts2的默認配置文件是struts.xml,須要放置在源代碼根文件夾下。 struts.xml中的action標簽和Struts1中的作用一樣,都是定義了一種映射關系。
package標簽則表明以包的形式來管理action和攔截器。通常情況下,按將邏輯相關一組業(yè)務Action作為一個模塊放在同一個package下管理。
? package有下面屬性; name:包名稱。其它包使用name繼承當前包,不能反復 namespace:定義當前包的命名空間,匹配請求URL的路徑部分。不同的命名空間下能夠有重名的action extends:當前包繼承的父包,繼承之后,當前包擁有父包中所定義的隨意類、攔截器等 abstract:定義當前包為一個抽象的包,也就是說不能有action元素在當前包中 ? action屬性: name:action名稱,用來匹配請求URL class:相應的詳細Action實現(xiàn)類。默覺得ActionSupport method:運行action時調用的方法,默認運行execute()。也能夠在URL中動態(tài)指定,比如: ????<a href="${ctx}/system/user!add">加入用戶</a> ? result標簽:定義action的返回跳轉頁面 name:定義頁面跳轉名稱,默覺得success。
在action中返回一個相應name的字符串,就會返回到相應的jsp頁面
type:設置返回結果類型,默覺得dispatcher。用于返回jsp頁面 ? 3、URL映射機制 Struts1中,我們是使用path來映射URL請求的。在Struts2中是使用namespace + action的name來映射URL的。 比如: ????namespace="/system" , ????action設置name為"/user" ????那么這個action相應的URL就是 http://主機地址/project名/system/user ? namespace尋址機制: 對于我們的一個URL請求。比如http://主機地址/project名/path1/path2/path3/user Struts2會自己主動將URL中的后綴。以及Host和project名去掉,將/path1/path2/path3這部分覺得是namespace,首先會查找namespace="/path1/path2/path3",假設這個命名空間查找不到,會繼續(xù)查找namespace="/path1/path2",仍然沒有的話。會繼續(xù)查找上一級命名空間。直到查找到namespace="/"為止。 查找到命名空間,會在該命名空間的package下查找name="/user"的action。最后將這個請求交給action相應的業(yè)務處理類處理。
namespace默覺得"",當在其它namespace中映射不到的時候,都在這個namespace中尋找。
? Struts2是用namespace和actionName來唯一差別一個Action。因此,在同一個namespace下不能配置同名的action,在不同的namespace下,能夠有重名action。
? 4、映射方式配置 在web.xml的過濾器映射中除了這樣配置: <filter-mapping>
????<filter-name>struts2</filter-name>
????<url-pattern>/*</url-pattern>
</filter-mapping> 也能夠使用擴展名配置: <filter-mapping>
????<filter-name>struts2</filter-name>
????<url-pattern>*.action</url-pattern>
</filter-mapping> action是struts2默認支持的擴展名。/*在完畢*.action的基礎映射功能下。提供了額外的支持
????a、用于訪問classpath中特定的靜態(tài)資源(假設是/struts、或者/static開始的資源,則在classpath下查找特定的包以下的匹配資源;) ????b、支持無后綴的action請求 ? 使用/*方式映射時: ????訪問/struts或/static文件夾。不希望載入strtus的靜態(tài)資源的配置方式 ????<constant?name="struts.serve.static"?value="false"?/> ????希望強制使用擴展名映射的配置方式 ????<constant?name="struts.action.extension"?value="action"?/> ????相同能夠使用上面的配置改動struts2的默認擴展名 ????<constant?name="struts.action.extension"?value="do"?/> ????不希望映射某個文件夾時(文件夾須要是一個正則表達式,因此須要使用.*的方式表示) ????<constant?name="struts.action.excludePattern"?value="/dwr/.*,/noaction/.*"?/> ? 5、Action的方法映射 ????a、Action的方法映射能夠通過method指定,未指定method方法時,默認運行execute()方法 ????b、映射方法還能夠在URL中動態(tài)指定(動態(tài)方法調用DMI) ????????比如訪問 http://localhost:8080/struts2_helloworld/hello!print 會調用hello相應的Action中的print()方法 ????????注:能夠使用struts.enable.DynamicMethodInvocation參數(shù)配置DMI的開啟關閉,默覺得開啟 ????????<constant?name="struts.enable.DynamicMethodInvocation"?value="false"?/>?? ????c、使用通配符映射 ????????<action?name="*_*"?class="com.boya.struts2.web.{1}Action"?method="{2}"> ????????????<result> ????????????????/{0}.jsp ???????????????</result> ????????</action> ????????使用{1}{2}{3}...{9}的順序來匹配*。{0}匹配總體 ????????注:Struts2的通配符配置方式,極不靈活,不推薦使用 ? 6、設置返回結果類型 ????返回結果類型能夠通過result標簽的type屬性配置,默認類型為dispatcher。用于返回jsp頁面。經常使用的返回結果類型有redirect、chain、json等 ? ????redirect類型配置(重定向到一個新的URL請求): ????????<result name="success" type="redirect">/hello.jsp?name=${name}</result>?<!--重定向到一個jsp頁面-->
????????<result name="success" type="redirect">/hello.action</result>?<!--重定向到一個acton請求-->
????redirectAction類型配置(重定向到其它action): ??????????? <result type="redirectAction"> ????????????????<param name="namespace">/</param>????<!--重定向Action所在的命名空間,默覺得當前命名空間--> ????????????????<param name="actionName">user</param> <!--重定向的Action名稱--> ??????????????? <param name="method">login</param>????<!--重定向Action的方法名稱--> ??????????????? <param name="name">boya</param>????????<!--重定向傳參--> ??????????????? <param name="password">123456</param> <!--重定向傳參--> ??????????? </result> ????chain類型配置。配置類似redirectAction(鏈到其它action,也就是轉發(fā)操作): ????????<result type="chain"> ????????????<param name="namespace">/</param> <!--Action所在的命名空間,默覺得當前命名空間--> ????????????<param name="actionName">user</param> <!--Action名稱--> ????????????<param name="method">login</param> <!--Action的方法名稱--> ????????</result> ? ????json類型配置 ????a、加入struts2-json-plugin-2.3.8.jar ????b、Action代碼(省略getter、setter方法,省略User實體類):
public?class?JsonAction?extends?ActionSupport {
????private?Map<String,Object>?dataMap;
????
????public?String json() {
????????dataMap?=?new?HashMap<String, Object>();
????????User user?=?new?User();
????????user.setName("張三");
????????user.setAge(50);
????????dataMap.put("user", user);
????????return?SUCCESS;
????}
}
????c、配置struts.xml
<package?name="json"?extends="struts-default,json-default"?>
????<action?name="json"?class="com.boya.struts2.web.JsonAction">
????????<result?type="json">
????????????<param?name="root">dataMap</param>
????????</result>
????</action>
</package>
????package須要繼承"json-default" ????result類型須要配置為json???? ????result參數(shù): ????????root:指定返回屬性。默認返回全部有返回值的getter方法的值 ????????excludeNullProperties:是否返回值為空的屬性,值為boolean類型 ????????ignoreHierarchy:是否忽略父類屬性,值為boolean類型 ????????includeProperties:指定返回root中的哪些屬性。值為正則表達式。可使用逗號分隔設置多個 ????????excludeProperties:指定排除root中的哪些屬性。值為正則表達式,可使用逗號分隔設置多個????? ? ????d、返回內容: ????????{"user":{"age":22,"name":"張三"}} ??? excludeProperties和includeProperties的驗證差別: 首先。如果dataMap中返回結果為:{"users":[{"age":22,"name":"張三","password":"123456"},{"age":40,"name":"李四","password":"654321"}]}???? 設置了排除或包括的屬性后,以上結果須要驗證的元素有users、users[0]、users[0].age、users[0].name、users[0].password、users[1]、users[1].age、users[1].name、users[1].password 假設要排除password屬性,須要設置<param?name="excludeProperties">users.*\.password</param>?,excludeProperties是將正則表達式作為總體分別匹配以上各元素,這樣就會把password排除掉。
假設要僅僅包括name屬性,則不能設置為<param?name="includeProperties">users.*\.name</param>,includeProperties會將正則表達式拆為users.*、users.*\.name(對分隔符,數(shù)組索引符合,對象屬性間的點連接符等進行切割處理),這兩個正則分別與上面各元素匹配。而users.*就會匹配所有元素。所以無法排除。 要精確包括name屬性,須要設置為:<param?name="includeProperties">users\[\d+\]\.name</param>?,而這時,正則表達式會被拆為users,?users\[\d+\],?users\[\d+\]\.name?。終于僅僅輸出name屬性。 ? 四、Action處理 1、接收參數(shù) ????a、使用屬性來接收參數(shù) ????????比如。在UserAction中定義例如以下屬性,并加入getter、setter方法 ????????private?String?name; ????????private?String?password; ????????jsp使用相應名稱的控件 ????????username<input?type="text"?name="name"><br> ????????密碼<input?type="password"?name="password"><br>
這樣就能夠把提交的參數(shù)值傳給UserAction的屬性。 ? 也能夠通過URL將參數(shù)值傳遞給Action,如: http://localhost:8080/struts2-helloworld/user!save?name=admin&password=123456
???? ????b、使用DomainModel接收參數(shù) ????????比如。在UserAction中加入實體Bean類型的屬性。相同須要加入getter、setter方法 ????????????private?User?user; ????????jsp的控件名稱使用“對象.屬性”形式。如 ????????username<input?type="text"?name="user.name"><br> ????????密碼<input?type="password"?name="user.password"><br> ????????這樣。提交的參數(shù)會自己主動封裝如user對象中。在Action方法中,使用user.getName()就能夠獲取提交的username ???????? ????????使用URL傳遞參數(shù)就是這種形式: ??????????http://localhost:8080/struts2-helloworld/user!save?user.name=admin&user.password=123456?????? ? 2、獲取web容器的request和session ????Struts2不像Struts1那樣依賴容器。默認情況下,request、session這些容器對象都是隱藏的,而且Struts2層分別使用RequestMap、SessionMap對request、session進行封裝,是我們能夠使用Map的key-value形式對request、session進行操作。我們能夠獲取RequestMap來作為request使用,也能夠像傳統(tǒng)web開發(fā)那樣獲取一個HttpServletRequest對象。 ?? ????a、非IoC方式 ????????這樣的方式主要是利用了com.opensymphony.xwork2.ActionContext類以及org.apache.struts2.ServletActionContext類,分別用于獲取RequestMap和HttpServletRequest對象。 ????????獲取RequestMap、SessionMap對象 ????????Map?request?=?(Map)ActionContext.getContext().get("request"); ????????Map?session?=?ActionContext.getContext().getSession(); ????????獲取HttpServletRequest、HttpSession對象???????? ????????HttpServletRequest?request?=?ServletActionContext.getRequest(); ????????HttpSession?session?=?request.getSession(); ????b、IoC方式 ????????這樣的方式類似SpringIoc控制反轉,是使用依賴注入的方式獲得request和session對象的。 ????????獲取RequestMap、SessionMap對象,Action須要實現(xiàn)RequestAware, SessionAware接口
????private?Map?request; ????private?Map?session; ???? ????@Override ????public?void?setRequest(Map?request)?{ ????????this.request?=?request; ????} ????@Override ????public?void?setSession(Map?session)?{ ????????this.session?=?session; ????}
????????獲取HttpServletRequest、HttpSession對象,Action須要實現(xiàn)ServletRequestAware接口????
????private?HttpServletRequest?request; ????private?HttpSession?session; ????@Override ????public?void?setServletRequest(HttpServletRequest?request)?{ ????????this.request?=?request; ????????this.session?=?request.getSession(); ????}
? ?演示樣例代碼下載: Struts2 HelloWorld演示樣例:http://download.csdn.net/detail/boyazuo/7689429 Struts2 Json演示樣例:http://download.csdn.net/detail/boyazuo/7689925
轉載于:https://www.cnblogs.com/blfshiye/p/5143018.html
總結
以上是生活随笔為你收集整理的Struts2.x教程(一) Struts2介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信登录/第三方登录
- 下一篇: 免流所需软件和节点...