Java技术文章程序员Java学习笔记

Struts2干货笔记——第二天

2017-05-23  本文已影响379人  深海鱼Q

目录

1. Struts2提供了三种数据封装的方式
2. 封装数据到Collection和Map
3. Struts2类型转换器
4. 类型转换器中的错误处理
5. 请求参数验证
6. 对action中的指定方法进行校验
Struts2提供了三种数据封装的方式
1. 属性驱动
2. 模型驱动(主流)

封装数据到Collection和Map

  1. 封装数据到Collection,常见于需要快速录入批量数据的场景
    页面:
    产品名称 <input type="text" name="products[0].name" />

    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;
         }
     }
    

页面:
产品名称 <input type="text" name="map['one'].name" />
-- 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类型转换器

当我们发送一个HTTP请求时,请求的内容都以字符串的形式发送给服务器,所以需要转换成Action里定义的类型,例如,如果你的Action类中有一个integer属性,你不需要执行任何操作,Struts会自动将请求参数转换为integer属性。对于大部分常用类型,无需创建转换器,Struts2内置了很多常见数据类型的转换器。

struts2中的类型转换器根接口是:com.opensymphony.xwork2.conversion.TypeConverter。

自定义类型转换器

Date类型的属性可以接收格式为2000-02-20的请求参数,但是如果要接收格式为20000220的请求参数,就必须要自定义类型转换器,否则struts2无法自动完成类型转换。

步骤:

  1. 创建一个类实现TypeConverter接口.
  2. 重写接口中方法,实现类型转换操作.
  3. 注册类型转换器.

** 创建自定义类型转换器的方法 **

  1. 实现TypeConverter,重写方法
    public Object convertValue(Map<String, Object> context, Object target,
    Member member, String propertyName, Object value, Class toType);
  2. 继承 DefaultTypeConverter类
    public Object convertValue(Map<String, Object> context, Object value, Class toType) {
    return convertValue(value, toType);
    }
  3. 继承DefaultTypeConverter类的一个子类StrutsTypeConverter(推荐)
    public abstract Object convertFromString(Map context, String[] values, Class toClass);
    public abstract String convertToString(Map context, Object o);

** 注册一个自定义类型转换器 **

  1. 局部--针对于action
    配置文件所在位置以及名称: 在Action类所在包 创建 Action类名-conversion.properties ,
    配置文件书写: 格式 : 属性名称=类型转换器的全类名
  2. 局部--针对于model
    配置文件所在位置以及名称: 在model类所在包 创建 model类名-conversion.properties ,
    配置文件书写: 格式 : 属性名称=类型转换器的全类名
  3. 全局
    配置文件所在位置以及名称:在src下创建一个xwork-conversion.properties
    配置文件书写: 格式: 要转换的类型全名=类型转换器的全类名


    举例.PNG

类型转换器中的错误处理

我们希望用户输入abc,def模式的字符串,输入的字符串包含一个英文逗号作为用户名和密码的分隔符,如果用户输入了多个英文逗号,或者没有输入英文逗号,都将引起系统异常,因为上面的类型转换器将无法正常解出用户名和密码,实际上,表现层数据涉及两个处理:数据校验和类型转换是紧密相关的,只有当输入数据时有效数据时,系统才可以进行有效的类型转换——当然,有时候即使用户输入的数据能进行有效转换,但依然是非法数据(假设需要输入一个人的年龄,输入200则是非法数据)。因此,可以进行有效的类型转换时基础,只有当数据完成了有效的类型转换后,下一步才去做数据校验。

Struts2提供了一个名为conversion-Error的拦截器,这个拦截器被注册在默认的拦截器栈中,我们查看Struts2框架的默认配置文件:struts-default.xml文件,
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>

通过分析拦截器作用,得知当类型转换出错时,自动跳转input视图 ,在input视图页面中 <s:fieldError/> 显示错误信息
在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息 : invalid.fieldvalue.属性名= 错误信息

请求参数验证

两种方式:

** 1. 手动校验(了解) **

** 2. 配置校验(重点) **
要求:action类必须继承自ActionSupport
配置文件:

** 系统提供的校验器:**

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[^13\d{9}$]]></param>
     <message>手机号格式不正确!</message>
</field-validator>
```
fieldexpression : 字段表达式校验
```
<field-validator type="fieldexpression">
       <param name="expression"><![CDATA[(password==repassword)]]></param>
       <message>两次密码输入不一致</message>
</field-validator>
```

**对action中的指定方法进行校验**
当校验文件的取名为ActionClassName-validation.xml时,会对action中的所有处理方法实施输入验证,如果只需要对action中的某个action方法校验,那么,校验文件的取名应该为ActionClassName-ActionName-validation.xml,**其中ActionName为Struts.xml中action的名称**。例如:
```
<action name="user_*" class="com.java.action.UserAction" method="{1}" >
        <result name="success">/WEB-INF/page/message.jsp</result>
        <result name="input">/WEB-INF/page/addUser.jsp</result>
</action>
```
在UserAction中有两个处理方法:
public String add() throws Exception{}
public String update() throws Exception{}
要对add()方法实施验证,校验文件取名为:UserAction-user_add-validation.xml
要对update()方法实施验证,校验文件取名为:UserAction-user_update-validation.xml
上一篇 下一篇

猜你喜欢

热点阅读