Struts2自定义类型转换:

从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自己的转换器:

例:

我有一个Point类型:

package cn.jnit.bean;

public class Point {

private Integer x;

private Integer y;

public Point() {

}

public Point(Integer x, Integer y) {

this.x = x;

this.y = y;

}

public Integer getX() {

return x;

}

public void setX(Integer x) {

this.x = x;

}

public Integer getY() {

return y;

}

public void setY(Integer y) {

this.y = y;

}

}

测试类型转换器:我前台的struts表单

<s:form action="point" method="post">

<s:textfield name="point"></s:textfield>

<s:submit value="提交"></s:submit>

</s:form>

<%-- <s:property value="point"/> --%>

表单对应的Action:

package cn.jnit.action;

import cn.jnit.bean.Point;

import com.opensymphony.xwork2.ActionSupport;

public class ConvertAcion extends ActionSupport{

private Point point;

@Override

public String execute() throws Exception {

System.out.println(point.getX());

System.out.println(point.getY());

return SUCCESS;

}

public Point getPoint() {

return point;

}

public void setPoint(Point point) {

this.point = point;

}

}

我们找到xwork-core-2.2.1.jar核心包里com.opensymphony.xwork2里的com.opensymphony.xwork2.conversion里的TypeConverter.class里的com.opensymphony.xwork2.conversion.TypeConverter接口:实现TypeConverter接口的类里有DefaultTypeConverter类,我们可以看到继承自DefaultTypeConverter类的类里有一个抽象类StrutsTypeConverter,我们自定义的类就继承自StrutsTypeConverter,然后会重写两个方法:

1:把从前台传来的字符串数据封装成对象

@Override

public Object convertFromString(Map context, String[] values, Class toClass) {}

2:把后台对象再转换成字符串数据回显到前台

@Override

public String convertToString(Map context, Object o) {}

那么我的自定义转换类:

package cn.jnit.convert;

import java.util.Arrays;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.opensymphony.xwork2.conversion.TypeConversionException;

import cn.jnit.bean.Point;

public class MyConvert extends StrutsTypeConverter {

@Override

public Object convertFromString(Map context, String[] values, Class toClass) {

/* System.out.println("--------------------------Map---------------");

for (Object obj : context.keySet()) {

System.out.println(obj);

}

System.out.println("-------------------------------");

System.out.println(Arrays.toString(values));

System.out.println("-----------class--------------------");

System.out.println(toClass);

System.out.println("-------------------------------------------");*/

Point p=new Point();

System.out.println(values[0]);

String string  =values[0].split(",")[0];

if(!(values[0].length()>0&&values[0].matches("\\d{2,5},\\d{2,5}"))){

//如果前台页面传进来的值与我自定义的类型转换方法里拆分的值不匹配则抛出异常

throw new TypeConversionException();

}

p.setX(Integer.valueOf(values[0].split(",")[0]));

p.setY(Integer.valueOf(values[0].split(",")[1]));

// TODO Auto-generated method stub

return p;

}

@Override

public String convertToString(Map context, Object o) {

Point p=(Point) o;

return p.getX()+","+p.getY();

}

}

由于用的是Struts自带的表单,会在提交的标签上自动加上错误信息,如果用的是HTML表单,那么需要加上<s:fielderror></s:fielderror>才会显示错误信息(建议用struts自带的表单)。

但是错误提示信息是strut2自带的英文提示信息,如果想要换成自己的错误提示信息,那么我们有两种选择:

第一种是:应用于全局范围的类型转换器,具体为:

首先我们需要在struts.xml里加上:

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

的信息,因为默认情况下,所有类型转换的错误都是通用的i18n消息键

xwork-default.invalid.fieldvalue来报告错误信息的。然后,我们需要在src下创建一个message.properties文件,然后里面的简直对为:name:xwork.default.invalid.fieldvalue  value:字段“{0}”的值无效(用Properties视图下,如果用Source视图下会显示为:xwork.default.invalid.fieldvalue=\u5B57\u6BB5\u201C{0}\u201D\u7684\u503C\u65E0\u6548

第二种是:应用特定类的类型转换器,具体为:

在Action包里,创建一个和Action同名的properties文件,里面的name=value为:

Invalid.fieldvalue.point=point 转换错误,

如果这个类是自定义类型,需要再加上一个:Action同名-conversion.properties的文件,里面的name值为point,value值为:自定义的类型转换器的全类名,如:point=cn.jnit.convert.MyConvert

最后切记所有的properties文件名一个字母都不能错,不然没有效果!

Struts2自定义类型转换,和处理类型转换错误的更多相关文章

  1. [JavaWeb基础] 013.Struts2 自定义类型转换器

    很多时候,我们在做web开发的时候经常要用到时间的转换器,Struts2给我们提供了一种类型转换器的接口.下面我们讲讲怎么实现吧. 1.首先我们要定义一个类型转换的类,继承自com.babybus.s ...

  2. struts2自定义转换器

    Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...

  3. java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换

    java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换 一.字符串与其他类型连接 public class DemoString{ public static void mai ...

  4. [JavaWeb基础] 012.Struts2 自定义标签使用

    在做开发中,我们会把一些比较经常使用到的代码封装起来,这样可以加快开发的速度和减少错误,并且在修改bug可以一次修改多次修复.那么在前端页面上,如果我们要经常用到公用的显示功能,并涉及到服务端逻辑操作 ...

  5. struts2 自定义校验规则

    自定义校验规则:(了解) 在Struts2自定义校验规则: 1.实现一个Validator 接口. 2.一般开发中继承ValidatorSupport 或者 FieldValidatorSupport ...

  6. Struts2自定义拦截器Interceptor以及拦截器登录实例

    1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...

  7. Struts2自定义标签2自定义一个按班级id查询出该班级下的学生,存放进值栈,并遍历出来。

    Struts2自定义标签的流程概念: (1)需要两个类:标签类(继承相应的tag类),基本类(继承Component).标签类专门负责从客户端取得用户输入的一些属性,这个普通的jsp自定义标签一样,取 ...

  8. apache 网页301重定向、自定义400/403/404/500错误页面

    首先简单介绍一下,.htaccess文件是Apache服务器中的一个配置文件(Nginx服务器没有),它负责相关目录下的网页配置.通过对.htaccess文件进行设置,可以帮我们实现:网页301重定向 ...

  9. struts2上传图片超过大小给出错误提示

    struts2上传图片超过大小给出错误提示        今天碰到上传图片太大,上传不上去返回input视图的界面,回显的错误信息却是乱码,整了好久才整出来,在这里做个记录,方便自己以后查阅,也希望能 ...

随机推荐

  1. 不错的判断 UITextView 内容不超过20个字符串的方法

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSSt ...

  2. DB2支持的三种表空间SMS、DMS、DMS的自动存储

    DB2支持的三种表空间SMS.DMS.DMS的自动存储 DB2中,表空间是数据库与这个数据库中存储的表之间的逻辑层.表空间在数据库中创建,表在表空间中创建.容器是一个物理存储设备.它可以由目录名.设备 ...

  3. POJ 1321 简单dfs

    1.POJ 1321  棋盘问题 2.总结: 题意:给定棋盘上放k个棋子,要求同行同列都不重. #include<iostream> #include<cstring> #in ...

  4. Redis_jedis高版本的JedisPoolConfig没有maxActive和maxWait

    dbcp的修改日志显示:change "maxActive" -> "maxTotal" and "maxWait" -> &q ...

  5. 在线阅读android源代码

    这两天一直在寻找android系统的源代码,但是直到一个小时之前,一直未能如愿.但是,令人欣慰的是,现在找到了. 网上有不少帖子介绍如何下载android源代码,包括在linux系统,windows系 ...

  6. 总结新系统部署时,Oracle的一些注意事项:

    1.Oracle安装时,要选择字符集为中文编码,数据库重要角色设置密码时,不要用数字开头,不然后面会报一些错误提示 2.emp导出的数据dmp格式,导入时要在服务器导入,具体没有试,要找机会试试,转化 ...

  7. 使用swf与swc引入资源的区别[as3]

    SWF用于运行时加载,而SWC在编译时用做外部库.使用SWC库,只有当类被引用,才编译入主程序中. getDefinition: 在使用swc库方式引入资源时,getDefinitionByName反 ...

  8. Sqoop_ 从 hive 导到mysql常遇九问题总结(转)

    以前以为版本不同,遇到的问题就不同,后来发现,无论是新版本,还是老版本,遇到的问题大部分都是相同的.下面解决问题的方法仅供借鉴 1.拒绝连接的错误表现是什么?2.表不存在该如何解决?3.null字段填 ...

  9. SQL server 视图、范式

    视图 1.视图的概述       视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据.视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询 或一个虚拟表.视图来 ...

  10. php 执行的目录到新的 directory 目录中

    chdir : 改变目录. dir : 目录类别类. closedir : 关闭目录 handle. opendir : 打开目录 handle. readdir : 读取目录 handle. rew ...