JAEE學(xué)習(xí)筆記(25)Struts2(2)

目錄

1.Action處理請(qǐng)求參數(shù)(重點(diǎn))

2.struts2類(lèi)型轉(zhuǎn)換(了解)

3.struts2請(qǐng)求參數(shù)校驗(yàn)(次重點(diǎn))


復(fù)習(xí):
1.框架:是一個(gè)半成品,可以在其基礎(chǔ)上在次開(kāi)發(fā)。
2.struts2框架:它是一個(gè)web層使用的mvc框架。
3.struts2核心  1.struts2核心  2.xwork核心
4.struts2入門(mén):
    1.導(dǎo)jar包
        struts2/apps/strut_blank.war文件
    2.需要配置struts2
        1.web.xml
            StrutsPrepareAndExecuteFilter
        2.struts.xml
            位置:src以下(clasess)
            
        3.struts.xml文件中標(biāo)簽
            <package> 用于管理action
                name:包名   唯一
                namespace:與action的name屬性確定訪問(wèn)action的路徑.  默認(rèn)值""
                extends:繼承的包名  struts-default
            <action> 聲明一個(gè)action
                name:action名稱(chēng)  在同一個(gè)包下不能重名
                class:action類(lèi)全名   ActionSupport
                method:action類(lèi)中的方法名  方法無(wú)參數(shù),返回值為String   execute
            <result> 結(jié)果視圖
                name:與action的method方法的返回值匹配跳轉(zhuǎn)
                type:跳轉(zhuǎn)方式
                    
                在struts-default.xml文件中定義
                    chain  請(qǐng)求轉(zhuǎn)發(fā)  action
                    dispatcher 請(qǐng)求轉(zhuǎn)發(fā) 頁(yè)面
                    redirect  重定向 頁(yè)面
                    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創(chuàng)建方式
    1.pojo類(lèi)
    2.implements Action
    3.extends ActionSupport
    
8.struts2中action方法訪問(wèn)方式
    1.method=xxx;
    2.通配符
    3.動(dòng)態(tài)方法調(diào)用
    
9.關(guān)于在struts2中獲取Servlet API
    1.ActionContext
        ActionContext context=ActionContext.getContext();
    2.使用注入
    3.ServletActionContext

1.struts2中獲取請(qǐng)求參數(shù)
在struts2中action是什么?(struts2是一個(gè)mvc框架)    
    V:jsp
    M:action
    C:action  StrutsPrepareAndExecuteFilter
    
在struts2中獲取請(qǐng)求參數(shù):
    1.屬性驅(qū)動(dòng)
        1.直接將action做一個(gè)model,就可以得到請(qǐng)求參數(shù).
            問(wèn)題1:action封裝請(qǐng)求參數(shù),會(huì)不會(huì)存在線程安全問(wèn)題?
                不會(huì):因?yàn)槊恳淮握?qǐng)求,都是一個(gè)新的action。(servlet在web容器(tomcat)里只會(huì)被實(shí)例化一次,在多請(qǐng)求時(shí),web容器會(huì)為每個(gè)請(qǐng)求從線程池分配一個(gè)線程,多個(gè)線程共享一個(gè)servlet的實(shí)例,因此servlet是線程不安全的,比如共享狀態(tài)變量)
            缺點(diǎn):需要單獨(dú)定義javaBean,將action中屬性copy到j(luò)avaBean中。 
            優(yōu)點(diǎn):簡(jiǎn)單。              
            這種方式 ,底層是通過(guò)反射來(lái)實(shí)現(xiàn)的。
            
        2.在action中聲明一個(gè)model。
            private User user;提供get/set方法
            
            在頁(yè)面上使用ognl來(lái)描述
            <input type="text" name="user.username">
            
            優(yōu)點(diǎn):簡(jiǎn)單,解決了第一種封裝的問(wèn)題
            缺點(diǎn):在頁(yè)面上使用了ognl表達(dá)式,頁(yè)面不通用了。
            
            問(wèn)題:這種方式,數(shù)據(jù)是怎樣封裝的?
                是通過(guò)struts2中的interceptor進(jìn)行了數(shù)據(jù)封裝.
                 <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
            
            
            
    2.模型驅(qū)動(dòng)(在開(kāi)發(fā)中應(yīng)用比較多)
        步驟:
            1.讓action類(lèi)實(shí)現(xiàn)ModelDriven
            2.重寫(xiě)getModel方法
            3.在action中實(shí)現(xiàn)化一個(gè)model對(duì)象,讓getModel方法返回這個(gè)對(duì)象。
            
            public class Login3Action extends ActionSupport implements ModelDriven<User> {

                private User user = new User();

                public User getModel() {
                    return user;
                }
            }
        優(yōu)點(diǎn):解決了屬性驅(qū)動(dòng)存在的問(wèn)題
        缺點(diǎn):一次只能封裝一個(gè)model對(duì)象.
        
         struts2 有很多圍繞模型驅(qū)動(dòng)的特性 
        * <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> 為模型驅(qū)動(dòng)提供了更多特性

--------------------------------------------------------------------------
擴(kuò)展:
    1.將數(shù)據(jù)封裝到List集合
        頁(yè)面:
            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類(lèi):
            private List<User> users;
            get/set方法
            
    2.將數(shù)據(jù)封裝到Map集合
        頁(yè)面:
            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類(lèi):
            private Map<String, User> map;
            提供get/set

===================================================================================

struts2中提供的類(lèi)型轉(zhuǎn)換
在web中我們使用beanutils直接將表單數(shù)據(jù)封裝到j(luò)avaBean中。---類(lèi)型轉(zhuǎn)換

struts2中action得到請(qǐng)求參數(shù),也可以直接封裝到j(luò)avaBean.

    struts2 內(nèi)部提供大量類(lèi)型轉(zhuǎn)換器,用來(lái)完成數(shù)據(jù)類(lèi)型轉(zhuǎn)換問(wèn)題 
    boolean 和 Boolean
    char和 Character
    int 和 Integer
    long 和 Long
    float 和 Float
    double 和 Double
    Date 可以接收 yyyy-MM-dd格式字符串
    數(shù)組  可以將多個(gè)同名參數(shù),轉(zhuǎn)換到數(shù)組中
    集合  支持將數(shù)據(jù)保存到 List 或者 Map 集合
    
    例如:日期類(lèi)型,我們傳遞  yyyy-MM-dd  yyyy年MM月dd日格式都可以,但是如果是yyyy/MM/dd
        就會(huì)出現(xiàn)問(wèn)題.
        
關(guān)于struts2中的類(lèi)型轉(zhuǎn)換器:
    struts2中的類(lèi)型轉(zhuǎn)換器根接口是:com.opensymphony.xwork2.conversion.TypeConverter。
    
-------------------------------------------------------
自定義類(lèi)型轉(zhuǎn)換器:
    
    步驟:
        1.創(chuàng)建一個(gè)類(lèi)實(shí)現(xiàn)TypeConverter接口.
        2.重寫(xiě)接口中方法,實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換操作.
        3.注冊(cè)類(lèi)型轉(zhuǎn)換器.
        
    詳解說(shuō)明:
        1.創(chuàng)建一個(gè)自定義類(lèi)型轉(zhuǎn)換器
            1.實(shí)現(xiàn)TypeConverter需要重寫(xiě)
                public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);
                如果實(shí)現(xiàn)接口,這個(gè)方法參數(shù)太多(6個(gè))
                
            2.不推薦實(shí)現(xiàn)接口,可以繼承 DefaultTypeConverter類(lèi)
                優(yōu)點(diǎn):重寫(xiě)的方法參數(shù)沒(méi)有那么多
                 public Object convertValue(Map<String, Object> context, Object value, Class toType) {
                        return convertValue(value, toType);
                }
    
            3.個(gè)人推薦使用 繼承DefaultTypeConverter類(lèi)的一個(gè)子類(lèi)StrutsTypeConverter.
                原因:在這個(gè)類(lèi)中將從頁(yè)面?zhèn)鬟f的數(shù)據(jù)怎樣封裝,以及action中的數(shù)據(jù)怎樣在頁(yè)面上顯示做了分離.
                
                  public abstract Object convertFromString(Map context, String[] values, Class toClass);
                  public abstract String convertToString(Map context, Object o);
    


        2.怎樣注冊(cè)一個(gè)自定義類(lèi)型轉(zhuǎn)換器.
            
            1.局部--針對(duì)于action
                 配置文件所在位置以及名稱(chēng):  在Action類(lèi)所在包 創(chuàng)建 Action類(lèi)名-conversion.properties , 
                 配置文件書(shū)寫(xiě):    格式 : 屬性名稱(chēng)=類(lèi)型轉(zhuǎn)換器的全類(lèi)名 
            2.局部--針對(duì)于model
                 配置文件所在位置以及名稱(chēng):  在model類(lèi)所在包 創(chuàng)建 model類(lèi)名-conversion.properties , 
                 配置文件書(shū)寫(xiě):    格式 : 屬性名稱(chēng)=類(lèi)型轉(zhuǎn)換器的全類(lèi)名 
            3.全局
                配置文件所在位置以及名稱(chēng):在src下創(chuàng)建一個(gè)xwork-conversion.properties
                配置文件書(shū)寫(xiě):  格式:  要轉(zhuǎn)換的類(lèi)型全名=類(lèi)型轉(zhuǎn)換器的全類(lèi)名 
                
    -----------------------------------------------------------------------------
    注意:
        對(duì)于struts2中類(lèi)型轉(zhuǎn)換器,如果表單數(shù)據(jù)提交時(shí),將數(shù)據(jù)向model封裝,出現(xiàn)了問(wèn)題,會(huì)報(bào)錯(cuò):
        No result defined for action cn.itcast.action.RegistAction and result input
        
        上面的意思是說(shuō),在RegistAction的配置中沒(méi)有配置input結(jié)果視圖.
        <action name="regist" class="cn.itcast.action.RegistAction">
            <result name="input">/success.jsp</result>
        </action>
        如果配置了,出現(xiàn)類(lèi)型轉(zhuǎn)換問(wèn)題,就會(huì)跳轉(zhuǎn)到input指定的視圖。
        
        問(wèn)題:為什么會(huì)向input視圖跳轉(zhuǎn)?
            是因?yàn)閟truts2中的攔截器(interceptor).
            
            在struts2中的
                 <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
                 用于記錄類(lèi)型轉(zhuǎn)換問(wèn)題
                 
            在struts2中
                 <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
                 用于得到問(wèn)題,向input視圖跳轉(zhuǎn)。
                 
        關(guān)于錯(cuò)誤信息展示:
                    
            通過(guò)分析攔截器作用,得知當(dāng)類(lèi)型轉(zhuǎn)換出錯(cuò)時(shí),自動(dòng)跳轉(zhuǎn)input視圖 ,在input視圖頁(yè)面中 <s:fieldError/> 顯示錯(cuò)誤信息    
            * 在Action所在包中,創(chuàng)建 ActionName.properties,在局部資源文件中配置提示信息 : invalid.fieldvalue.屬性名= 錯(cuò)誤信息

            
    如果是自定義類(lèi)型轉(zhuǎn)換器,出現(xiàn)類(lèi)型轉(zhuǎn)換問(wèn)題,要跳轉(zhuǎn)到input視圖,在類(lèi)型轉(zhuǎn)換器中,必須拋出異常才可以。

======================================================================================

關(guān)于struts2提供的數(shù)據(jù)校驗(yàn)
在開(kāi)發(fā)中,請(qǐng)求參數(shù)是需要校驗(yàn)的。
    客戶(hù)端校驗(yàn)---->js
    服務(wù)器校驗(yàn)---->java代碼。
    
struts2中提供的校驗(yàn)-----服務(wù)器端校驗(yàn)。

分成兩種:
    1.手動(dòng)校驗(yàn)(編碼校驗(yàn))
    2.配置校驗(yàn)(annotation,xml) 我們講的是xml。
    
1.手動(dòng)校驗(yàn):(了解)
    要求:action類(lèi)必須繼承自ActionSupport。需要重寫(xiě)一個(gè)方法 validate
    
    通過(guò)測(cè)試發(fā)現(xiàn)在action中重寫(xiě)的validate方法執(zhí)行了。并且是在請(qǐng)求處理方法(execute)之前執(zhí)行的。
    
    
    對(duì)于struts2提供的校驗(yàn),它也是通過(guò)攔截器實(shí)現(xiàn)的。
    
    問(wèn)題:在validate方法中怎樣存儲(chǔ)校驗(yàn)錯(cuò)誤信息?
    
        在validate方法中   this.addFieldError(Sting name,String value);
        
    問(wèn)題:在頁(yè)面上怎樣獲取錯(cuò)誤信息?(在input視圖上)
        <s:fielderror> 展示所有錯(cuò)誤信息
        
        <s:fielderror fieldName="">展示特定名稱(chēng)的錯(cuò)誤信息.
        
    ------------------  
    問(wèn)題:在同一個(gè)Action中有多個(gè)請(qǐng)求處理方法(login,regist)那么有些方法是需要校驗(yàn)的,有些是不需要的,怎樣處理?
        解決方案:創(chuàng)建一個(gè)名稱(chēng)叫   validate+請(qǐng)求處理方法名   例如:請(qǐng)求處理方法叫  regist()  校驗(yàn) 的方法名 validateRegist().
        
-------------------------------------------------------------------------------------------------------------
2.配置校驗(yàn)(xml)
    struts2的校驗(yàn)框架。
    已經(jīng)完成了校驗(yàn)操作(做了很多校驗(yàn)方法)。
    而我們?cè)谑褂脮r(shí),只需要將它們調(diào)用就可以(通過(guò)配置文件)
    
    要求:action類(lèi)必須繼承自ActionSupport。
    
    問(wèn)題:配置文件怎樣配置?
        
        位置:xml文件要與action類(lèi)在同一個(gè)包下
        名稱(chēng):action類(lèi)名-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">
        書(shū)寫(xiě):
            1.根元素
                <validators>
            2.子元素
                <field name="屬性名稱(chēng)"></field>     
        
            3.<field>子元素    
                <field-validator type="校驗(yàn)器"> 這個(gè)是指定校驗(yàn)器
                問(wèn)題:校驗(yàn)器有哪些?
                    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>錯(cuò)誤信息</message>
                
            5.<field-validator>子元素
                <param name="">值</param>
                用于指定校驗(yàn)器中的參數(shù).
    ------------------------------------------------------------------------------------------------
    介紹:關(guān)于配置校驗(yàn)中的校驗(yàn)器: 
                    
        * required (必填校驗(yàn)器,要求被校驗(yàn)的屬性值不能為null)
        * requiredstring (必填字符串校驗(yàn)器,要求被校驗(yàn)的屬性值不能為null,并且長(zhǎng)度大于0,默認(rèn)情況下會(huì)對(duì)字符串去前后空格)
        * stringlength (字符串長(zhǎng)度校驗(yàn)器,要求被校驗(yàn)的屬性值必須在指定的范圍內(nèi),否則校驗(yàn)失敗,minLength參數(shù)指定最小長(zhǎng)度,maxLength參數(shù)指定最大長(zhǎng)度,trim參數(shù)指定校驗(yàn)field之前是否去除字符串前后的空格)
        * regex (正則表達(dá)式校驗(yàn)器,檢查被校驗(yàn)的屬性值是否匹配一個(gè)正則表達(dá)式,expression參數(shù)指定正則表達(dá)式,caseSensitive參數(shù)指定進(jìn)行正則表達(dá)式匹配時(shí),是否區(qū)分大小寫(xiě),默認(rèn)值為true)
        * int(整數(shù)校驗(yàn)器,要求field的整數(shù)值必須在指定范圍內(nèi),min指定最小值,max指定最大值)
        * double(雙精度浮點(diǎn)數(shù)校驗(yàn)器,要求field的雙精度浮點(diǎn)數(shù)必須在指定范圍內(nèi),min指定最小值,max指定最大值)
        * fieldexpression (字段OGNL表達(dá)式校驗(yàn)器,要求field滿(mǎn)足一個(gè)ognl表達(dá)式,expression參數(shù)指定ognl表達(dá)式,該邏輯表達(dá)式基于ValueStack進(jìn)行求值,返回true時(shí)校驗(yàn)通過(guò),否則不通過(guò))
        * email(郵件地址校驗(yàn)器,要求如果被校驗(yàn)的屬性值非空,則必須是合法的郵件地址)
        * url(網(wǎng)址校驗(yàn)器,要求如果被校驗(yàn)的屬性值非空,則必須是合法的url地址)
        * date(日期校驗(yàn)器,要求field的日期值必須在指定范圍內(nèi),min指定最小值,max指定最大值)
        
    ------------------------------------------------------------------------------------------- 
    問(wèn)題:通過(guò)配置校驗(yàn),怎樣處理在同一個(gè)action中存在多個(gè)請(qǐng)求處理方法校驗(yàn)問(wèn)題?
    
        只需要將校驗(yàn)xml文件名稱(chēng)修改就可以。
        action類(lèi)名-valication.xml 現(xiàn)在要對(duì)action類(lèi)中某一個(gè)方法校驗(yàn)。
        
        action類(lèi)名-action名稱(chēng)-validation.xml.

=================================================================================

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 標(biāo)簽 如果要配置的標(biāo)簽,那么必須要先配置標(biāo)簽,代表的包的概念。 包含的屬性 name包的名稱(chēng),要求是唯一的,管理a...
    偷偷得路過(guò)閱讀 1,514評(píng)論 0 0
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代產(chǎn)品,是在 struts1和WebWork的...
    inke閱讀 2,339評(píng)論 0 50
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,628評(píng)論 18 399
  • 目錄 1. Struts2提供了三種數(shù)據(jù)封裝的方式 2. 封裝數(shù)據(jù)到Collection和Map 3. Strut...
    深海魚(yú)Q閱讀 1,022評(píng)論 3 10
  • 那天晚上,是我決定要搬走的日子,你來(lái)到這里,說(shuō)著和我商量,說(shuō)是可以先暫時(shí)出去住兩天,就兩天,之后就回來(lái)。說(shuō)的多么冠...
    況家家閱讀 194評(píng)論 1 2

友情鏈接更多精彩內(nèi)容