美文网首页
接收请求参数和自定类型转换器

接收请求参数和自定类型转换器

作者: exmexm | 来源:发表于2017-06-30 10:51 被阅读0次
    一、接收请求参数

    接收请求参数,按照参数的类型可以分为两种:
    1、采用基本类型接收请求参数(包含get/post)
    接收的方式就是,在Action类中定义与请求参数同名的属性,框架源码已经利用反射原理将同名的参数传入同名的属性中,所以必需有public的setter方法。

    2、采用复合类型接收请求参数
    和方法1参不多,不过参数变为复合型。
    Struts2首先通过反射技术调用Person默认的构造器创建person对象,然后再通过反射技术调用person中与请求参数同名的属性的setter方法来获取请求参数值。

    例子如下:
    配置文件的配置:

             <action name="index">
             <result>/WEB-INF/index.jsp</result>
             </action>
             
             <action name="logon" class="cn.itcast.action.LoginAction" method="login">
             <result name="success">/logon.jsp</result>
             </action>
    

    对应的index.jsp:

    <form action="logon">
                姓名:<input type="text" name="person.username"><br>
                密码:<input type="password" name="person.password"><br>
                <input type="submit" name="submit" value="提交"><br>
            </form>
    

    对应的处理Action:

    public class LoginAction {
        private Person person;  
        
        public Person getPerson() {
            return person;
        }
    
        public void setPerson(Person person) {
            this.person = person;
        }
    
        public String login() {
            return "success";
        }
    
    }
    

    对应的Bean类:

    public class Person {
        private String username;
        private String password;
        
        public String getUsername() {
            return username;
        }
        
        public void setUsername(String username) {
            this.username = username;
        }
        
        public String getPassword() {
            return password;
        }
        
        public void setPassword(String password) {
            this.password = password;
        }
        
        
    }
    

    对应的logon.jsp:

    <body>
    
    hello,${person.username }<br>
    密码是:${person.password }
    </body>
    
    二、自定义类型转换器

    <1>定义局部类型转换器
    日期类作为特殊类型,Struts2只有对xxxx-xx-xx的String类型才能自动转换为日期类,当是非该种格式类型的日期,我们需要自定义类型转换器。
    例如我们有一个person对象,含有生日属性,类型为Date。
    1、此时可以编写一个DateConverter类继承DefaultTypeConverter,重写里面的方法convertValue.
    2、可以将上面的类型转换器注册为局部类型转换器:
    在Action类所在的包下放置ActionClassName-conversion.prperties文件,ActionClassName是Action的类名,后面的-conversion.properties是固定写法,对于本例而言,文件的名称应该为LoginAction-conversion.properties,
    且文件里面的内容是

    person.birthday=cn.winney.type.converter.DateTypeConverter
    

    一般内容的格式都是:
    属性名称=类型转换器的全类名(即包名加类名)

    其中步骤1的代码是:

    import java.util.Date;
    import java.util.Map;
    
    import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
    
    public class DateTypeConverter extends DefaultTypeConverter {
    
        @Override
        public Object convertValue(Map<String, Object> context, Object value, Class toType) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
            try {
                if(toType == Date.class) {//将字符串类型转换为Date类型
                    String[] params = (String[])value;//request.getParameterValus()
                    return dateFormat.parse(params[0]);
                } else if(toType == String.class) {
                    Date date = (Date)value;
                    return dateFormat.format(date);
                }
            } catch (ParseException e) {
                System.out.println("转换出错!");
            }
            System.out.println("null那你呢");
            return null;
        }
    

    需要注意的是:
    Person里面的生日属性的类型Date要和转换的Date来自同一个包~

    <2>定义全局类型转换器
    全局类型转换器和局部类型转换器一样,都是要定义类型转换类,然后不一样的就是配置文件的命名和内容配置。
    要将该类型注册为全局类型转换器:
    在WEB-INF/classes(即放在src下就好)放置xwork-conversion.properties文件。在properties文件中的内容为:
    待转换的类型=类型转换器的全类名
    对于本例就是:

    java.util.Date=cn.winney.conversion.DateConverter
    

    相关文章

      网友评论

          本文标题:接收请求参数和自定类型转换器

          本文链接:https://www.haomeiwen.com/subject/seevcxtx.html