Struts请求数据的自动封装以及类型转换

1Struts2中为什么要类型转换?

      HTML表单采集数据 --> 提交表单 -->  Action

      底层依赖HTTP传递数据,而HTTP协议中 没有 “类型” 的概念. 每一项

      表单输入只可能是一个字符串或一个字符串数组。因此在服务器端Action

      中必须把 String 转换为业务需要的特定的数据类型

2Struts2中如何传递请求参数给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;
}
}


4StringDate日期类型的转换是有条件的。

      默认输入框输入的格式必须是yyyy-MM-dd,其他格式无法转换。

注意:

1、如果类型自动转换错误,那么Struts2框架默认会找名为inputresult进行处理。因此开发者需要在此Actionresult配置中配置一个名为inputresult。前提: ActionSupport

2、如果封装请求参数的时候出现乱码问题,那么请查看表单的提交方式是否是postStruts2

默认的编码方式是utf-8

 

 

5Struts自定义类型转换器

AStruts2中如何自定义类型转换器?

      接口 --> 实现类

BStruts2中如何配置自定义转换器?

局部类型转换器

      1、自定义转换器继承StrutsTypeConverter

      2、重写convertFromStringconvertToString方法

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

 

 

 

6Struts2中局部和全局转换器的注册文件名为什么是固定的?

      1struts-default.xml

       <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>

      2StrutsConversionErrorInterceptor源码

      32的父类ConversionErrorInterceptor源码

      4intercept()方法中的XWorkConverter源码

      5XWorkConverter

 

 

7Struts2中类类型转换

有时候, 需要将表单字段映射到多个对象的不同属性上,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";
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值