一、 Action中如何接受请求参数 parameter
* 实际开发中 不推荐在Action中 去使用Servlet API
1、三种方式:
1) 通过Action 成员变量, 自动接收请求参数
在Action中定义成员变量,变量名称和form元素 name属性一致,并为成员变量 提供setter
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> 完成参数封装
2)使用单独Model 对象,基于客户端 OGNL 参数名写法 完成封装
在Action 中创建 model成员变量
页面 用户名 <input type="text" name="user.username" /> <br/>
注意点:Action中 为model对象 提供 get和set方法
3)实现ModelDriven 接口 完成参数封装
Struts2 提供ModelDriven接口 ,通过该接口方法指定 Action 哪个成员是model
public class LoginAction4 extends ActionSupport implements ModelDriven<User>
public User getModel() {
return user;
}
注意点:Model对象必须手动实例化
方式二和方式三 在使用上本质区别 :方式二可以定义多个model 、方式三 只能在一个Action中定义一个Model对象
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> 提供单独拦截器 调用ModelDriven 实现
2、集合对象类型 数据封装 List 、Map
1) List封装
Action private List<User> users;
JSP <input type="text" name="users[0].username" />
2) Map封装
Action private Map<String, User> usermap;
JSP <input type="text" name="usermap[‘one‘].username" />
3、自定义类型转换器
struts2 内部提供很多类型转换器,但是当用户提交数据类型格式,是struts2 内部没有提供的 ------------- 需要自定义类型转换器
TypeConverter 定义 public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType);
子类 DefaultTypeConverter 定义 public Object convertValue(Map context, Object value, Class toType)
* context ognl上下文对象、value要转换值 、toType 转换目标类型
子类 StrutsTypeConverter 将 convertValue(Map context, Object value, Class toType) 拆分为两个方法
* convertFromString(Map context, String[] values, Class toClass) 将String 转换Action中复杂对象类型
* convertToString(Map context, Object o) 将Action中复制对象类型 转换 String 类型
自定义转换器 通常继承 DefaultTypeConverter 或者 StrutsTypeConverter
写转换器
public Object convertValue(Map context, Object value, Class toType) {
// 该方法 有两层含义
// 第一层,支持String 转换 复杂类型
// 第二层,支持复杂类型 转换String
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
if (toType == String.class) {
// 将复杂对象 转换 String 类型
Date date = (Date) value;
return dateFormat.format(date);
} else if (toType == Date.class) {
// 将String 转换 复杂数据类型
// value 是一个String 类型数组
String strDate = ((String[]) value)[0];
try {
return dateFormat.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
}
return super.convertValue(context, value, toType);
}
配置转换器 :
1) 局部配置 ,配置Action中含有特殊 属性类型,需要转换器 ActionClassName-conversion.properties (放到Action 所在包) ---- 针对Action的属性的
配置格式 : 属性名 = 转换器 buytime=cn.itcast.struts2.demo3.MyDateConvertor
* 局部配置只对当前Action 有效
2) 全局配置,让系统中所有java.util.Date 类型 都使用 cn.itcast.struts2.demo3.MyDateConvertor 配置 xwork-conversion.properties (放到src根目录) --- 针对类型
配置格式 :类型 = 转换器 java.util.Date = cn.itcast.struts2.demo3.MyDateConvertor
4. 类型转换错误 处理
如果在类型转换中 出现错误, 服务器端 会调用 addFieldError 添加错误信息, 自动跳转 逻辑视图input
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/> 负责类型转换错误的处理
1) 出错后,在<action> 内部配置 result name="input" 跳转到提交页面
2) 在提交页面,显示错误信息
<!-- 引入struts 标签库 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!-- 显示错误信息 -->
<s:fielderror></s:fielderror>
3) 在Action类所在包 创建 类名.properties 例如 cn.itcast.struts2.demo3.ProductAction 在 cn.itcast.struts2.demo3包下 创建 ProductAction.properties
信息配置格式: invalid.fieldvalue.属性名= 错误信息