Struts2的类型转换

来源:互联网 发布:切图都有哪些软件 编辑:程序博客网 时间:2024/04/27 17:58
Struts2的类型转换:    (HTTP请求参数与java强类型的转换,只要把HTTP参数命名为合法OGNL表达式,就可以充分利用Struts2的类型转换机制
             如果类型转换中出现未知异常,Struts2的conversionError拦截器会自动处理该异常并在页面上生成提示信息)
        内建的类型转换器:    (struts2已经内建了字符串和如下类型之间相互转换的转换器)
            >boolean和Boolean
            >char和Character
            >inthe和Integer
            >long和Long
            >float和Float
            >double和Double
            >Date            (日期格式使用用户请求所在Local的SHORT格式)
            >数组            (默认情况下,数组元素是字符串,如果用户提供了自定义类型转换器,也可是其他复合类型的数组)
                        (按照元素类型单独转换每一个元素,但如果数组元素的类型本身无法完成转换,将出现类型转换错误)
            >集合            (默认情况下,假定集合元素类型为String,并创建一个新的ArrayList封装所有的字符串)

        基于OGNL的类型转换:    (Struts2允许以另一种简单方式将请求参数转换为复合类型)


public class User{private String name;private String pass;//name和pass属性的setter和getter方法...}public class LoginAction implements Action{private User user;//user的setter和getter方法public String execute()throws Exception{ ...}}

<s:form action="login"><!-- 该表单域封装的请求参数名为user.name --><s:textfield name="user.name" label="用户名"/><!-- 该表单域封装的请求参数名为user.pass --><s:textfield name="user.pass" label="密码"/>...</s:form>

注意:
                        >因为Struts2将通过反射来创建一个复合类(User类)的实例,因此必须为该User类提供无参数构造器
                        >如果使用user.name的形式为Action实例的user的name属性赋值,则必须为user的name属性提供setter方法

public class LoginAction implements Action{private Map<String , User> users;//users属性的setter和getter方法    public String execute()throwss Exception    {      ...    }    }

<s:form action="login">    <s:textfield name="users['one'].name" label="第one个用户名"/>    ...    </s:form>

指定集合元素类型:        (对于集合如果不指定泛型,必须通过局部类型转换文件指定集合类型)


public class LoginAction implements Action{private List users;//(没有指定泛型,必须通过局部类型转换文件指定)//users属性的setter和getter方法public String execute()throws Exception{ ...}}

                Element_users=org.wang.app.action.User    (局部类型文件放在与Action类相同位置)

                局部类型转换文件名为:    ActionName-conversion.properties    (ActionName为类名,-conversion.properties为固定部分)
                List:
                局部类型文件格式: Element_ListPropName=ElementType        (Element是固定的)
                Map:
                局部类型转换文件格式:Key_MapPropName=KeyType            (Key是固定的)
                Element_MapPropName=ValueType        (Element是固定的)

自定义类型转换器:
            提供类型转换器:    
                1.    (通常需要继承DefaultTypeConverter重写convertValue方法)

public class UserConverter extends DefaultTypeConverter {//类型转换器必须重写convertValue方法,该方法需要完成双向转换public Object convertValue(Map context, Object value, Class toType){//当需要将字符串向User类型转换时if (toType == User.class ){  ...}else if(toType == String.class){...}return null}}

convertValue方法参数和返回值意义:
                        >第一个参数:context是类型转换环境的上下文
                        >第二个参数:value是需要转换的参数,随着转换方向的不同而不同
                        >第三个参数:toType是转换后的类型
                    (convertValue接收需要转换的值,需要转换的目标类型为参数,然后返回转换后的目标值)


             2.    (通过继承StrutsTypeConverter抽象类,该类是DefaultTypeConverter的子类convertValue分解为两个方法,更简单)

public class UserConverter extends StrutsTypeConverter {//实现将字符串类型转换成复合类型的方法public Object convertFromString(Map context, String[] values , Class toClass){//创建一个User实例...return user;}//实现将复合类型转换成字符串类型的方法public String convertToString(Map context, Object o){//将需要转换的值强制类型转换为User实例...return "<" + user.getName() + ","+ user.getPass() + ">";}}

                    方法参数与返回值与上边相同


注册类型转换器:    (必须将类型转换器注册在Web应用中,Struts2框架才可以正常使用该类型转换器)
                1.局部类型转换器:    (使用局部类型转换文件指定,局部类型转换文件命名为ActionName-conversion.properties,与Action在相同位置
                             只对属性转换一次)
                    propName=ConverterClass
                    例: user=org.wang.app.converter.UserConverter
                2.全局类型转换器:    (不是对指定Action的指定属性起作用,而是对指定类型起作用,转换文件为xwork-conversion.properties,放在类加载路径下即可
                             如果一个Action是数组或集合,有几个元素就转换几次)
                    propType=ConverterClass
                    例:org.wang.app.domain.User=org.wang.app.converter.UserConverter

处理Set集合:    (由于Set集合的无序性,Struts2无法准确读取Set集合里的元素,除非Set集合里的元素有一个标识属性)   

public class LoginAction extends ActionSupport{private Set users;private Date birth;//user属性的setter和getter方法//birth属性的setter和getter方法...}public class UserConverter extends StrutsTypeConverter {public Object convertFromString(Map context, String[] values, Class toClass){Set result = new HashSet();                  .....                return result;}public String convertToString(Map context, Object o){//如果待转换对象的类型是Set...}}public class User{private String name;private String pass;//name属性的setter和getter方法//pass属性的setter和getter方法...public boolean equals(Object obj){...(标识属性为name)}//根据name属性来计算hashCode。public int hashCode(){...}}

LoginAction-convertion.properties:    (该文件与LoginAction在同一路径下)
                    #指定users属性的类型转换器是UserConverter
                    users=org.crazyit.app.converter.UserConverter
                    #指定users集合属性里集合元素的索引属性是name
                    KeyProperty_users=name
                
                <!-- 访问user集合属性里索引属性值为crazyit.org的元素的name属性-->(Set集合用的是圆括号,数组、List、Map用的是方括号)
                用户crazyit.org的用户名为:<s:property value="users('crazyit.org').name"/><br/>
                <!-- 访问user集合属性里索引属性值为crazyit.org的元素的pass属性-->
                用户crazyit.org的密码为:<s:property value="users('crazyit.org').pass"/><br/>
            通过局部类型转换文件来指定Set集合元素的标识属性:
                    keyProperty_SetPropName=keyPropName
                    
        类型转换中的错误处理:(当Struts2的类型转换器出现错误,conversionError拦截器负责将对应错误封装成表单域错误(FieldError),并将错误信息放入ActionContext中)
                       (当conversionError拦截器对转换异常处理后,系统会跳转到名为input的逻辑视图)
                       (为了让Struts框架处理类型转换的错误,以及使用数据校验机制,Action类应该继承ActionSupport,该类为类型转换和数据校验做了许多工作)
                处理类型转换错误:


public class LoginActionextends ActionSupport{private User user;private String tip;//user属性的setter和getter方法//tip属性的setter和getter方法...//execute方法}

<constant name="struts.custom.i18n.resources" value="mess"/><package name="lee" extends="struts-default"><action name="login" class="org.crazyit.app.action.LoginAction"><!-- 配置名为input的逻辑视图,当转换失败后转入该逻辑视图 --><result name="input">/input.jsp</result><result name="success">/welcome.jsp</result><result name="error">/welcome.jsp</result></action></package>

显示错误提示信息:
                        如果转换错误会进入input.jsp页面,默认<s:fielderror/>标签会输出Invalid field value for field xxx的错误提示信息,其中xxx是Action中属性名
                        要改变错误提示信息,只需在国际化资源文件中增加如下一行:
                            xwork.default.invalid.fieldvalue={0}字段类型转换失败!
                    对特定字段指定特别提示信息:    (可通过在Action局部资源文件中增加如下一行)
                        invalid.fieldvalue.propName=tipMsg    (此处propName可支持OGNL表达式)
                        例:    (改变birth属性类型转换失败提示信息)

public class LoginAction extends ActionSupport{private User user//user的setter和getter方法...}

                 LoginAction_zh_CN.properties:    (局部资源文件,与Action相同路径下)
                                invalid.fieldvalue.user.birth=生日必须满足yyyy-MM-dd格式

处理集合属性的转换错误:


public class LoginAction extends ActionSupport{private List<User> users;//users属性的setter和getter方法...}

有两种方式传入请求参数:
                    >只传入一个users请求参数,该请求参数是字符串数组形式
                    >分别传入多个uses[1],users[1]...,这种形式将会充分利用OGNL表达式类型转换规则


<s:form action="login"><s:iterator value="{0, 1, 2}" status="stat"><!-- 将会依次生成多个请求参数 --><s:textfield name="users[%{#stat.index}]" label="第%{#stat.index}个用户信息"/></s:iterator><tr><td colspan="2"><s:submit value="转换" theme="simple"/><s:reset value="重填" theme="simple"/></td></tr></s:form>


0 0