欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一篇文章搞定Struts2的类型转换

程序员文章站 2024-03-08 09:27:58
前言 我们知道通过http提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种。所以,我们需要类型转换!下面来看看详细的介绍吧。 一、类型转换...

前言

我们知道通过http提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种。所以,我们需要类型转换!下面来看看详细的介绍吧。

一、类型转换的意义

所有的mvc框架,解决的都是表现层的解决方案,都需要收集用户请求参数,并把参数提供给控制器。但是,在web应用中所有的请求参数都是字符串类型的,java是强类型的语言,如何将字符串转换为java类型,这是框架要解决的一个问题。
例如,一个注册页需要输入年龄、日期等。这时候就需要将日期、年龄字符串转换为相应类型。

二、struts2的类型转换器

struts2提供了内置的类型转换器,对于大部分类型,开发者无需自定义类型转换器,使用内置的类型转换器就可以完成我们需要的类型转换。

内置类型转换器有:

     1.boolean和boolean

     2.char和character

     3.int和integer

     4.long和long

     5.float和float

     6.double和double

     7.date

比如我们在页面输入20,传输到后台肯定是字符串类型。但是struts框架的内置类型转换可以把20转换为int型。但是如果我们转换abc这样的为int是行不通的。

三、自定义类型转换器的实现

1、需求分析

比如我们需要在页面上输入(2,3)这样一个坐标点,将该点转换为一个点对象类型。

2、实现

当内置类型转换无法满足我们的需求的时候,需要用到自定义类型转换。struts2的类型转换时基于ongl的,在ongl中有一个接口typeconverter,该接口中有一个方法convertervalue,该方法很复杂。其中还有一个默认的实现类defaulttypeconverter,通过该类来实现类型转换。

package com.study.converter;
import java.util.map;
import com.study.bean.point;
import ognl.defaulttypeconverter;
 
public class pointconverter extends defaulttypeconverter{
 public object convertvalue(map context, object value, class totype) {
  if(totype==point.class){
   string []strs = (string[])value;
   string []xy = strs[0].split(",");
    
   int x = integer.valueof(xy[0]);
   int y = integer.valueof(xy[1]);
    
   point p = new point();
   p.setx(x);
   p.sety(y);
    
   return p;
    
  }else if(totype==string.class){
   point p = (point) value;
   return "["+p.getx()+","+p.gety()+"]";
  }else{
   return null;
  }
 }
}

这就是转换器的一个简单实现,把页面传输的值进行解析,最后转换为point类型。然后要让类型转换器起作用,需要进行配置
struts2提供了两种配置方法:

a.局部:首先创建文件命名如actionname-conversion.properties,里面的内容为 属性=类型转换器(ponit=com.study.converter)需要写在包下面

b.全局:首先创建文件命名如xwork-conversion.properties,内容为com.study.bean.ponit=com.study.converter。文件需要写在src下面

3、struts的实现

struts2中有一个strutstypeconverter类,它是继承defaulttypeconverter。使用它来自定义转换器更加方便,示例代码如下:

package com.study.converter;
import java.util.map;
import org.apache.struts2.util.strutstypeconverter;
import com.study.bean.point;
 
public class pointconverter extends strutstypeconverter{
 public object convertfromstring(map map, string[] obj, class totype) {
  string []strs = obj;
  string []xy = strs[0].split(",");
 
  int x = integer.valueof(xy[0]);
  int y = integer.valueof(xy[1]);
 
  point p = new point();
  p.setx(x);
  p.sety(y);
 
  return p;
 }
 
 public string converttostring(map map, object obj) {
  point p = (point) obj;
  return "["+p.getx()+","+p.gety()+"]";
 }
}

4、类型转换器的错误处理

struts2提供了一个名为conversionerror的拦截器,如果类型转换出现错误,拦截器负责将错误封装成表单错误(filederror),并将错误信息放入actioncontext中。

如何那么改变默认类型转换错误的错误提示信息?

方法一:

首先创建一个资源文件mess.properties,放在src下面
然后覆盖xwork-core-2.3.31\com\opensymphony\xwork2\xwork-messages.properties里面的属性xwork.default.invalid.fieldvalue。即在mess.properties中写入如下参数

xwork.default.invalid.fieldvalue="{0}"参数转换失败.

然后指定我们的资源文件,在struts.xml中(不需要加文件后缀)

<constant name="struts.custom.i18n.resources" value="mess"></constant>

方法二:

为某个action的字段提供错误信息提示
定义actionname.properties文件,添加配置——invalid.fieldvalue.属性名=提示信息

总计

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。