Struts2學習筆記
一.Struts1中存在的缺陷:
a. 支持的表示層技術單一,只支持jsp
b. Servlet API严重耦合,难于测试。其中servlet中的mapping, request,response,form四个参数,其中request,response通常由web容器负责
实例化,HttpServletRequest和HttpServletResponse属于web服务器,因此一旦脱离web服务器,acion的测试非常困难
c. 代码严重依赖于struts1 API,struts1的Action的每个类都要继承action的基类,当代码要重构的时,这些action类将没有利用价值
二、Struts2由三個部份組成:
FilterDispatcher:FilterDispatcher是struts2框架的核心控制器,該控制器作為一個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類中還應該包含get,set方法
由於系統是通過getter,setter方法來處理請求參數的,而不是通過屬性來處理請求參數,所以action是否包含屬性并不重要,
重要的是有getter和setter方法
四. 一旦在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.回调Action的execute方法,该execute方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据保存到数据库,也可以从数据库中
检索信息。实际上,因为Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求
5.Action的execute方法处理结构信息将被输出到浏览器中,可以是HTML页面,图像,也可以是文档等
七. Struts2框架是一個高度可擴展性的框架,框架的大部份核心組件,Struts2并不是直接以硬編碼的方式寫在代碼中,而是以自己的IOC(控制反轉)
容器來管理框架的核心組件,
八. Struts2配置文件問題:因為Struts2的配置文件是從上到下處理的,所以父包應該在子包的前面
九. Struts2的標籤庫定義文件包含在Struts2-core-2.206.jar文件中Struts-tag。Tld
十. Struts2中action類繼承Action與不繼承Action的區別:
繼承Action則execute方法可以返回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.(局部驗證,局部驗證不需要在struts、xml裏面定義<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学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...
### Struts2学习笔记知识点详解 #### 一、Struts2框架的基本引入步骤 ##### 1. 导入Struts2相关Jar包 在引入Struts2框架时,首先需要将Struts2的相关Jar包导入到项目的类路径中。这些Jar包通常包括核心库以及其他...
以上就是Struts2学习笔记中涵盖的主要知识点,这些内容涵盖了从基础到进阶的应用,对于理解和掌握Struts2框架至关重要。尽管对于初学者来说可能有些复杂,但随着深入学习,你会发现Struts2的强大和实用性。
在Struts2中,学习笔记通常会涵盖以下几个关键概念: 1. **源代码查看和Javadoc**:开发者可以通过查看源代码来理解Struts2的工作原理,而Javadoc则提供了API文档,帮助理解类和方法的功能。 2. **包(Package)和...
Struts2是一个强大的Java web应用程序开发框架,它遵循Model-View-Controller (MVC)设计模式,用于构建可维护性和可扩展性高的企业级应用。本文将深入探讨Struts2的核心概念,包括Action、Result、配置文件、OGNL与...
张龙圣思园的Struts2学习笔记,无疑为Java开发者提供了一份宝贵的参考资料,它可能涵盖了Struts2的基础概念、核心组件、配置方式以及实战技巧。 首先,让我们深入了解Struts2的核心特性。Struts2是MVC(Model-View-...
本笔记将全面总结Struts2的核心概念、主要功能以及实际开发中的应用。 一、Struts2概述 Struts2是Apache软件基金会下的一个开源项目,它继承了Struts1的优点并解决了其存在的问题,如性能和灵活性。Struts2的核心是...