Struts2范例转换(一) 通例范例,自界说范例,错误处理惩罚
副标题#e#
Struts2的范例转换是基于OGNL表达式的.有精采的扩展性.
WEB应用吸收到表单提交的数据都 是String范例的,Struts2可利便的转换为 通例范例(数值,日期)/ 自界说范例(User,Point类).
假如转换中呈现异常,conversionError拦截器会自动处理惩罚该异常.
一, 通例范例的转换:
好比表单提交的信息有 用户名,生日, 年数, Action中对应的数据范例别离是 String, Date, int.没什么好说的, Struts2会自动完成.
Struts2内建了常用的范例转换器,如String,boolean,char,int,long,float,double,Date, 数组(假定元素是String范例), 荟萃(假定元素是String 范例,用ArrayList封装)
二,自界说范例的转换(要领一): 这种要领用用来转换巨大工具
ONGL项目中有一个TypeConverter接口,是实现转换器必需实现的接口,这个接口有点巨大,所以OGNL还 提供了该街接口的一个实现类ognl.DefaultTypeConverter,通过担任该类重写convertValue要领,实 现自界说范例的转换.
要领是这样的convertValue(final Map context, final Object value, final Class toType)
第一个参数:context 是范例转换情况的上下文
第二个参数 : value 是必要转换的参数,偏向差异,value的范例也是差异的.
第三个参数 : toType是转换后的 方针范例,
返回值是 : 转换后的方针范例, 偏向差异,范例也是差异的.
Struts2本身有一 个抽象类担任自 DefaultTypeConverter类,是StrutsTypeConverter.就是转换的两个体离对应两个抽象 要领, 其实都一样,换汤不换药,百变不离个中.所以我们也可以担任 StrutsTypeConverter类.
下 面做一个自界说范例转换的实例:
1.表单是这样的: 输入一个用 豆号脱离的两 个数字, 代表一个坐标点的X,Y值.
2.Point 工具如下,用来封装表单信息.
Java代码
package ssh.org.util;
public class Point
{
private int x;
private int y;
}
Java代码
public class LoginAction extends ActionSupport
{
private Point point;
set,get要明确...
@Override
public String execute()throws Exception
{
return "success";
}
}
#p#副标题#e#
3.实现自界说范例转换器,我们本身写一个转换类PointConverter
Java代码
package ssh.org.util;
import java.util.Map;
import ognl.DefaultTypeConverter;
public class PointConverter extends DefaultTypeConverter
{
@Override
public Object convertValue(final Map context, final Object value, final Class toType)
{
if (Point.class == toType)//从表单字符串转换为 Point工具
{
final Point point = new Point();
final String[] str = (String[])value;
final String[] param = str[0].split(",");
final int x = Integer.parseInt (param[0]);
final int y = Integer.parseInt(param[1]);
point.setX(x);
point.setY(y);
return point;
}
if (String.class == toType)//从工具转换为字符串
{
final Point point = (Point)value;
final int x = point.getX();
final int y = point.getY();
final String result = "[x=" + x + ",y=" + y + "]";
return result;
}
return null;
}
}
4.把上面的范例转换器PointConverter注册在struts2应用中,Struts2框架才可以正常 利用该 转换器.
有3种要领,任选个中一种就行.
1)注册局部范例转换器,假定请求 的LoginAction 来处理惩罚 ,我们就要篇写LoginAction-conversion.properties文件.本文件要与 LoginAction.java放再同一文件夹
Properties代码
#本文件名是:LoginAction-conversion.properties
#注册局部的范例转换器的属性文件, 只针对指命名称的Action起浸染
#文件名必需 是action类名 + -conversion.properties
#指定LoginAction的point属性由ssh.org.util.PointConverter类完成转换,point是成员属性,不是类
#本文件要与LoginAction.java放再同一文件夹
point=ssh.org.util.PointConverter
2)注册全局范例转换器.
Properties代码
#本文件名是 xwork-conversion.properties
#注册全局的范例转换的属性文件,对所有有ssh.org.util.Point范例成员属性的Action都起浸染
#文件名必需是 xwork-conversion.properties
#该文件放在classPath根路径,也就是src包下面,与struts.xml再一起
#指定ssh.org.util.Point类(带包名)的范例类转换器为ssh.org.util.PointConverter
ssh.org.util.Point=ssh.org.util.PointConverter
3)利用JDK1.5的注解 来注册范例转换器,今朝还无例子, 临时略…
5 功效页面 success.jsp:
Html代码
点工具point:<s:property value="point"/><br>
三,自界说范例的转换(要领二): 这种简朴,不必要本身写范例转换器,不消写转换器注册文件* – conversion.properties.
1 表单是这样地:
第一个文本框是X 坐标,第二个文本框是Y坐标, 与要领二中一个文本输入x,y差异了.
Html代码
#p#分页标题#e#
<form action="login.action" >
point3.x:<input type="text" name="point3.x"/>
point3.y:<input type="text" name="point3.y"/>
<input type="submit" value="提交"/>
</form>
login.action是class LoginAction类在struts.xml设置的name
2 LoginAction 类
Java代码
public class LoginAction extends ActionSupport
{
private Point point3;
set,get要明确...
@Override
public String execute()throws Exception
{
return "success";
}
}
3 Point 工具如下,用来封装表单信息.
Java代码
package ssh.org.util;
public class Point
{
private int x;
private int y;
}
4 功效页面 success.jsp:
Html代码
点工具point:<s:property value="point3"/><br>
范例转换错误的处理惩罚
conversionError拦截器被注册在默认的拦截器栈中, 也是在struts- default.xml
Xml代码
<interceptor-stack name="defaultStack">
<!--范例转换错误的拦截器 -->
<interceptor-ref name="conversionError"/>
<!--数据校验的拦截器 -->
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
流程是:
1 转换堕落
2 被 conversionError拦截
3 将错误信息放入ActionContext中
4 读Action的局部资源文 件 Action名称.properties 取得单个字段(成员属性)的提示信息
5 跳转到input逻辑视图, 显示提示信息 ,要struts.xml中 <result name="input">/login/login.jsp</result> 这要指定 input逻辑视图.
本例子,处理惩罚请求的action名称为LoginAction.java.
LoginAction.properties 文件 必需与LoginAction.java同名(扩展名差异),并放在同一文件夹内
Properties代码
#局部资源文件
#文件名为LoginAction.properties,
#必需与LoginAction.java同名(扩展名差异),并放在一起
# invalid.fieldvalue.成员属性=提示信息
invalid.fieldvalue.point=输入坐标不正确
invalid.fieldvalue.point2=输入坐标不正确
invalid.fieldvalue.point3=输入坐标不正确
invalid.fieldvalue.birthday=生日不正确
功效1 下面的表单是用Struts2标签写的, 堕落误时,会自动显示错信息:
功效2 下面的表 单是用HTML标签写的, 显示错误信息要加<s:fielderror ></s:fielderror>标签 :结果如 下:
附件中是总个工程文件,包罗上面的演示代码, 由于jar包较少,打包后巨细为2M,就全打包上传了.开拓情况 Eclipse 3.3 + 支持属性文件中文自动编码的插件(健忘名称了)
本文配套源码