1.框架:是一個半成品,能夠在其基礎上在次開發。
2.struts2框架:它是一個web層使用的mvc框架。
3.struts2核心 1.struts2核心 2.xwork核心
4.struts2入門:
1.導jar包
struts2/apps/strut_blank.war文件
2.須要配置struts2
1.web.xml
StrutsPrepareAndExecuteFilter
2.struts.xml
位置:src如下(clasess)
3.struts.xml文件中標籤
<package> 用於管理action
name:包名 惟一
namespace:與action的name屬性肯定訪問action的路徑. 默認值""
extends:繼承的包名 struts-default
<action> 聲明一個action
name:action名稱 在同一個包下不能重名
class:action類全名 ActionSupport
method:action類中的方法名 方法無參數,返回值爲String execute
<result> 結果視圖
name:與action的method方法的返回值匹配跳轉
type:跳轉方式
在struts-default.xml文件中定義
chain 請求轉發 action
dispatcher 請求轉發 頁面
redirect 重定向 頁面
redirectActiono 重定向 action
stream 下載.
5.struts2框架加載配置文件順序
1.default.properties
2.struts-default.xml struts-plugin.xml struts.xml
3.struts.properties
4.web.xml
6.定義常量
1.struts.xml
2.struts.properties
3.web.xml
7.struts2中action建立方式
1.pojo類
2.implements Action
3.extends ActionSupport
8.struts2中action方法訪問方式
1.method=xxx;
2.通配符
3.動態方法調用
9.關於在struts2中獲取Servlet API
1.ActionContext
ActionContext context=ActionContext.getContext();
2.使用注入
3.ServletActionContext
------------------------------------------------------------------------------------------------
1.struts2中獲取請求參數java
在struts2中action是什麼?(struts2是一個mvc框架)
V:jsp
M:action
C:action StrutsPrepareAndExecuteFilter
在struts2中獲取請求參數:
1.屬性驅動
1.直接將action作一個model,就能夠獲得請求參數.
問題1:action封裝請求參數,會不會存在線程安全問題?
不會:由於每一次請求,都是一個新的action。
缺點:須要單獨定義javaBean,將action中屬性copy到javaBean中。
優勢:簡單。
這種方式 ,底層是經過反射來實現的。
2.在action中聲明一個model。
private User user;提供get/set方法
在頁面上使用ognl來描述
<input type="text" name="user.username">
優勢:簡單,解決了第一種封裝的問題
缺點:在頁面上使用了ognl表達式,頁面不通用了。
問題:這種方式,數據是怎樣封裝的?
是經過struts2中的interceptor進行了數據封裝.
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
2.模型驅動(在開發中應用比較多)
步驟:
1.讓action類實現ModelDriven
2.重寫getModel方法
3.在action中實現化一個model對象,讓getModel方法返回這個對象。
public class Login3Action extends ActionSupport implements ModelDriven<User> {web
private User user = new User();正則表達式
public User getModel() {
return user;
}
}
優勢:解決了屬性驅動存在的問題
缺點:一次只能封裝一個model對象.
struts2 有不少圍繞模型驅動的特性
* <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> 爲模型驅動提供了更多特性express
--------------------------------------------------------------------------
擴展:
1.將數據封裝到List集合
頁面:
username1:<input type="text" name="users[0].username"><br>
password1:<input type="password" name="users[0].password"><br>
username2:<input type="text" name="users[1].username"><br>
password2:<input type="password" name="users[1].password"><br>
action類:
private List<User> users;
get/set方法
2.將數據封裝到Map集合
頁面:
username1:<input type="text" name="map['aaa'].username"><br>
password1:<input type="password" name="map['aaa'].password"><br>
username2:<input type="text" name="map['bbb'].username"><br>
password2:<input type="password" name="map['bbb'].password"><br>
action類:
private Map<String, User> map;
提供get/set
===================================================================================================
struts2中提供的類型轉換
在web中咱們使用beanutils直接將表單數據封裝到javaBean中。---類型轉換
struts2中action獲得請求參數,也能夠直接封裝到javaBean.
struts2 內部提供大量類型轉換器,用來完成數據類型轉換問題
boolean 和 Boolean
char和 Character
int 和 Integer
long 和 Long
float 和 Float
double 和 Double
Date 能夠接收 yyyy-MM-dd格式字符串
數組 能夠將多個同名參數,轉換到數組中
集合 支持將數據保存到 List 或者 Map 集合
例如:日期類型,咱們傳遞 yyyy-MM-dd yyyy年MM月dd日格式均可以,可是若是是yyyy/MM/dd
就會出現問題.
關於struts2中的類型轉換器:
struts2中的類型轉換器根接口是:com.opensymphony.xwork2.conversion.TypeConverter。
-------------------------------------------------------
自定義類型轉換器:
步驟:
1.建立一個類實現TypeConverter接口.
2.重寫接口中方法,實現類型轉換操做.
3.註冊類型轉換器.
詳解說明:
1.建立一個自定義類型轉換器
1.實現TypeConverter須要重寫
public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);
若是實現接口,這個方法參數太多(6個)
2.不推薦實現接口,能夠繼承 DefaultTypeConverter類
優勢:重寫的方法參數沒有那麼多
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
return convertValue(value, toType);
}
3.我的推薦使用 繼承DefaultTypeConverter類的一個子類StrutsTypeConverter.
緣由:在這個類中將從頁面傳遞的數據怎樣封裝,以及action中的數據怎樣在頁面上顯示作了分離.
public abstract Object convertFromString(Map context, String[] values, Class toClass);
public abstract String convertToString(Map context, Object o);
apache
2.怎樣註冊一個自定義類型轉換器.
1.局部--針對於action
配置文件所在位置以及名稱: 在Action類所在包 建立 Action類名-conversion.properties ,
配置文件書寫: 格式 : 屬性名稱=類型轉換器的全類名
2.局部--針對於model
配置文件所在位置以及名稱: 在model類所在包 建立 model類名-conversion.properties ,
配置文件書寫: 格式 : 屬性名稱=類型轉換器的全類名
3.全局
配置文件所在位置以及名稱:在src下建立一個xwork-conversion.properties
配置文件書寫: 格式: 要轉換的類型全名=類型轉換器的全類名
-----------------------------------------------------------------------------
注意:
對於struts2中類型轉換器,若是表單數據提交時,將數據向model封裝,出現了問題,會報錯:
No result defined for action cn.itcast.action.RegistAction and result input
上面的意思是說,在RegistAction的配置中沒有配置input結果視圖.
<action name="regist" class="cn.itcast.action.RegistAction">
<result name="input">/success.jsp</result>
</action>
若是配置了,出現類型轉換問題,就會跳轉到input指定的視圖。
問題:爲何會向input視圖跳轉?
是由於struts2中的攔截器(interceptor).
在struts2中的
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
用於記錄類型轉換問題
在struts2中
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
用於獲得問題,向input視圖跳轉。
關於錯誤信息展現:
經過分析攔截器做用,得知當類型轉換出錯時,自動跳轉input視圖 ,在input視圖頁面中 <s:fieldError/> 顯示錯誤信息
* 在Action所在包中,建立 ActionName.properties,在局部資源文件中配置提示信息 : invalid.fieldvalue.屬性名= 錯誤信息數組
若是是自定義類型轉換器,出現類型轉換問題,要跳轉到input視圖,在類型轉換器中,必須拋出異常才能夠。
========================================================================================================================
關於struts2提供的數據校驗
在開發中,請求參數是須要校驗的。
客戶端校驗---->js
服務器校驗---->java代碼。
struts2中提供的校驗-----服務器端校驗。
分紅兩種:
1.手動校驗(編碼校驗)
2.配置校驗(annotation,xml) 咱們講的是xml。
1.手動校驗:(瞭解)
要求:action類必須繼承自ActionSupport。須要重寫一個方法 validate
經過測試發如今action中重寫的validate方法執行了。而且是在請求處理方法(execute)以前執行的。
對於struts2提供的校驗,它也是經過攔截器實現的。
問題:在validate方法中怎樣存儲校驗錯誤信息?
在validate方法中 this.addFieldError(Sting name,String value);
問題:在頁面上怎樣獲取錯誤信息?(在input視圖上)
<s:fielderror> 展現全部錯誤信息
<s:fielderror fieldName="">展現特定名稱的錯誤信息.
------------------
問題:在同一個Action中有多個請求處理方法(login,regist)那麼有些方法是須要校驗的,有些是不須要的,怎樣處理?
解決方案:建立一個名稱叫 validate+請求處理方法名 例如:請求處理方法叫 regist() 校驗 的方法名 validateRegist().
-------------------------------------------------------------------------------------------------------------
2.配置校驗(xml)
struts2的校驗框架。
已經完成了校驗操做(作了不少校驗方法)。
而咱們在使用時,只須要將它們調用就能夠(經過配置文件)
要求:action類必須繼承自ActionSupport。
問題:配置文件怎樣配置?
位置:xml文件要與action類在同一個包下
名稱:action類名-validation.xml
約束: xwork-core-2.3.7.jar 中 xwork-validator-1.0.3.dtd 下
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
書寫:
1.根元素
<validators>
2.子元素
<field name="屬性名稱"></field>
3.<field>子元素
<field-validator type="校驗器"> 這個是指定校驗器
問題:校驗器有哪些?
xwork-core-2.3.7.jar 中 /com/opensymphony/xwork2/validator/validators/default.xml下
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
4.<field-validator>子元素
<message>錯誤信息</message>
5.<field-validator>子元素
<param name="">值</param>
用於指定校驗器中的參數.
------------------------------------------------------------------------------------------------
介紹:關於配置校驗中的校驗器:
* required (必填校驗器,要求被校驗的屬性值不能爲null)
* requiredstring (必填字符串校驗器,要求被校驗的屬性值不能爲null,而且長度大於0,默認狀況下會對字符串去先後空格)
* stringlength (字符串長度校驗器,要求被校驗的屬性值必須在指定的範圍內,不然校驗失敗,minLength參數指定最小長度,maxLength參數指定最大長度,trim參數指定校驗field以前是否去除字符串先後的空格)
* regex (正則表達式校驗器,檢查被校驗的屬性值是否匹配一個正則表達式,expression參數指定正則表達式,caseSensitive參數指定進行正則表達式匹配時,是否區分大小寫,默認值爲true)
* int(整數校驗器,要求field的整數值必須在指定範圍內,min指定最小值,max指定最大值)
* double(雙精度浮點數校驗器,要求field的雙精度浮點數必須在指定範圍內,min指定最小值,max指定最大值)
* fieldexpression (字段OGNL表達式校驗器,要求field知足一個ognl表達式,expression參數指定ognl表達式,該邏輯表達式基於ValueStack進行求值,返回true時校驗經過,不然不經過)
* email(郵件地址校驗器,要求若是被校驗的屬性值非空,則必須是合法的郵件地址)
* url(網址校驗器,要求若是被校驗的屬性值非空,則必須是合法的url地址)
* date(日期校驗器,要求field的日期值必須在指定範圍內,min指定最小值,max指定最大值)
-------------------------------------------------------------------------------------------
問題:經過配置校驗,怎樣處理在同一個action中存在多個請求處理方法校驗問題?
只須要將校驗xml文件名稱修改就能夠。
action類名-valication.xml 如今要對action類中某一個方法校驗。
action類名-action名稱-validation.xml.
====================================================================================== 安全