1、Struts2中为什么要类型转换?
HTML表单采集数据 --> 提交表单 --> Action
底层依赖HTTP传递数据,而HTTP协议中 没有 “类型” 的概念. 每一项
表单输入只可能是一个字符串或一个字符串数组。因此在服务器端Action
中必须把 String 转换为业务需要的特定的数据类型
2、Struts2中如何传递请求参数给Action?
Struts2框架会将表单的参数以同名的方式设置给对应Action的属性中。
该工作主要是由Parameters拦截器做的。而该拦截器中已经自动的实现了
String到基本数据类型之间的转换工作。类似于: Beanutils工具。
3、String到基本数据类型的转换是自动的。
// 封装基本数据类型请求数据
private String name; // 必须给set / get可以不用给
private String pwd;
private int age;
private Date birth;
public void setName(String name) {
this.name = name;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public void setAge(int age) {
this.age = age;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public String getName() {
return name;
}
public String getPwd() {
return pwd;
}
public int getAge() {
return age;
}
public Date getBirth() {
return birth;
}
}
4、String到Date日期类型的转换是有条件的。
默认输入框输入的格式必须是yyyy-MM-dd,其他格式无法转换。
注意:
1、如果类型自动转换错误,那么Struts2框架默认会找名为input的result进行处理。因此开发者需要在此Action的result配置中配置一个名为input的result。前提: 继ActionSupport
2、如果封装请求参数的时候出现乱码问题,那么请查看表单的提交方式是否是post。Struts2
默认的编码方式是utf-8。
5、Struts自定义类型转换器
A、Struts2中如何自定义类型转换器?
接口 --> 实现类
B、Struts2中如何配置自定义转换器?
局部类型转换器
1、自定义转换器继承StrutsTypeConverter
2、重写convertFromString和convertToString方法
public class MyConverter extends StrutsTypeConverter {
// 新需求: 要求项目中要支持的格式,如: yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日..
// 先定义项目中支持的转换的格式
DateFormat[] df = { new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyyMMdd"),
new SimpleDateFormat("yyyy年MM月dd日") };
/**
* 把String转换为指定的类型 【String To Date】
*
* @param context
* 当前上下文环境
* @param values
* jsp表单提交的字符串的值
* @param toClass
* 要转换为的目标类型
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
// 判断: 内容不能为空
if (values == null || values.length == 0) {
return null;
}
// 判断类型必须为Date
if (Date.class != toClass) {
return null;
}
// 迭代:转换失败继续下一个格式的转换; 转换成功就直接返回
for (int i=0; i<df.length; i++) {
try {
return df[i].parse(values[0]);
} catch (ParseException e) {
continue;
}
}
return null;
}
@Override
public String convertToString(Map context, Object o) {
return null;
}
}
3、注册转换器
3.1 在Action类所在包中建立一个properties文件
命名规则Action名-conversion.properties
如:我的Action类名为:LFSenior
则新建一个LFSenior-conversion.properties文件
3.2 在3.1文件中添加以下数据
需要转换的字段名=自定义转换器类的权限定名
user.birthday=cn.lfsenior.c_conver.MyConversion
全局类型转换器
需要些一个转换器,给所有action用
全局类型转换器与局部类型转换器的区别就仅仅在配置上不同
3、注册转换器
3.1 在项目src目录下建立以下固定文件
xwork-conversion.properties
3.2 在3.1文件中添加以下数据
需要转换的类类型=转换器类的权限定名
如: java.util.Date= cn.lfsenior.c_conver.MyConversion
6、Struts2中局部和全局转换器的注册文件名为什么是固定的?
1、struts-default.xml
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
2、StrutsConversionErrorInterceptor源码
3、2的父类ConversionErrorInterceptor源码
4、intercept()方法中的XWorkConverter源码
5、 XWorkConverter
7、Struts2中类类型转换
有时候, 需要将表单字段映射到多个对象的不同属性上,form 标签可以被映射到Action中一个属性的属性.
register.jsp
<form action="${pageContext.request.contextPath }/user_register.action" method="post">
用户名:<input type="text" name="user.name"><br/>
密码:<input type="text" name="user.pwd"><br/>
年龄:<input type="text" name="user.age"><br/>
生日:<input type="text" name="user.birth"><br/>
<input type="submit" value="注册">
</form>
处理action事件类
// 对象类型,一定给get方法
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
// 处理注册请求
public String register() {
System.out.println(user.getName());
System.out.println(user.getPwd());
System.out.println(user.getAge());
System.out.println(user.getBirth());
return "success";
}