Struts2实现类型转换器(十五)上

简介: Struts2实现类型转换器(十五)

一. Struts2的类型转换器


一. 一 类型转换器出现的原因


在Servlet+JSP的开发过程中,我们常常需要手动的去转换传入的值的类型,


因为前端form表单里,所有传入的类型都会被默认成String 或者是String [] 。


所以,即使是 年龄 age 这样的int 字段传入时,也同样先需要进行类型转换:


String ageForm=request.getParameter("age");
int age=Integer.parseInt(ageForm);


对于每一个传入的参数,除了 String 和 String[] 数组外,都需要进行类型转换,如常见的 int,double,Date 等类型, 还有一些我们自定义的类型转换。 这样的操作,是枯噪的。 所以 Struts2 框架封装了一些常见的类型转换,来简化参数的接收。


这些类型封装器,在 com.opensymphony.xwork2.conversion.impl 包下面。


一.二. Struts2提供的 内置的类型转换器


引用于: https://blog.csdn.net/qq_20453707/article/details/50825497


20190327203128407.png


包括基本类型的转换,Date,数组和集合的转换。 Struts2可以通过类型转换器,基本上可以满足常见的一些需求。


其对应的类型转换器实现为:


20200419111933124.png


然而,这些在实际大型项目开发中,是不够的, 用户需要自己定义类型转换器。


可以通过 实现 DefaultTypeConverter 和 StrutsTypeConverter 进行实现 自定义类型转换。


二. 自定义类型转换 DefaultTypeConverter


二.一 所用到的接口 API


二.一.一 TypeConverter 接口


类型转换的时候,用的是 TypeConverter 接口.


是xwork下的接口。


在 com.opensymphony.xwork2.conversion.TypeConverter包下


 public abstract interface TypeConverter
{
 public static final Object NO_CONVERSION_POSSIBLE = "ognl.NoConversionPossible";
  public static final String TYPE_CONVERTER_CONTEXT_KEY = "_typeConverter";
  public abstract Object convertValue(Map<String, Object> paramMap,
   Object paramObject1, Member paramMember, String paramString, Object paramObject2, Class paramClass);
}


二.一.二 DefaultTypeConverter 默认类型转换接口


DefaultTypeConverter


里面定义了基本的类型转换。


public class DefaultTypeConverter
 implements com.opensymphony.xwork2.conversion.TypeConverter{
  ...
  //方法里面,通过判断参数的类型,进行不同的处理 
  ...
 }


二.二 实现Date 类型的转换


Struts2提供的 Date 类型转换器, com.opensymphony.xwork2.conversion.impl.DateConverter,需要符合一定的格式, Short 格式, 一般不使用默认的Date 类型转换。


二.二.一 创建 MyAction1 控制器


package com.yjl.web.action;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
/**
@Date: 2019年3月27日
@author: 两个蝴蝶飞
@Description: 简单的类型转换
*/
public class MyAction1 extends ActionSupport{
  private static final long serialVersionUID = 1L;
  private Date birthday;
  @Override
  public String execute() throws Exception {
     //这个是对象
    System.out.println("输出生日为:"+birthday.getYear());
    return NONE;
  }
  public Date getBirthday() {
    return birthday;
  }
  public void setBirthday(Date birthday) {
    this.birthday = birthday;
  }
}


二.二.二 配置struts.xml文件


<struts>
  <package name="typeConverter" extends="struts-default" namespace="/">
    <action name="MyAction1" class="com.yjl.web.action.MyAction1">
    </action>
    <!-- 配置跳转页面 -->
    <action name="*">
      <result>/WEB-INF/content/{1}.jsp</result>
    </action>
  </package>
</struts>


二.二.三 自定义Date类型转换器 DateTypeConversion


package com.yjl.conversion;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
/**
@Date: 2019年3月25日
@author:两个蝴蝶飞
@Description:日期的类型转换器
*/
public class DateTypeConversion extends DefaultTypeConverter{
  //传递进来的value是数组。
  @SuppressWarnings("rawtypes")
  @Override
  public Object convertValue(Map<String, Object> context, Object value,  Class toType) {
    // 判断要转换的类型 toType 是Date 类型 
    if(toType==java.util.Date.class){  
      //需要手动判断值,要转换成日期类型
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
      try {
        // value 接收的是字符串数组,前台传入的都是字符串类型的。用数组进行接收。
        String [] values=(String [])value;
        System.out.println("值是:"+values[0]);
        return sdf.parse(values[0]);
      } catch (ParseException e) {
        e.printStackTrace();
      }
    }else if(toType==String.class){
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
      System.out.println("转换成字符串");
      return sdf.format((Date)value);
    }else {
      System.out.println("没有办法进行转换");
    }
    return null;
  }
}


二.二.四 配置 类型转换器的级别


自定义的类型转换器可以分成两种,一种是Action级别的,一种是全局级别的。


如果是Action级别的话,


  1. 文件名称必须是: Action的名称-conversion-properties
  2. 必须要与Action在同一目录下
  3. 内容是: Action中的属性=要转换的自定义类型转换器的全限定名称


如果是全局级别的话:


  1. 文件名称 必须是 xwork-conversion.properites
  2. 必须放置在 src 目录,即classpath 目录下
  3. 内容是: 自定义的类全限定名称=要转换的类型转换器的全限定名称


故: 对于DateTypeConversion 类型转换器来说, 其对应的级别配置文件为:

MyAction1-conversion.properties, 需要放置在 com.yjl.web.action 包下.

内容是:


##Action属性=全限定名称
birthday=com.yjl.conversion.DateTypeConversion


二.二.五 编写前端界面 /content/mydate.jsp


<s:form action="MyAction1" method="post" namespace="/">
    生日:<input type="text" name="birthday">
    <s:submit value="提交" />
</s:form>


二.二.六 验证


启动服务器,进行相关的验证


输入网址: http://localhost:8080/Struts_Converter/mydate


20200419111945935.png


控制台打印输出:


20200419111950981.png


可以正确地进行转换对象。


其实,当输入 yyyy-MM-dd 形式时, Struts2提供的默认的类型转换器 DateConverter 也可以进行转换。


如何区分,用的是默认的,还是用的我们自定义的呢? 就在 System.out.println() 打印的那句话。


那句话,打印了,我们就实现了自定义的, 那句话,没有打印,那么我们用的就是Struts2定义的,此时就要看一下,是否配置错误了。


输入可以转换,那么输出是否可以转换呢?


二.二.七 验证一下,输出转换成字符串,是否进行了转换


二.二.七.一 对Action 进行转换一下


@Override
public String execute() throws Exception {
   //这个是对象
  System.out.println("输出生日为:"+birthday.getYear());
  return SUCCESS;
}


让其返回到一个界面,进行显示数据。


二.二.七.二 配置 struts.xml 文件


<action name="MyAction1" class="com.yjl.web.action.MyAction1">
      <result>/WEB-INF/content/show.jsp</result>
</action>


二.二.七.三 类型转换器和配置文件 MyAction1-conversion.property 保持不变


二.二.七.四 编写 /content/show.jsp 页面


<body>
<s:property value="birthday"/>
</body>


二.二.七.五 重启服务器,进行验证


输入网址: http://localhost:8080/Struts_Converter/mydate


日期填写 1949-10-01 号,祖国母亲的生日


20200419111959986.png


点击按钮,控制台打印输出:


20200419112005648.png


页面跳转显示:


20200419112010345.png

说明,Date 对象 转换成字符串 也是成功的。


然而,这种方式,还需要自己进行类型判断,不太好,所以在实际的开发中,常常使用的是StrutsTypeConverter


相关文章
|
Java
Java面向对象(12)--对象类型转换 (Casting )
Java面向对象(12)--对象类型转换 (Casting )
139 0
Java面向对象(12)--对象类型转换 (Casting )
|
前端开发 Java
Struts2实现类型转换器(十五)下
Struts2实现类型转换器(十五)
122 0
Struts2实现类型转换器(十五)下
Struts2配置异常错误处理(十六)下
Struts2配置异常错误处理(十六)
224 0
Struts2配置异常错误处理(十六)下
|
前端开发 Java 应用服务中间件
Struts2配置异常错误处理(十六)上
Struts2配置异常错误处理(十六)
372 0
Struts2配置异常错误处理(十六)上
|
前端开发 JavaScript Java
SpringMVC的数据验证和JSR 303国际化显示(十一)上
SpringMVC的数据验证和JSR 303国际化显示(十一)上
222 0
SpringMVC的数据验证和JSR 303国际化显示(十一)上
|
前端开发 Java 数据库连接
SpringMVC的数据验证和JSR 303国际化显示(十一)中
SpringMVC的数据验证和JSR 303国际化显示(十一)中
215 0
SpringMVC的数据验证和JSR 303国际化显示(十一)中
|
前端开发 Java 数据库连接
SpringMVC的数据验证和JSR 303国际化显示(十一)下
SpringMVC的数据验证和JSR 303国际化显示(十一)下
377 0
SpringMVC的数据验证和JSR 303国际化显示(十一)下
|
Web App开发 前端开发 Java
SSM-SpringMVC-28:SpringMVC类型转换之自定义日期类型转换器
     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         例子很简易,要明白的是思路,话不多说,开讲 上篇博客不是说springmvc默认的日期转换格式是yyyy/MM/dd吗?如果我们要别的格式怎么办?(例如yyyyM...
1494 0