`

Struts2学习笔记

阅读更多

                                                        Struts2學習筆記

 

一.Struts1中存在的缺陷:

a.       支持的表示層技術單一,只支持jsp

b.       Servlet API严重耦合,难于测试。其中servlet中的mapping, request,response,form四个参数,其中request,response通常由web容器负责

实例化,HttpServletRequestHttpServletResponse属于web服务器,因此一旦脱离web服务器,acion的测试非常困难

c. 代码严重依赖于struts1 APIstruts1Action的每个类都要继承action的基类,当代码要重构的时,这些action类将没有利用价值

 

二、Struts2由三個部份組成:

        

FilterDispatcherFilterDispatcherstruts2框架的核心控制器,該控制器作為一個File運行在web應用中,它攔截所有的用戶請求,該Filter會過濾用戶請求(web.xml文件中配置):

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

 

業務控制器: 業務控制器組件就是用戶實現Action類的實例,需在struts2的配置文件中配置Action的如下三個部份

  <!-- 勞委會活動3 chenhuimin 2010-10-09-->
 <package name="struts-activity3" extends="struts-default" namespace="/activity3">
 
  <!-- 抽獎資格名單 -->
  <action name="entryDataList" class="com.tkb.cla.action.activity3.EntryDataAction" method="entryDataList">
   <result name="success">/activity3/qualification.jsp</result>
  </action>
  
  <!-- 填寫抽獎資料及問卷調查 -->
  <action name="saveEDAndQList" class="com.tkb.cla.action.activity3.EntryDataAction" method="saveEDAndQList">
   <result name="input">/activity3/gameSuccess.jsp</result>
   <result name="success" type="redirect">/activity3/entryDataList.action</result>
  </action>
  
 </package>

 

 

Name: Action組件所對應的實現類

Class: Action所處理的URL

method="execute"——表示指定調用action裏面的execute方法

Result: Action 里包含的邏輯視圖和物理資源之間的對應關係:

 

Struts2不支持單獨的Action設置命名空間,而是通過為包指定namespace屬性來為包下面的所有Action指定共同的命名空間

如果某個包沒有指定namespace屬性。即該包使用默認的命名空間,則默認的命名空間總是"";

如果某個包指定了命名空間后,該包下所有的Action處理的URL應該是命名空間+Action名。例:

<package name="default" extends="struts-default" namespace="/text">

URL:

http://localhost:8888/namespace/book/find.action

通過<......namespace="/">來指定根命名空間

 

命名空間只有一個級別:如果系統找不到指定命名空間的Action,系統將直接接入默認的命名空間去查找該action,而不會到指定命名空間去查找        

用戶實現的業務邏輯組件:模型組件,視圖組件

 

. Struts2通常直接使用Action來封裝HTTP請求,因此Action類中還應該包含getset方法

由於系統是通過gettersetter方法來處理請求參數的,而不是通過屬性來處理請求參數,所以action是否包含屬性并不重要,

重要的是有gettersetter方法

 

. 一旦在Action中設置了對象的屬性值,在頁面就可以使用struts2標籤來輸出對象的屬性值<s:property value="tip"/>

 

. Action直接訪問ServletAPI

         ServletContextAware: 實現該接口的Action可以直接訪問用戶請求的ServletContext實例

ServletRequestAware:實現該接口的Action可以直接訪問用戶請求的HttpServletRequest實例

ServletResponseAware:實現該接口的Action可以直接訪問用戶請求的HttpServletResponse實例

 

. struts2框架的大致处理流程:

       1.浏览器发送请求

2.核心控制器FileDispatcher根据请求决定调用合适的Action

3.WebWork的拦截器链自动对请求应用通用功能,例如workflow,或文件上传等

4.回调Actionexecute方法,该execute方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据保存到数据库,也可以从数据库中

检索信息。实际上,因为Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求

5.Actionexecute方法处理结构信息将被输出到浏览器中,可以是HTML页面,图像,也可以是文档等

 

. Struts2框架是一個高度可擴展性的框架,框架的大部份核心組件,Struts2并不是直接以硬編碼的方式寫在代碼中,而是以自己的IOC(控制反轉)

容器來管理框架的核心組件,

 

. Struts2配置文件問題:因為Struts2的配置文件是從上到下處理的,所以父包應該在子包的前面

 

. Struts2的標籤庫定義文件包含在Struts2-core-2.206.jar文件中Struts-tagTld

 

. Struts2action類繼承Action與不繼承Action的區別:

繼承Actionexecute方法可以返回Action接口裡的字符串常量(return ERROR) 如不繼承則要這樣寫(return "error")struts1的比較是struts2返回的是

一個字符串,而不是一個ActionForward對象

 

十一. struts2 Action默認拦截所有后缀为.action的請求。因此我們需要將某個表單提交給Struts2 Action處理,則應該將該表單的action屬性設置為*.action

 

十二. Struts2中只要導入 <%@ taglib prefix="s" uri="/struts-tags" %>就能使用s:標籤。struts2與標籤結合緊密

 

十三.(全局驗證)在jsp頁面用  <s:fielderror></fielderror>來輸出struts2為我們驗證的表單輸入錯誤信息

struts.xml文件中可以用以下代碼替代struts2為我們驗證表單錯誤時輸出的信息

<constant  name=”struts.custom.i18n.resources”  value=”message”></constant>

struts.xml中加上<constant>后在src目錄下建立名為 message.properties files文件,然後在文件總寫入 xwork.default.invalid.fieldvalue={0}  error

其中{0}用於代替屬性名,error用於代替struts2為我們提供的錯誤輸入信息

 

14.(局部驗證,局部驗證不需要在strutsxml裏面定義<constant>)在要驗證的類的包下建立 類名+properties ”file文件,在file文件中寫入

invalid.fieldvalue.age=age conversion error  表示當age這個屬性有驗證錯誤時用age conversion error代替錯誤輸出信息

 

MyEclipse file文件中中文不能保存的處理。在D盤新建一個test的記事本,然後把file中的信息拷貝到記事本中,然後點“開始——運行——cmd——native2ascii +記事本名+你要轉換的文件類型(test.properties)”

 

另一个更简单的方法是“开始——运行——cmd——native2ascii——回车——要解码的中文——回车”

 

15.添加action級別的錯誤信息——在jsp頁面中加 <s:actionerror/>輸出acton級別錯誤信息

 

16.(局部類型轉換)局部類型轉換要在需要轉換的action的同一個包下建立“action+-conversion.properties’”的file文件,文件中寫入:

point=com.test.converter.PointConverter  point表示要轉換的屬性,後面表示要用這個類對point進行轉換。這個是局部變量類型的轉換,因為該文件

的命名是以要轉換的類的名字+“-conversion.properties”命名的

 

(全局類型轉換)在src目錄下建立名為“xwork-conversion.properties”的file文件,在文件中寫入:

com.test.bean.point=com.test.converter.PointConverter

這個是全局的類型轉換,前面是要轉換的對象,後面是用該類進行類型轉換,全局類型轉換的

文件要在src目錄下,也就是要在class目錄下

 

 

    Struts2 拦截器

 

Struts2拦截器的三种实现方式:

1.  继承Interceptor类,其中包含三个方法:

public void init() {

       System.out.println("-------我被初始化了-拦截器1-------");

    }

 

    public String intercept(ActionInvocation invocation) throws Exception {

      

       System.out.print("-------被我拦截了-拦截器1-------");

      

       String result = invocation.invoke();

      

       return result;

    }

 

    public void destroy() {

       System.out.println("-------我被銷毀了-拦截器1-------");

    }

 

2.  继承 AbstractInterceptor类,其中包括一个拦截方法,初始化跟销毁默认:

public String intercept(ActionInvocation invocation) throws Exception {      

    String result = invocation.invoke();

   

    return result;

}

 

3.  继承MethodFilterInterceptor类,实现控制对指定方法的拦截:

protected String doIntercept(ActionInvocation invocation) throws Exception {    

       String result = invocation.invoke();

      

       return result;

      

}

             

    <param name="includeMethods">execute</param>

    <param name="excludeMethods">execute</param>

这两个是methodFileterInterceptor类里面的,其中includeMethods表示把要拦截的方法包含进来,有多个用逗号隔开,excludeMethods表示不拦截的方法。注意当这两个同时定义一个方法的时候,拦截的优先级大于不拦截的优先级

 

Struts2拦截器的特点:

 

定义拦截器栈有先后顺序,定义在前面的拦截器初始化先加载,但是关闭的时候是后关闭的。在struts.xml文件中如果action里面没有引入拦截器,则默认的加载Struts2默认的拦截器defaultStack,如需多个拦截器也在action中引入,拦截器跟拦截器栈的引用是相同的。都是通过<interceptor-ref name="defaultStack"></interceptor-ref>方式引入到action

 

 

  <!-- 配置拦截器 -->
     <interceptors>
      
      <interceptor name="myInterceptor" class="com.test.interceptor.Myterceptor">
       <param name="hello">china</param>
      </interceptor>
      
      <interceptor name="myInterceptor2" class="com.test.interceptor.MyInterceptor2">
      </interceptor>
      
      <interceptor name="myInterceptor3" class="com.test.interceptor.MyInterceptor3">
      </interceptor>
      
      <!-- 拦截器栈 -->
      <interceptor-stack name="myStack">
      
       <interceptor-ref name="myInterceptor"></interceptor-ref>
       
       <interceptor-ref name="defaultStack"></interceptor-ref>
       
      </interceptor-stack>
      
     </interceptors>

 

 

Struts2的校验框架

1.文件名为"类名+ '-validate'"的xml文件
2.验证xml文件必须跟类放在同一个包中
Check-test-validation.xml(Check是一个类,这样的意思是校验Check类中的test方法,方法被调用的时候他的验证也会被调用,所以最好针对方法进行校验)

3. <field name="password">
  <field-validator type="requiredstring">
   <param name="minLength">6</param>
   <param name="maxLength">10</param>
   <message>password should be between ${minLength} and ${maxLength}</message>
  </field-validator>
 </field>
 
 <!-- 日期验证 -->
 <field name="brithday">
  <field-validator type="requiredstring">
   <message>birthday should not be blank!</message>
  </field-validator>
  
  <field-validator type="date">
   <param name="min">2010-01-01</param>
   <param name="max">2010-03-01</param>
   <message>birthday should be betwent ${min} and ${max}</message>
  </field-validator>
 </field>
 
 
一个field对应一个表单元素

 

 

 

 

文件上傳在struts2。xml文件中的配置

<!-- struts2文件上传 -->
   <action name="strutsUpload" class="com.test.strutsupload.StrutsUpload">
    
    <result>/MyUploadOut.jsp</result>
    <result name="input">/MyUploadOut.jsp</result>
    
    
    <interceptor-ref name="fileUpload">
     <param name="maximumSize">409600</param>
     <param name="allowedTypesSet">application/msword</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
   </action>

分享到:
评论

相关推荐

    struts2学习笔记(完美总结)——转自OPEN经验库

    struts2学习笔记,非本人所写,但有学习的价值,总结的很好,分享一个!

    struts2学习笔记总结

    struts2学习笔记总结

    struts2学习笔记

    struts2学习笔记struts2学习笔记struts2学习笔记

    struts2学习笔记3数据类型转换

    struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换

    struts2学习笔记.doc

    本人学习struts2的笔记,希望大家可以多多学习以后共同交流

    struts2学习笔记(1)

    1. struts2框架的引入 1)把struts2的相关jar包导入到项目中去 2)把struts2框架的配置文件struts.xml复制粘贴到项目中的src下面(同时也可以把log4j.properties放到src下) 在这里我们主要是要的这个struts.xml文件...

    struts2学习笔记(详细文字)

    structs2很详细的学习笔记,structs2的建造,工作原理,例子,逐步讲解,纯文字的

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...

Global site tag (gtag.js) - Google Analytics