获取请求的参数有两种方式:
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="游戏">
<label>睡觉</label><input type="checkbox" name="hobby" value="睡觉">
<label>美女</label><input type="checkbox" name="hobby" value="美女">
<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起作用
编写一个类型转换器
- 在当前的action类中的包中创建一个配置文件
- 文件命名规范:类名-convertor.properties(LoginAction-conversion.properties)
- 文件的内容为:属性名=类转换器类路径
- 代码
/**
* 将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
当两种转换器都定义的时候,优先调用局部转换器。