struts2的工作原理,Struts2.x教程(一) Struts2介紹

 2023-11-07 阅读 19 评论 0

摘要:一、Struts2是什么 Struts2是在WebWork2基礎發展而來的。和Struts1一樣, Struts2也是基于MVC的web層框架。 那么既然有了Struts1,為何還要Struts2? Struts2和Struts1盡管都是基于MVC的Web框架,可是它們的實現機制全然不同。 Struts1是基于Servle
一、Struts2是什么
Struts2是在WebWork2基礎發展而來的。和Struts1一樣, Struts2也是基于MVC的web層框架。
那么既然有了Struts1,為何還要Struts2?
Struts2和Struts1盡管都是基于MVC的Web框架,可是它們的實現機制全然不同。

Struts1是基于Servlet的實現,而且Struts1的API過分依賴容器。導致了Action開發、測試都非常繁瑣,而Struts2是基于過濾器的實現,API不再依賴容器,測試過程中不必再模擬Web容器環境,開發、測試較Struts1都有非常大的進步。
Struts1的Action是單例模式全部請求共享一個ActionServlet。所以線程必須是安全的,而Struts2每一個請求都會綁定一個Action,不再有線程安全問題。
Struts2開始支持注解并提供了更為強大的OGNL標簽庫以及值棧。從類到頁面的開發都更加簡潔高效。

?
Struts2和Struts1都是基于MVC的Web層框架。所以,他們工作原理還是一樣的。都是對請求進行攔截、分發、處理,之后返回頁面。僅僅只是他們的實現機制不同罷了。
因此。Struts2的工作原理就不再過多介紹。以下我們來看怎樣使用Sturts2搭建一個Web開發環境。

struts2的工作原理?

?
二、Struts2的使用
讓我們先用Sturts2 展示一個Helloworld。
1、創建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、創建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、創建Action類
public?class?HelloAction {
????public?String execute() {
????????return?"success";
????}
}
5、創建返回頁面helloWorld.jsp
?
如今就完畢了一個簡單的Struts2應用。啟動Webserver,訪問:
http://localhost:8080/struts2_helloworld/hello
就能夠看到我們創建的helloWorld.jsp頁面了。
?
三、Sturts2的配置介紹
1、在web.xml配置Strut2過濾器攔截
Sturts1是通過servlet映射實現的對請求的攔截,Struts2是通過Filter完畢的對請求攔截。前者會在ActionSerlvet中載入核心配置文件,后者會在StrutsPrepareAndExecuteFilter過濾器中載入。

因此,與Struts1不同的是,我們要在web.xml里面配置Struts2的Filter來攔截請求。

配置方式見上文。

????????
2、Strtus2核心配置文件
Struts2的默認配置文件是struts.xml,須要放置在源代碼根文件夾下。
struts.xml中的action標簽和Struts1中的作用一樣,都是定義了一種映射關系。

iphonex組裝教程?package標簽則表明以包的形式來管理action和攔截器。通常情況下,按將邏輯相關一組業務Action作為一個模塊放在同一個package下管理。

?
package有下面屬性;
name:包名稱。其它包使用name繼承當前包,不能反復
namespace:定義當前包的命名空間,匹配請求URL的路徑部分。不同的命名空間下能夠有重名的action
extends:當前包繼承的父包,繼承之后,當前包擁有父包中所定義的隨意類、攔截器等
abstract:定義當前包為一個抽象的包,也就是說不能有action元素在當前包中
?
action屬性:
name:action名稱,用來匹配請求URL
class:相應的詳細Action實現類。默覺得ActionSupport
method:運行action時調用的方法,默認運行execute()。也能夠在URL中動態指定,比如:
????<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",假設這個命名空間查找不到,會繼續查找namespace="/path1/path2",仍然沒有的話。會繼續查找上一級命名空間。直到查找到namespace="/"為止。
查找到命名空間,會在該命名空間的package下查找name="/user"的action。最后將這個請求交給action相應的業務處理類處理。

namespace默覺得"",當在其它namespace中映射不到的時候,都在這個namespace中尋找。

soundx介紹,

?
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中特定的靜態資源(假設是/struts、或者/static開始的資源,則在classpath下查找特定的包以下的匹配資源;)
????b、支持無后綴的action請求
?
使用/*方式映射時:
????訪問/struts或/static文件夾。不希望載入strtus的靜態資源的配置方式
????<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中動態指定(動態方法調用DMI)
????????比如訪問 http://localhost:8080/struts2_helloworld/hello!print 會調用hello相應的Action中的print()方法
????????注:能夠使用struts.enable.DynamicMethodInvocation參數配置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,也就是轉發操作):
????????<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參數:
????????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(對分隔符,數組索引符合,對象屬性間的點連接符等進行切割處理),這兩個正則分別與上面各元素匹配。而users.*就會匹配所有元素。所以無法排除。
要精確包括name屬性,須要設置為:<param?name="includeProperties">users\[\d+\]\.name</param>?,而這時,正則表達式會被拆為users,?users\[\d+\],?users\[\d+\]\.name?。終于僅僅輸出name屬性。
?
四、Action處理
1、接收參數
????a、使用屬性來接收參數
????????比如。在UserAction中定義例如以下屬性,并加入getter、setter方法
????????private?String?name;
????????private?String?password;
????????jsp使用相應名稱的控件
????????username<input?type="text"?name="name"><br>
????????密碼<input?type="password"?name="password"><br>
這樣就能夠把提交的參數值傳給UserAction的屬性。
?
也能夠通過URL將參數值傳遞給Action,如:
http://localhost:8080/struts2-helloworld/user!save?name=admin&password=123456
????
????b、使用DomainModel接收參數
????????比如。在UserAction中加入實體Bean類型的屬性。相同須要加入getter、setter方法
????????????private?User?user;
????????jsp的控件名稱使用“對象.屬性”形式。如
????????username<input?type="text"?name="user.name"><br>
????????密碼<input?type="password"?name="user.password"><br>
????????這樣。提交的參數會自己主動封裝如user對象中。在Action方法中,使用user.getName()就能夠獲取提交的username
????????
????????使用URL傳遞參數就是這種形式:
??????????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使用,也能夠像傳統web開發那樣獲取一個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須要實現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須要實現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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/167694.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息