Struts2學(xué)習(xí)筆記(第二天)

.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ì)存在線(xiàn)程安全問(wèn)題?
                    不會(huì):因?yàn)槊恳淮握?qǐng)求,都是一個(gè)新的action。
                缺點(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ò)展(一般不用,原理為ognl表達(dá)式)

       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)換器中,必須拋出異常才可以。
類(lèi)型轉(zhuǎ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().
問(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().
數(shù)據(jù)校驗(yàn)

配置校驗(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.(action名稱(chēng)是配置文件中的的action的name屬性)
最后編輯于
?著作權(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)容

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