Welcome to Yumao′s Blog.
Hello Struts2
, 2012年05月19日 , Java Language , 评论 0 ,


1)為什麼需要Struts框架
企業需求,利用Struts框架可以簡化開發
2)如何學習Struts
先學習如何使用,有餘力再了解一些實現原理.

1.MVC設計思想在JavaWeb開發當中的使用
   1)什麼是MVC?
     是一種設計思想,非常優秀的設計思想.根據職責不同將應用程序的組件分成三部分.
     Model模型:負責業務數據和業務處理.
     View視圖:負責顯示和接收用戶輸入.
     Controller控制器:協調模型和視圖
    2)MVC在JavaWeb中的體現
      Model:DAO,Entity,Util
      View:JSP
      Controller:Servlet
      示例程序:ShoppingCart,控制器過於複雜,包含大量的if...else,
不適合大型複雜程序的開發.
      採用XML+Servlet+Action結構改造控制實現
    *3)MVC工作的基本流程
      a.客戶端發請求,請求交給前端控制器處理
      b.前端控制器維護一個XML配置文件
        (XML定義了請求和Action之間的對應關係)
      c.前端控制根據請求調用相應的Action組件,執行請求處理
      d.Action處理完畢,可以將處理結果存放到Request
      e.控制器調用相應的視圖JSP,進行響應處理
     4)Struts框架封裝了上述主要流程和結構

2.Struts2入門示例 HelloWorld
    1)Struts2發展史
     Struts1.2  WebWork-->xwork(命令模式實現) Struts2
    2)入門示例
     a.引入框架開發包(5個核心包) 2.1.8版本
      struts2-core-2.1.8.jar
      xwork-core-2.1.6.jar
      commons-fileupload-1.2.1.jar
      freemarker-2.3.15.jar(模板視圖技術,等價於JSP功能)
      ognl-2.7.3.jar(與EL相似,但是功能強大)
     b.在web.xml中添加控制器配置
     
  	strutsfilter
  		org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter
  	
  
  
  	strutsfilter
  	//*
  
     c.創建Action
      創建WelcomeAction類,添加默認execute方法
     d.添加XML配置,在src下添加struts.xml文件
       
	
	  
	     /welcome.jsp
	   
	
       


執行流程如下:
welcome.action-->web.xml(filter控制器)-->struts.xml(Action配置)
-->WelcomeAction-->execute-->"success"-->struts.xml(result配置)


     3)action配置

    a.元素:作用是將Action分組管理,內部可以定義多個Action.
       *name屬性:包名稱.
       *extends屬性:繼承哪個package,一般情況下繼承自struts-default.
       namespace屬性:用於限定action請求名,默認值是"/"
   當namespace="/"時,當前package中的所有action對應的請求格式:
   http://localhost:8080/struts2/action請求名.action
   如果namespace="/day01"時,action對應的請求格式:
  http://localhost:8080/struts2/day01/action請求名.action

     b.元素:作用是定義請求和Action組件之間的對應關係
       *name屬性:action組件對應的請求名
       *class屬性:指定action組件的實現類,包名.類名格式
       method屬性:指定要調用action類中哪個方法.默認值是execute

     c.元素:作用是定義響應視圖
        *name屬性:響應視圖標識符,該標識符與action組件方法返回值對應.
        type屬性:指定響應視圖類型,默認值是dispatcher,請求轉發

1.練習問題
  1)Action中利用DAO可以獲取出數據庫數據,但是JSP獲取不到.
  原因:1.檢查Action屬性及getter方法
        2.檢查struts.xml中元素的配置,不能使用type="redirect"
        3.檢查execute中接收集合的變量是否為局部變量
  2) 工程啟動出現錯誤
     由於web.xml或struts.xml配置有誤.可以根據異常信息尋找.
2.補充問題
   1)Action屬性及setter和getter方法的問題
   Action屬性在接收和傳出數據時,setter和getter方法是關鍵.
   a.接收時,表單組件name="user" ,action要有setUser方法才可以接收.
   b.傳出數據時,JSP使用${user},action要有getUser方法對應才可以獲取.
   public class Action{
       private String name;//成員變量name

       //有一個屬性,名字是user
       public String getUser(){
           return name;
       }
       public void setUser(String user){
	name = user;
       }
   }

3.OGNL技術
   Object Graphics Navigation Language(對象圖導航語言)
   OGNL是一種表達式語言技術,封裝在ognl.jar開發包中.
可以很方便的對對象的屬性進行獲取和設置.
   1)什麼是EL,有什麼用
   屬於表達式語言,可以訪pageContext,request,session,application存儲範圍的數據.可以簡化JSP程序.
   2)OGNL表達式,有什麼用
    屬於表達式語言,需要ognl.jar提供支持.可以完成以下操作
    a.可以訪問對象屬性(獲取和設置)
       基本類型屬性:"id","name"
       數組類型屬性:"love[0]","love[1]"
       List類型屬性:"city[0]","city[1]"
       Map類型屬性:"books.key","books['key']"
    b.可以訪問對象的方法
       "city.size()","name.toUpperCase()"
    c.可以訪問靜態常量和方法
      "@java.lang.Math@PI"
    d.可以訪問集合中的數據,進行集合過濾等操作
      "persons.{?#this.age>20}" : 返回persons集合中,滿足age>20的所有元素.
      ?指的是返回所有滿足條件的元素
      ^指的是返回第一滿足條件的元素
      $指的是最後一個滿足條件的元素
    e.支持Java中的運算符和表達式
      ""name"+name","id+10"
    f.定義一個List和Map類型的常量
      List常量:"{1,2,3}"
      Map常量:"#{'age':20,'name':"tom"}"
  3)OGNL標準結構
    OGNL有3個重要組成部分,一個OGNL引擎,一個是root對象,另一個是context對象.
    訪問context區域需要使用"#key"格式.
    沒有"#",例如"name",意思是訪問root對象的name屬性

4.OGNL技術在Struts2中應用
   1)OGNL在xwork中進行了改造
    xwork將OGNL中的root對象進行了改造,將其改造成了一個棧結構,類型是CompountRoot繼承自ArrayList.在訪問root屬性時,從棧頂對象向下依次查找,找到屬性值返回.
   2)ValueStack結構
    ValueStack是Struts2中非常重要的數據對象,當客戶發送一個請求後,控制器會根據當前請求創建一個ValueStack,並將請求處理相關的數據進行填充.
     root棧:存放當前請求對應的Action對象(棧頂)
     context(Map):存放request,session,application,parameters等信息
   3)JSP獲取業務數據,需要使用Struts標籤+OGNL表達式技術組合

1.課程回顧(理解)
  1)ValueStack結構和數據存儲狀態
   ValueStack包含3個組成
   a. OGNL引擎:負責解析OGNL表達式
   b. root對象:CompountRoot(棧結構)
       存放了當前請求的Action對象(處於棧頂位置)
   c. context對象:Map結構
       存放了其他象.
       request:Object
       session:Object
       application:Object
   2) ValueStack原理
    a.當客戶發送一個請求後,控制器會創建一個ValueStack對象
    b.控制器創建請求對應的Action對象,並壓入到ValueStack的root棧中
    c.將request,session等對象的引用,存入到ValueStack的context中
    d.將ValueStack再存入到request對象中,struts.valueStack
    e.客戶再發新請求,重複以上操作.
*2.重構列表顯示示例
3.EL表達式在Struts2中的使用(理解)
  EL為什麼可以獲取Action對象的屬性?
  可以訪問pageContext,request,action,session,application範圍數據
  在原有的JavaWeb程序中,JSP如果使用${username},會調用如下方法查找.
   HttpServletRequest接口
    request.getAttribute("username")
    session.getAttribute("username")
    application.getAttribute("username")
  在Struts2中,將request對象進行了封裝,類型為StrutsRequestWapper.
   public class StrutsRequestWapper
		extends HttpServletRequestWrapper{
      //重寫了getAttribute
      public Object getAttribute(String expression){
	//首先去原始的request中查找
	Object val = super.getAttribute(expression));
	//如果找不到,去valuestack查找
           if(val == null){
               val = ValueStack.findValue(expression);
           }
           return val;
      }
   }
   JSP使用 ${"username"} -->先去原有request中查找
    找不到調用ValueStack.findValue("username");
    觸發Ognl.getValue("username")//獲取root中棧頂action的username屬性
4. Struts2中Action組件的核心應用
   1)Action組件原理
     a.當客戶發生一個請求,控制器會創建一個Action對象
        不必擔心線程並發,不安全問題.
     b.Action對象創建後會放入ValueStack中,當root對象的棧頂
     c.Action對象提供一個業務方法,默認是execute
     d.Action對象在請求處理完畢後銷毀
   2)Action如何使用request,session,application
     a.利用工具類ActionContext,ServletActionContext

     如何將HttpServletRequest,HttpSession等對象轉換成Map結構
    public class SessionMap extends AbstractMap{
           private HttpSession session;
           public SessionMap(HttpSession session){
		this.session = session;
           }

	public void put(Object key,Object value){
		session.setAttribute(key.toString(),value);
	}
	public Object get(Object key){
		return session.getAttribute(key.toString());
           }
    }

     b.要Action實現以下Aware接口,利用接口約定的方法注入.(推薦)
       原因:減少了Struts2框架API對Action類的侵入,提高Action的靈活性.
        RequestAware
        SessionAware
        ApplicationAware
        ServletRequestAware
        ServletResponseAware
        ServletContextAware

      3)Action屬性注入技術
        Action類中定義的屬性,可以通過配置注入數據.
        
	 3
        

      4)在配置Action時,通配符*的使用
       在元素的name屬性中可以使用*號,可以使用若干個.
可以在method,class,引用*號所代表的信息.引用方式{1},{2},{3}

      5)動態方法調用
       可以在發送請求時,指定要執行的Action的業務方法名.
       請求格式: "請求名!方法名.action"
      6)在配置中可以使用EL表達式獲取Action屬性值
      
	/${viewName}.jsp
      
-------第一天---------
1.熟悉Struts2工作的主要流程
2.熟悉Struts2開發步驟
-------第二天---------
1.Struts標籤+OGNL表達式
  a.了解OGNL作用及其語法
  b.了解ValueStack結構和數據存儲
  c.,,,,,
2.EL在Struts2環境中的使用
  pageContext,request,action,session,application
-------第三天----------
1.Struts2中Action組件的核心應用
  a.Action如何使用request,session,application對象
  b.Action屬性注入技術
  c.如何用一個Action處理多個請求
    方法一:元素配置時,利用通配符*
    方法二:利用動態方法調用
  d.result元素配置,使用EL獲取Action屬性
    /${viewName}.jsp
    /a.jsp?id=${id}
---------第四天---------
1.綜合案例的實現
  課後練習(必須完成)
2.Struts2中Result組件的使用
  Result組件主要是負責生成響應視圖.響應結果有多種類型,比如jsp,stream,json,freemarker等.Struts2這對這些視圖,提供了相應Result組件.
  1)了解Result規則
     a.Result組件必須實現Result接口,實現execute()方法.
       在execute方法中,實現生成響應視圖的邏輯.
     b.Result配置聲明
      
	
	    
               
           
      
      c.如何使用result
       
    注意:type引用的result類型,可以從當前package或父package中找到定義

   2)常用類型的result
    --JSP響應:
         dispatcher:以請求轉發方式調用JSP響應
         redirect:以請求重定向方式調用JSP響應
       使用示例:
       
	JSP的URL
       
       
	JSP的URL
       
    --Action響應:
         redirectAction:以請求重定向方式調用一個Action
         chain:以請求轉發方式調用一個Action.
        如果下一個Action需要獲取前面請求的數據,需要使用chain;不需要則使用redirectAction
        使用示例:
       a.調用同一個package中的另一個Action
        
	的name名
        
       b.調用不同package,不同namespace下的Action
        
	
	     action元素的name名
           
           
	   package元素的namespace值
           
        

    --stream響應:
         stream:將Action某個InputStream屬性為客戶端輸出
      使用示例:
        
	action屬性
        

    --json響應:
         json:需要引入擴展包,可以將Action屬性以JSON格式輸出
       struts2-json-plugin-2.1.8.jar,
      

       
	ok
       
1.Struts2 UI標籤
  *form
  *textfield
   password
   hidden
   textarea
  *checkbox
   checkboxlist
   radio
  *select--option

2.Intercetpor攔截器組件的使用
   Struts框架提供很多的內置攔截器,開發者也可以自定義.
   攔截器封裝的功能具有:通用性強,可以多次重複利用.

 params:將請求攜帶的數據給Action屬性設置
 fileUpload:調用commons-fileupload.jar組件將客戶端文件上傳到服務器
   1)了解攔截器組件的規範
      攔截器組件實現類必須實現Interceptor接口,實現interceptor方法
   2)攔截器組件的聲明配置
     
      
         
         
         
         
            
            
         
      
     

   3)攔截器組件的使用
      a.為Action顯示引用
        
           
           
        
      b.為Action設置默認引用,(如果沒有給action指定攔截器,調用默認)
       如果元素繼承struts-default,默認調用defaultStack           

      注意:defaultStack是在元素沒有指定攔截器的情況下執行,
如果為元素指定了攔截器,defaultStack不再執行.

   4)攔截器使用示例
      a.自定義一個登錄檢查的攔截器
        1.編寫LoginInterceptor攔截器組件
        2.在聲明LoginInterceptor組件
        3.在元素中使用

      b.利用內置的fileUpload攔截器實現文件上傳
 -----fileUpload攔截器實現的主要邏輯如下------
   fileUpload首先調用commons-fileupload.jar組件,將文件上傳到服務器臨時目錄下.然後將臨時文件給Action的屬性賦值.
   接着通過ActionInvocation.invoke()調用UploadAction的execute方法,Result組件方法
   最後fileUpload將臨時文件清除.
         1.引入commons-io.jar,添加upload.jsp頁面
         2.編寫UploadAction,根據需要可以添加3個屬性.
          File xxx;//獲取臨時文件對象
          String xxxFileName;//獲取原文件名
          String xxxContentType;//獲取原文件類型
        注意:xxx是jsp表單中file組件的name屬性
         3.在UploadAction的execute方法中,將xxx臨時文件複製到目標目錄中.
         4.添加元素配置
         5.測試

Struts.tar.gz
课堂内容
Day01
Day02
Day03
Day04
Day05

关键字:, , , ,

评论已关闭