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

2017-06-30  本文已影响0人  exmexm
一、接收请求参数

接收请求参数,按照参数的类型可以分为两种:
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
上一篇下一篇

猜你喜欢

热点阅读