在该属性文件中对类型转换错误的品质举行定义

宗旨类型转换:

 图片 1

呈现层数据处理:

 List集合数据类型转换:

图片 2

 图片 3

private List<Material>materialList;//定义List类型变量

 

1|—– 类型转换可以

Set集合数据类型转换:

图片 4

 图片 5

 

private Set<Material>materialSet=new HashSet();//定义Set集合类型变量

如代码中所示”new HashSet()”1样。那是必须的,不然Struts
2不了解该变量是哪一种Set集合,那样系统会找不到在性质文件中定义的目录和要素对象类型。

 

                              |–基于OGNL表达式

自带很是提醒:

图片 6

 紫色有点的是<s:田野(field)error/>标签的不得了提醒,没点的是不行转换败北后自带的非常提醒。

 

                              |–能够支付协调的品种转换器

①些很是提醒定义属性文件:

<!————————-文件名:AddMaterialAction.properties——————->

#Action属性类型转换错误提醒

invalid.田野(field)value.material.bid=材料价格不合法输入

Action文件同目录下定义了名称为”ActionName.properties”的属性文件,在该属性文件中对类型转换错误的品质进行定义。那样设置后,系统就会在发出类型转换错误时在页面上展现属性文件中定义的类型转换错误提示音讯,不会显得在此之前运用田野error标签时显得的提醒新闻。

图片 7

 

                                   
Struts二的conventionError拦截器会自动处理项目转化器的不行

大局10分提醒定义属性文件:

<!————————-文件名:messageResource.properties———————–>

#类型转换提醒

xwork.default.invalid.田野先生value={0}类型转换错误~

在源代码根目录下定义了名字为”messageResource.properties”的属性文件,该文件是用来展现国际化目标而接纳的性质文件。但关于类型转换的不当定义也得以在该属性文件中定义。

图片 8

 

 

 

<wiz_tmp_tag id=”wiz-table-range-border” contenteditable=”false”
style=”display: none;”>

 

 

 

 

 

 

2|—– 数据校验分为

                        |–客户端校验

                        |–服务器端校验


1、内建的(字符串类型和以下体系的更换):

        boolean Boolean

        char  Character

        int    Integer    

        long    Long        

        float    Float    

        double    Double    

        Date    日期格式使用用户所在Locale的SHO凯雷德T情势

        数组  
 暗中认可数组元素是字符串,要是用户提供了自定义类型转换器,也得以是别的复合类型的数组

        集合  
 私下认可假定集合成分类型为String,并成立多少个新的ArrayList封装全部的字符串

 

二、基于OGNL的类型转换

       1) 对象

                    User成员变量

                            <s:textfield name=”user.name” label=”用户名”>

 

           
(使用那种格局时要专注:因为要运用反射成立User类实例,必须为该复合类提供无参构造器

                                                   
 通过user.name为属性赋值所以要求类里有setter方法,

                                                   
 Action里面要有getUser()方法)

 

       2)Map

            Map<String,User> users

                设置<s:textfield name=”users[‘one’].name”
label=”第one个用户名”/>

                访问<s:property value=”users[‘one’].name”/>

 

        

       3)Map

            List<User> users

                设置<s:textfield name=”users[0].name”
label=”第叁个用户名”/>

                访问<s:property value=”users[0].name”/>

 

三、钦命集合成分类型

       一)未有运用泛型钦命项指标List 集合

            通过点名局部类型转换文件来拍卖

                    List users 

                        ActionName-convention.properties(放在和Action类文件1律的任务)

                        文件里钦定:List集合属性的名号

                                             List集合里成分的类型

                                            

                             
Element_<ListPropName>=<ElementType>      

              eg.    Element_users=com.wj.app.domain.User

    

       贰)未有运用泛型内定项目标Map集合      
  

                    Map users 

                        ActionName-convention.properties

                              文件里钦命(key和value类型):

                               Key_<MapProName>=<KeyType>

                             
 Element_<MapPropName>=ValueType>

 

 

4、自定义类型转换器

       一)
落成OGNL里的TypeConverter接口,DefaultTypeConverter完结了该接口,所以能够继续该类,同等看待写convertValue()方法

 

 1  public class UserConverter extends DefaultTypeConverter
 2 {
 3     // 类型转换器必须重写convertValue方法,该方法需要完成双向转换
 4     public Object convertValue(Map context
 5         , Object value, Class toType)
 6     {
 7         // 当需要将字符串向User类型转换时
 8         if (toType == User.class )
 9         {
10             // 系统的请求参数是一个字符串数组
11             String[] params = (String[])value;
12             // 创建一个User实例
13             User user = new User();
14             // 只处理请求参数数组第一个数组元素,
15             // 并将该字符串以英文逗号分割成两个字符串
16             String[] userValues = params[0].split(",");
17             // 为User实例赋值
18             user.setName(userValues[0]);
19             user.setPass(userValues[1]);
20             // 返回转换来的User实例
21             return user;
22         }
23         else if (toType == String.class )
24         {
25             // 将需要转换的值强制类型转换为User实例
26             User user = (User) value;
27             return "<" + user.getName() + ","
28                 + user.getPass() + ">";
29         }
30         return null ;
31     }
32 }

 恐怕接续StrutsTypeConverter

 1 public class UserConverter extends StrutsTypeConverter
 2 {
 3     // 实现将字符串类型转换成复合类型的方法
 4     public Object convertFromString(Map context
 5         , String[] values , Class toClass)
 6     {
 7         // 创建一个User实例
 8         User user = new User();
 9         // 只处理请求参数数组第一个数组元素,
10         // 并将该字符串以英文逗号分割成两个字符串
11         String[] userValues = values[0].split(",");
12         // 为User实例赋值
13         user.setName(userValues[0]);
14         user.setPass(userValues[1]);
15         // 返回转换来的User实例
16         return user;
17     }
18     // 实现将复合类型转换成字符串类型的方法
19     public String convertToString(Map context, Object o)
20     {
21         // 将需要转换的值强制类型转换为User实例
22         User user = (User) o;
23         return "<" + user.getName() + ","
24             + user.getPass() + ">";
25     }
26 }

  2)注册品种转换器

                    二种办法:   

                            局部(对某个Action生效) 

                                        在一部分类型转换文件下加:<propName>=<ConverterClass>

                                                                       
  eg. user=com.wj.app.conventer.UserConverter

                            全局(对全部Action的一定项目属性都会收效)

                                        WEB-INF/classes下提供xwork-convention.properties文件

                                        加上<propType>=<ConverterClass>

                            jdk注解

                

            

                   
局地和大局分裂:局地类型转换器对点名属性进行转移,三本性能只调用贰次convertValue()方法。

                                             
 全局类型转换器对持有Action的特定类型起效能,由此或者对一脾性能调用数十次                                                             
 convertValue()方法(当该属性是叁个数组大概聚众时,里面种种成分都要调用一

                                                次这么些点子)。

    

 

5、处理Set集合

       
不提议在Action里应用Set集合属性,因为它冬季,所以struts二无法可相信转换和获得

        除非在Set集合里成分有3个标识属性

            

   Set users 

                        ActionName-convention.properties

                              文件里钦定:

                             
 KeyProperty_<SetPropName>=<KeyPropName>

                                             eg.
 KeyProperty__users=name

                             
访问:<SetPropName>(‘<indexPropValue>’)

                                              eg.  <s:property
value=”users(‘wj’).name”/>

                            (数组,list,map用的是方括号,那里是圆括号)

   

陆、类型转换中的错误处理

      一)类型转换错误  

     Struts二里struts-default.xml私下认可拦截器栈里定义了conventionError拦截器引用,该拦截器负责将对应错误封装成表单域错误,并将这个错误音讯放入ActionContext中,conventionError对转移非常处理后,会跳转到名字为input的逻辑视图。

       
为让Struts二类型转换的谬误机制和输入校验生效,必须让Action继承ActionSupport类,因为此类负责征集类型转换错误,输入校验错误,并将它们封装成FieldError对象,添加到ActionContext中。

         页面中选择<s:田野error/>标签可输出类型转换错误音讯。

         输出普通话错误提醒音讯:在国际化财富文件中加xwork.default.invalid.田野value={0}字段类型转换战败!

         对一定字段内定专门提示音讯:在Action的部分能源文件中加invalid.田野先生value.<propName>=<tipMsg>

                                         
                           
eg. invalid.田野同志.user.birth=寿辰音讯必须满足yyyy-mm-dd 格式

 

   

    二)集合属性转换错误

   
直接传入集合(users)会博得三个转移战败音信,分别传入集合成分(user[0]),会收获各类成分对应转换失利新闻。