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

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

2017-03-07 21:15 316 查看
1Struts2中为什么要类型转换?

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

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

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

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

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

4、String到Date日期类型的转换是有条件的。

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

注意:

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

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

默认的编码方式是utf-8。

 

 

5、Struts自定义类型转换器

A、Struts2中如何自定义类型转换器?

      接口 -->
实现类

B、Struts2中如何配置自定义转换器?

局部类型转换器

      1、自定义转换器继承StrutsTypeConverter

      2、重写convertFromString和convertToString方法

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

 

 

 

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

      1、struts-default.xml

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

      2、StrutsConversionErrorInterceptor源码

      3、2的父类ConversionErrorInterceptor源码

      4、intercept()方法中的XWorkConverter源码

      5、 XWorkConverter

 

 

7、Struts2中类类型转换

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: