JavaEE----Action接受请求参数

一、 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.属性名= 错误信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值