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. python rabbitmq

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @author: zengchunyun ""& ...

  2. msnodesql的使用

    msnodesql的安装  npm  install   msnodesql 使用msnodesql写的增删改查 var sql=require('msnodesql'); var conn_str= ...

  3. [LintCode] Coins in a Line II 一条线上的硬币之二

    There are n coins with different value in a line. Two players take turns to take one or two coins fr ...

  4. 好吧,CSS3 3D transform变换,不过如此!

    一.写在前面的秋裤 早在去年的去年,我就大肆介绍了2D transform相关内容.看过海贼王的都知道,带D的家伙都不是好惹的,2D我辈尚可以应付,3D的话,呵呵,估计我等早就在千里之外被其霸气震晕了 ...

  5. 在html中如何获取表单提交的数据

    a.html: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www ...

  6. jquery中对动态生成的标签响应click事件(二)…与ajax交互使用

    <%@ page language="java" contentType="text/html; charset=GB18030" pageEncodin ...

  7. Console ArcEngine 许可绑定

    using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.DataSourcesFile; using ESRI. ...

  8. CVTRES : fatal error CVT1100 , fatal error LNK1123:

    CVTRES : fatal error CVT1100: duplicate resource. type:DIALOG, name:901, language:0x0804LINK : fatal ...

  9. Windows 8.1升级至Windows 10后,启动VisualSVN Server Manager报错:提供程序无法执行所尝试的操作 (0x80041024)的解决

    1.1.Windows 8.1升级至Windows 10后,启动VisualSVN Server Manager报错:提供程序无法执行所尝试的操作 (0x80041024),VisualSVN Ser ...

  10. saltstack学习

    1. 创建基础镜像 2. 创建配置文件 3. 启动容器 4. 检查创建是否成功 1. 创建基础镜像 salt-master, 文件名Dockerfile # VERSION 1.0 # TO_BUIL ...