Struts2.0小記

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};

相關文章
相關標籤/搜索