• Struts2(三)struts2处理请求参数及其校验


    一、Action处理请求参数
    1.Action处理请求参数三种方式
      1.1.Action 本身作为model对象,通过成员setter封装 (属性驱动 
    // 页面:
            用户名  <input type="text" name="username" /> <br/>
    // Action : 
            public class RegistAction1 extends ActionSupport {
                private String username;
                public void setUsername(String username) {
                    this.username = username;
                }
            }
     缺点:需要单独定义javaBean,将action中属性copy到javaBean中。 
        优点:简单。    
        这种方式 ,底层是通过反射来实现的。
     
    1.2.创建独立model对象,页面通过ognl表达式封装 (属性驱动)
    // 页面: 
            用户名  <input type="text" name="user.username" /> <br/>  ----- 基于OGNL表达式的写法
    // Action:
            public class RegistAction2 extends ActionSupport {
                private User user;
                public void setUser(User user) {
                    this.user = user;
                }
    
                public User getUser() {
                    return user;
                }
            }
      优点:简单,解决了第一种封装的问题
        缺点:在页面上使用了ognl表达式,页面不通用了。
        
        1.2.1 问题:这种方式,数据是怎样封装的?
         是通过struts2中的interceptor进行了数据封装.
          <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
    1.3.模型驱动(在开发中应用比较多)
       步骤:
      1.3.1.让action类实现ModelDriven
      1.3.2.重写getModel方法
      1.3.3.在action中实现化一个model对象,让getModel方法返回这个对象。
    // 页面:
            用户名  <input type="text" name="username" /> <br/> 
    // Action
    public class Login3Action extends ActionSupport implements ModelDriven<User> {
        private User user = new User();
        public User getModel() {
            return user;
        }
    }
     优点:解决了属性驱动存在的问题
     缺点:一次只能封装一个model对象.
        struts2 有很多围绕模型驱动的特性 
       * <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> 为模型驱动提供了更多特性
     
    2、封装数据到Collection和Map

    1) 封装数据到Collection 对象

    // 页面:
        产品名称 <input type="text" name="products[0].name" /><br/>
    // Action :
    
    public class ProductAction extends ActionSupport {
        private List<Product> products;
        public List<Product> getProducts() {
            return products;
        }
        public void setProducts(List<Product> products) {
            this.products = products;
        }
    }

    2) 封装数据到Map 对象

    // 页面:
                  产品名称 <input type="text" name="map['one'].name" /><br/>  =======one是map的键值
    // Action :
                  public class ProductAction2 extends ActionSupport {
                         private Map<String, Product> map;
                         public Map<String, Product> getMap() {
                                return map;
                         }
                         public void setMap(Map<String, Product> map) {
                                this.map = map;
                         }
                  } 
    三、Struts2类型转换(了解)
     
    四、请求参数校验

    1.校验的分类 :客户端数据校验 和 服务器端数据校验

    客户端数据校验 ,通过JavaScript 完成校验 (改善用户体验,使用户减少出错 )

    服务器数据校验 ,使用框架内置校验功能(struts2 内置校验功能 ) ----- 必须的

    2、struts2 支持校验方式:

    1)手工代码校验请求参数:在服务器端通过编写java代码,完成数据校验

        缺点:代码校验 不适用于 大型项目, 流程数据复杂时,开发量和维护量 都会很大 

    2)Xml配置方式数据校验(企业主流校验):XML配置校验(主流)  注解配置校验

    步骤一 :编写jsp

    步骤二 :编写Action 继承ActionSupport 或者 实现 Validateable 接口

    步骤三 :封装请求参数

          * 使用xml校验 必须提供get方法

    步骤四 :编写校验规则xml文件

        a 在Action所在包 编写 Action类名-validation.xml 对Action所有业务方法进行校验

        b 引入DTD

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

        c 内置校验器定义文件

                  xwork-core-2.3.7.jar 中 /com/opensymphony/xwork2/validator/validators/default.xml

       d 内建校验器

    * 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指定最大值)

    e    案例:

    required  必填校验器
    <field-validator type="required">
           <message>性别不能为空!</message>
    </field-validator>
    
    requiredstring  必填字符串校验器
    <field-validator type="requiredstring">
           <param name="trim">true</param>
           <message>用户名不能为空!</message>
    </field-validator>
    
    stringlength:字符串长度校验器
    <field-validator type="stringlength">
        <param name="maxLength">10</param>
        <param name="minLength">2</param>
        <param name="trim">true</param>
        <message><![CDATA[产品名称应在2-10个字符之间]]></message>
    </field-validator>
    
    int:整数校验器
    <field-validator type="int">
        <param name="min">1</param>
        <param name="max">150</param>
        <message>年龄必须在1-150之间</message>
    </field-validator>
    
    date: 日期校验器
    <field-validator type="date">
        <param name="min">1900-01-01</param>
        <param name="max">2050-02-21</param>
        <message>生日必须在${min}到${max}之间</message>
    </field-validator>
    
    url:  网络路径校验器
    <field-validator type="url">
        <message>主页地址必须是一个有效网址</message>
    </field-validator>
    
    email:邮件地址校验器
    <field-validator type="email">
        <message>电子邮件地址无效</message>
    </field-validator>
    
    regex:正则表达式校验器
    <field-validator type="regex">
         <param name="regexExpression"><![CDATA[^13d{9}$]]></param>
         <message>手机号格式不正确!</message>
    </field-validator>
    
    fieldexpression : 字段表达式校验
    <field-validator type="fieldexpression">
           <param name="expression"><![CDATA[(password==repassword)]]></param>
           <message>两次密码输入不一致</message>
    </field-validator>

    f    如何对指定的方法校验:格式  Action类名-ActionName(<action>元素name属性)-validation.xml

    例如 : 校验AddCustomerAction中execute方法  配置 <action name="addcustomer" .../> 校验文件名字: AddCusotmerAction-addcustomer-validation.xml

    3)自定义校验规则(了解一下就行)

     
     
     
     
     
     
  • 相关阅读:
    POJ2553 The Bottom of a Graph 强连通分量+缩点
    销售里面最猛的还是传销模式
    **Error 1 The type 'System.Web.Compilation.WCFBuildProvider' is ambiguous: it could come from assembly 'C:\Windows\Micro
    自定义Proxy 来做 rest wcf的客户端 与 WebChannelFactory<>的bug
    你知道吗string GetHashCode方法跟环境是有关的吗?
    查找默认的一个实体如果没有就找第一个的写法
    如何解决WCF REST 中 WebFaultException抛出的异常客户端WebChannelFactory无法处理的问题
    Google 的统计或将导致 IE7已终止操作
    类别进行排序的一个简单分析
    抢夺客户的战争
  • 原文地址:https://www.cnblogs.com/shelly0307/p/10765240.html
Copyright © 2020-2023  润新知