Struts2自定义类型转换,和处理类型转换错误

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文件名一个字母都不能错,不然没有效果!

时间: 2024-10-22 08:53:22

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

深入分析JavaWeb 45 -- Struts2封装请求参数与类型转换

作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中,Struts2提供了非常强大的类型转换机制用于请求数据 到 model对象的封装. 1.Struts2 提供三种数据封装的方式 Action 本身作为model对象,通过成员setter封装 创建独立model对象,页面通过ognl表达式封装 使用ModelDriven接口,对请求数据进行封装 1. 方式一:在动作类中成员变量给予初始值. 在配置文件中struts.xml中 <package name="p1&q

struts2进阶【2】——类型转换

我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种.所以,我们需要类型转换! 在Struts2中,类型转换的概念除了用于将界面传递过来的字符串转换为特定的类型(convertFromString)之外,还可以用于将特定的类型转换为字符串(即当我们在JSP中要把某种类型的对象呈现的时候,要将它转换为字符串来显示)(converterToString). Struts2已经内建了对于String和基本类型的类型转换,比如String<-->int .

Struts2 自定义类型转换器

Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性 用date类型是可以接收到的,但是如果传的是20101112这样类型的字符串,用date类型是获取不到,并且会出现错误的,struts2提供了一 种类型转换器供我们使用. 以下为局部类型转换器的开发步骤a.首先要写一个类来继承DefaultTypeConverterb.然后覆盖convertValue

struts2自定义转换器

Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用date类型是可以接收到的,但是如果传的是20101112这样类型的字符串,用date类型是获取不到,并且会出现错误的,struts2提供了一种类型转换器供我们使用. 以下为局部类型转换器的开发步骤 a.首先要写一个类来继承StrutsTypeConverter b.然后覆盖convertFromSt

struts2 自定义表单

自定义表单一定会涉及<s:iterator/>迭代,一个复杂的自定义表单可能会嵌套n多层迭代. 比如一个自定义一个问卷调查页面涉及3个模型:一个Survey代表一个调查,一个Page代表一个页面,一个Question代表一个问题.每个问题中会包含不同的表单元素,就会涉及迭代. 3个模型类如下: Survey package com.atguigu.surveypark.model; import java.util.Date; import java.util.HashSet; import

struts2 自定义tag标签

在项目中可能有很多相同的jsp页面表示功能,这时可以使用自定义的tag进行定义,渐少重复的工作量便于日后维护! 下面就基于struts2进行自定义标签的定义与实现: 首先:自定义类MyTag继承struts2的Component package cookielogin; import java.io.IOException; import java.io.Writer; import org.apache.struts2.components.Component; import com.open

java中结合struts2自定义标签的使用

java中结合struts2自定义标签的使用 一.建立一个继承于SimpleTagSupport类实现它的doTag方法 1 package com.xiangshang.tag; 2 3 import java.io.IOException; 4 import java.util.List; 5 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.PageContext; 8 import javax.serv

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

1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor{ private static final long serialVersionUID = 1L; public void destroy() { } public void init() {} public String intercept(ActionInvocation arg0) throws

struts2 自定义校验规则

自定义校验规则:(了解) 在Struts2自定义校验规则: 1.实现一个Validator 接口. 2.一般开发中继承ValidatorSupport 或者 FieldValidatorSupport * ValidatorSupport           :不是针对一个字段校验. 校验确认密码(与密码字段比较) * FieldValidatorSupport :针对一个字段的校验. 步骤: 1.编写一个类继承FieldValidatorSupport public void validate