struts1.x的缺陷: java
1.與servlet API嚴重耦合,不利於測試。 web
在action的實現類中,針對方法execute(mapping,form,request,response ),request,response屬於servlet的API,嚴重依賴於Web容器,一旦脫離容器,難於測試。 spring
2. 代碼嚴重依賴於Strut1.x屬於侵入式設計。 數據庫
Action要繼承Action類,在方法中有依賴於Servlet API,代碼重用性不高,屬於侵入式的設計。 apache
--------------------------------------------------- 編程
Struts2.0簡介: 瀏覽器
1. 大量採用了攔截器來處理用戶請求,從而語序用戶的業務邏輯控制器於Servlet API 相分離。 session
2. struts2屬於典型的AOP編程,使用攔截器做爲advice,用戶的業務處理做爲target,建立一個控制器代理。 app
--------------------------------------------------- jsp
Struts2.0工做原理:
1.瀏覽器發送請求;
2.核心控制器FilterDispatcher根據請求以爲調用合適的Action;
3.WebWork的攔截器鏈自動對請求應用通用功能,如workflow,validation或文件等功能;
4.回調Action的execute方法,該方法先獲取用戶請求參數,而後執行某種數據庫操做;實際上,由於Action只是一個
5.Action 的execute方法處理結果信息將被輸出到瀏覽器中,能夠是HTML頁面,圖像,也能夠是pdf文檔或者其餘文檔。
---------------------------------------------------
Struts2.0工做原理:
第一步
下載包:http://struts.apache.org/download.cgi#struts2181
這裏無須加載全部的包,若是不整合Spring,只要將如下加入工程:
commons-logging-1.0.4.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.5.jar
若是導入全部,則一啓動服務就報錯
整合Spring時,在導入struts2-spring-plugin-2.0.11.2.jar
第二步
在web。xml中配置Struts2.0的核心Filter
<filter>
<filter-namee>strtuts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>strtuts2</filter-name>
<url-pattern>/*</url-p>
</filter-mapping>
第三步
實現控制器類,就是一個Action 或者說是一個pojo
(com.action包)
public class UserAction{
private String userName;
private String userPass;
public String getUserName(){
return this.userName;
}
public void setUserName(String userName){
this.userName;
}
public String getUserPass(){
return this.userPass;
}
public void setUserName(String userPass){
this.userPass=userPass;
}
//--回調方法
public String execute(){
if(this.userName.equals("aaa")&& this.userPass.equals("aaa")){
return "ok";
}
return "no";
}
}
** 表面上看起來,該Action的兩個屬性只是提供了對應的setter和getter方法,很難理解請求參數在何時賦值給該Action的屬性,由於Struts2的攔截器機制,他們負責解析用戶的請求參數,並將請求參數值給Action對應的實現。
第四步
配置Action .
在src目錄下新建struts.xml,讓Action可以處理請求,並處理結果和資源的映射關係。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts PUBLIC "-//Apache SoftwareFoundaion//DTD Struts COnfiguration 2.0//EN" http://struts.apache.org.org/dtds/struts-2.0.dtd>
<struts>
<include file="struts-default.xml"></inlude>
<!-- 我在測試之時,刪除該一句代碼(<include>),並無報錯,一切運行正常,暫時沒有發現他有什麼用 -->
<package name="pck" extends="struts-default"> <!-- 注意此處的struts-default必定要寫對 -->
<!---注意action必定要包括在package中!!-->
<action name="user" class="com.action.UserAction">
<result name="ok"'>main.jsp</result>
<result name="no"'>login.jsp</result>
</action>
</package>
</struts>
第五步
建立視圖頁面:login.jsp,mian.jsp;
在login.jsp中:
<form method="post" action="user.action" name="loginForm">
<input type="text" name="userName">
<input type="tpassword" name="userPass">
<input type="submit" value="登陸">
</form>
*注意action的值爲*。action
Struts2.0中跟蹤用戶狀態:
Action 中全部的屬性都被封裝到了ValueStack對象中,Action中屬性民能夠理解爲ValueStqack中value的名字。
在jsp頁面中但是經過使用Struts標籤得到對應的屬性值,也可使用EL表達式:如${userName};
若是將封裝在Map中,有說法是封裝到Session中,但這不是封裝到Servlet中的session中,而是java經過 com.opensymphony.xwork2.ActionContex.getContext().getSession(),該方法返回Map集 合,加入userName放入其中:
代碼爲:
Map map = com.opensymphony.xwork2.ActionContex.getContext().getSession();
map.put("name",this.getUserName());
在jsp頁面中的取值方式爲${sessionScope.name};
ActionContex.getContext().getSession()方式是將值保存在session做用域中,若是在UserAction中存在了uname這個屬性字段,
而且先於使用map.put()方式賦值,那麼在jsp頁面中使用${uname},返回獲得的是UserAction類中原來是定的值,而不是通 過map從新賦的值,這是由於前者是將值保存在了ValueStack中,而使用如${uname},是直接從ValueStack中取值,所以返回的不 是經過map的put方法從新設置的值,要得到經過map的put方法設置的值必須使用以下方式:${sessionScope.name};