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视图的界面,回显的错误信息却是乱码,整了好久才整出来,在这里做个记录,方便自己以后查阅,也希望能 ...
随机推荐
- 设置 tableview 的背景颜色,总是不生效
1.只设置了背景图片,却忘记了取消掉 cell 的背景颜色(可以通过层次结构来观察) UIImageView *bgView = [[UIImageView alloc]initWithFrame:s ...
- 属性字符串的replaceCharactersInRange方法
一,实验: 1> 让 range 的 length 参数为0,以下代码输出属性字符串的结果为12354 NSMutableAttributedString *attrStr = [[NSMuta ...
- 十、ios 模态窗口[实例]
一.模态窗口概念 对话框一般分为两种类型:模态类型( modal )与非模态类型( modeless ).所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话 ...
- [CareerCup] 15.2 Renting Apartment II 租房之二
Write a SQL query to get a list of all buildings and the number of open requests (Requests in which ...
- c++ 符号执行顺序小例子
if ( a[i] == b[i] && ++i < 0) 这个表达式的执行顺序 1. ; )// 输出 True cout<<"True"&l ...
- css小记(3)
1.只有块级元素可以设置背景图,行内元素要变成块级元素才可以:2.盒子不设置宽度,只设置高度,默认为100%,并自适应屏幕大小变化,为这个盒子设置margin可以在保证margin效果的同时默认调整盒 ...
- linux笔记二-----目录及文件命令
一:目录及文件操作 1.file:识别文件类型 如果是文本文件,会显示ASCII: 如果是执行会显示shell script: 如果链接文件显示链接执行文件等信息 2.touch:改变文件或目录时间. ...
- C++类内存分布
http://www.cnblogs.com/jerry19880126/p/3616999.html#undefined 书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看 ...
- 除了白名单外的IP每秒最多处理 8 个请求 limit_conn_zone
防止黑客知道你的源服务器真实IP进行并发攻击,通常只需要保护动态文件请求,�php. 添加文件 nginx/conf/limit/whiteip.conf 里面是你要忽略限制的 白名单 IP地址,通常 ...
- BizTalk开发系列(三十二)浅谈BizTalk主机性能优化
很多BizTalk的项目都要考虑到性能优化的问题,虽然BizTalk采用多线程处理消息的,大大提高了程序效率.但默认情况下 BizTalk的主机有很多阻止参数会控制BizTalk对服务器的资源使用率, ...