前言
struts框架提供给我们许多功能,比如页面传递的数据自动封装到action中的属性,传递的字符串类型数据自动转换成action类中定义的属性类型等,方便用户开发,提高开发效率。
请求数据自动封装
在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名属性。
还可以接收对象。
请求路径: http://localhost:8080/test/view.action?product.id=78
Struts2首先通过反射技术调用Product的默认构造器创建product对象,然后再通过反射技术调用product中与请求参数同名的属性的setter方法来获取请求参数值。
Struts2中如何传递请求参数给Action?
Struts2框架会将表单的参数以同名的方式设置给对应Action的属性中。
该工作主要是由Parameters拦截器做的。而该拦截器中已经自动的实现了。
小结:
一、Jsp表单填充到action中的属性
必须有setter方法
二、Jsp表单填充到action中的对象属性
必须有setter方法和getter方法
类型转换
在struts中,jsp提交的数据(字符串),struts会自动转换为Action中属性的类型,对于基本数据类型以及日期类型会自动转换。但是日期类型只支持yyyy-MM-dd
默认的转换器类为DefaultTypeConverter类在构造方法中定义了可以转换的基本类型。当该类中没有定义类型,不能满足用户的类型需要的时候,需要自定义类型转换器类。
小结:
String到基本数据类型的转换是自动的。
String到Date日期类型的转换是有条件的。
默认输入框输入的格式必须是yyyy-MM-dd,其他格式无法转换。
注意:如果类型自动转换错误,那么Struts2框架默
认会找名为input的result进行处理。因此开
发者需要在此Action的result配置中配置一个
名为input的result。前提: 继ActionSupport。
Struts2中如何配置自定义转换器?(局部的和全局的)
自定义转换器开发步骤:
1、自定义转换器继承StrutsTypeConverter
2、重写convertFromString和convertToString方法
3、注册转换器–写配置通知struts,自定义类在哪里
这里的配置文件分为局部转换器和全局转换器,如果定义局部转换器,只是对当前Action类有效,那么定义配置文件如下:
3.1 在指定要转换类型的Action所在包中建立配置文件命名规则如下:
Action名-conversion.properties
例如:UserAction-conversion.properties
3.2 在3.1文件中添加以下内容:
需要转换的字段名=自定义转换器类的权限定名(包括包名)
例如:user.birthday=com.nwpu.MyConvertor(这么一行数据即可)
如果是要配置全局的转换器类,供多个Action类使用,那么
3.注册全局的转换器
3.1 在项目src目录下建立以下固定格式的配置文件
xwork-conversion.properties —注意文件名必须固定(因为源码中定义规则)
3.2 在3.1文件中添加以下内容
需要转换的类类型=转换器类的权限定名
如: java.util.Date= com.nwpu.MyConvertor—–自定义类全称(包括包名)
案例:
需求:在用户注册时候会传递日期格式的数据,那么就必须多定义几种用户习惯的填写日期格式的类型进行转换。
自定义转换器类 MyConvertor.java
public class MyConvertor 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;
}
}
其他文件例如struts.xml配置,register.jsp,UserAction.java这里就省略了,有不会或者写的不对的地方可以私信我哦!