您的位置:首页 > 编程语言 > Java开发

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

2015-01-20 20:45 302 查看
一、 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.属性名= 错误信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: