Struts2笔记(四)请求参数的获取和类型转换

获取请求的参数有两种方式:

1、属性驱动

直接将action做一个model,就可以得到请求参数

html

<form action="test/login.do" method="post">
	<label>编号:</label><input type="text" name="id"><br/><br/>
	<label>名字:</label><input type="text" name="name"><br/><br/>
	<label>密码:</label><input type="password" name="pwd"><br/><br/>
	<label>用户名字:</label><input type="text" name="user.name"><br/><br/>
	<label>爱好:</label><br/><br/>
	<label>游戏</label><input type="checkbox" name="hobby" value="游戏">&nbsp;&nbsp;
	<label>睡觉</label><input type="checkbox" name="hobby" value="睡觉">&nbsp;&nbsp;
	<label>美女</label><input type="checkbox" name="hobby" value="美女">&nbsp;&nbsp;
	<button type="submit">登录</button>
</form>

action类

public class LoginAction {
//数据类型自动转换
private int id;
private String name;
private String pwd;

//对象属性自动封装
private UserBean user;
private String[] hobby;
/*
如果使用对象属性,在html中的name属性中要使用对象.属性-->user.name
*/



//中间省略了get和set方法。getter,setter方法不能少

public String execute() {
	System.out.println("id:"+id);
	System.out.println("name:"+name);
	System.out.println("pwd:"+pwd);
	System.out.println("user.name:"+user.getName());
	
	if(hobby!=null) {
		System.out.println("爱好为:");
		for (String string : hobby) {
			System.out.println(string);
		}
	}
	
	return "success";
}

这种方式存在的问题:
1、action封装参数,会不会存在线程安全问题。
答:每一次请求都是一个新的action,不存在线程安全问题。
缺点:需要单独定义javaBean,将action中的属性copy到javaBean中

2、以模型为驱动

页面不变,创建一个新action类,实现ModelDriven接口

public class RegisterAction implements ModelDriven{
	//这个bran对象必须new出来
	private StudentBean stu = new StudentBean();
	@Override
	public Object getModel() {
	//接口的方法,返回需要封装的对象
		return stu;
	}

	public String execute() {
		System.out.println(stu);
		return "success";
	}
}

student对象

public class StudentBean {
	//数据类型会自动转换(如果可以的话,类型异常那么属性会为null)
	//这里使用的默认的转换器,也可以自己定义
	private int id;
	private String name;
	private String pwd;
	//对象属性自动封装
	private UserBean user;
	private String[] hobby;
}

Data类型也可以自动转换,但是只能转换xxxx-xx-xx的格式。如果需要其他格式需要自己写转换器。

自动类型转换器

1、局部自动类型转换器

  • 类型转换器是一个普通的类,要注册才能运行
  • 只对当前action起作用

编写一个类型转换器

  1. 在当前的action类中的包中创建一个配置文件
    • 文件命名规范:类名-convertor.properties(LoginAction-conversion.properties)
    • 文件的内容为:属性名=类转换器类路径
  2. 代码
/**
 * 将java.util.Date 转为  xxxx-xx-xx
 * 将xxxx-xx-xx  转为 java.util.Date
 */
public class MyDateConvertor extends DefaultTypeConverter{

/**
 * context:ognl上下文对象
 * value:要转化的值
 * toType:转化为什么类型
 */
@Override
public Object convertValue(Map<String, Object> context, Object value, Class toType) {

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    //将字符串转为java.util.Date
    if(toType==Date.class) {
        String tempDate = ((String[])value)[0];
        try {
            return df.parse(tempDate);
        } catch (ParseException e) {
            // 这个错误只会在后台打印
            e.printStackTrace();
        }
    }else {
        //将java.util.Date转字符串
        Date da = (Date) value;
        return df.format(da);
    }
    return null;
}
}

注意
如果使用属性驱动是可以获取数据的,使用日期的类型转换器也没有问题,但是使用ModelDriven类型驱动就无法转换了。
因为ModelDriven优先params拦截器执行,也就是在接收数据的时候参数还没有转换就被ModelDriven赋给bean对象了。
在这里插入图片描述

2、全局类型转换器

在src下创建名为:xwork-conversion.properties ,里面写我们要转换的类

java.util.Date=com.project.convertor.MyDateConvertor

当两种转换器都定义的时候,优先调用局部转换器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值