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文件名一个字母都不能错,不然没有效果!
Struts2自定义类型转换,和处理类型转换错误的更多相关文章
- [JavaWeb基础] 013.Struts2 自定义类型转换器
很多时候,我们在做web开发的时候经常要用到时间的转换器,Struts2给我们提供了一种类型转换器的接口.下面我们讲讲怎么实现吧. 1.首先我们要定义一个类型转换的类,继承自com.babybus.s ...
- struts2自定义转换器
Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...
- java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换
java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换 一.字符串与其他类型连接 public class DemoString{ public static void mai ...
- [JavaWeb基础] 012.Struts2 自定义标签使用
在做开发中,我们会把一些比较经常使用到的代码封装起来,这样可以加快开发的速度和减少错误,并且在修改bug可以一次修改多次修复.那么在前端页面上,如果我们要经常用到公用的显示功能,并涉及到服务端逻辑操作 ...
- struts2 自定义校验规则
自定义校验规则:(了解) 在Struts2自定义校验规则: 1.实现一个Validator 接口. 2.一般开发中继承ValidatorSupport 或者 FieldValidatorSupport ...
- Struts2自定义拦截器Interceptor以及拦截器登录实例
1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...
- Struts2自定义标签2自定义一个按班级id查询出该班级下的学生,存放进值栈,并遍历出来。
Struts2自定义标签的流程概念: (1)需要两个类:标签类(继承相应的tag类),基本类(继承Component).标签类专门负责从客户端取得用户输入的一些属性,这个普通的jsp自定义标签一样,取 ...
- apache 网页301重定向、自定义400/403/404/500错误页面
首先简单介绍一下,.htaccess文件是Apache服务器中的一个配置文件(Nginx服务器没有),它负责相关目录下的网页配置.通过对.htaccess文件进行设置,可以帮我们实现:网页301重定向 ...
- struts2上传图片超过大小给出错误提示
struts2上传图片超过大小给出错误提示 今天碰到上传图片太大,上传不上去返回input视图的界面,回显的错误信息却是乱码,整了好久才整出来,在这里做个记录,方便自己以后查阅,也希望能 ...
随机推荐
- OLTP与OLAP的介绍
OLTP与OLAP的介绍 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing).联机分析处理OLAP(On-Line Analytical ...
- UESTC 30 最短路,floyd,水
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Statu ...
- win7 64位DCOM配置(关于导出excel 配置计算机组件服务)(转)
http://blog.sina.com.cn/s/blog_9323b3a50101qrxm.html [解决方案1] 1:在服务器上安装office的Excel软件. 2:在"开始&qu ...
- 关于Go,你可能不注意的7件事(转的)
http://tonybai.com/2015/09/17/7-things-you-may-not-pay-attation-to-in-go/ code https://github.com/bi ...
- osg实例介绍
osg实例介绍 转自:http://blog.csdn.net/yungis/article/list/1 [原]osgmotionblur例子 该例子演示了运动模糊的效果.一下内容是转自网上的:原理 ...
- css解决select下拉表单option高度的办法
css在给select下拉表单设置样式如边框时可以轻松搞定,而我们在不喜欢其默认的下拉箭头的样式时试图通过background:url(图片路径)来修改之,则往往会出现浏览器的兼容性问题,在网上查了好 ...
- Digital Imaging Processing 数字图像处理
8-Bit and 16-Bit Images 关于量化压缩与量化补偿 RGB Bayer Color分析 彩色CCD/CMOS的格式和计算机中的读取格式
- ZK 使用Clients.response
参考: http://stackoverflow.com/questions/11416386/how-to-access-au-response-sent-from-server-side-at-c ...
- JavaScript入门篇 第二天(消息对话框+网页弹出)
提问(prompt 消息对话框) prompt弹出消息对话框,通常用于询问一些需要与用户交互的信息.弹出消息对话框(包含一个确定按钮.取消按钮与一个文本输入框). 语法: prompt(str1, s ...
- C# 计时器
一.Stopwatch 主要用于测试代码段使用了多少时间 使用方法: Stopwatch sw=new Stopwatch(); sw.Start(); ... sw.Stop(); Console. ...