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


相关文章
|
7月前
|
安全 Java 编译器
【Java开发指南 | 第四篇】Java常量、自动类型转换、修饰符
【Java开发指南 | 第四篇】Java常量、自动类型转换、修饰符
56 4
|
7月前
|
存储 安全 Java
【Java开发指南 | 第三篇】Java 空行、强制类型转换及基本数据类型
【Java开发指南 | 第三篇】Java 空行、强制类型转换及基本数据类型
57 6
|
3月前
|
Java 编译器 程序员
Java自动类型转换的妙用
Java中的自动类型转换(隐式类型转换)是指编译器在无需显式指定的情况下自动将一种数据类型转换为另一种类型。这一特性简化了代码,提高了可读性,并在多态中发挥了重要作用。例如,在数学运算时,较小类型会自动转换为较大类型以避免精度损失;在面向对象编程中,子类对象可以自动转换为父类引用,增强了代码的灵活性和兼容性。此外,它还使得数组和集合的使用更加方便,整体上让编程更加优雅和高效。
89 25
|
Java
Java基本语法(7)--赋值运算符及其扩展
Java基本语法(7)--赋值运算符及其扩展
58 0
|
Java
Java面向对象(12)--对象类型转换 (Casting )
Java面向对象(12)--对象类型转换 (Casting )
150 0
Java面向对象(12)--对象类型转换 (Casting )
|
Java 数据安全/隐私保护
Java修饰符和运算符,超详细整理,适合新手入门
Java修饰符和运算符,超详细整理,适合新手入门
129 0
|
前端开发 Java
Struts2实现类型转换器(十五)下
Struts2实现类型转换器(十五)
124 0
Struts2实现类型转换器(十五)下
|
前端开发 Java 应用服务中间件
Struts2配置异常错误处理(十六)上
Struts2配置异常错误处理(十六)
382 0
Struts2配置异常错误处理(十六)上
Struts2配置异常错误处理(十六)下
Struts2配置异常错误处理(十六)
236 0
Struts2配置异常错误处理(十六)下