- 浏览: 374341 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (225)
- java (76)
- English (2)
- office (2)
- 架构设计 (1)
- 人在职场 (3)
- database (21)
- C# (18)
- 向往的院校 (0)
- C++ (1)
- AJAX (1)
- 操作系统 (8)
- eclipse (1)
- Spring (0)
- Linux (1)
- Javascript (6)
- 离散 (0)
- 协议 (1)
- sql server (5)
- sql server (0)
- fdf (0)
- xml (1)
- sql语句里top和distinct一起用 (1)
- 正则表达式 (7)
- 表达 (1)
- ms server (1)
- SWFObject (0)
- 线程 (2)
- Java线程 (0)
- Android & SQLite (0)
- Android (0)
- window.XMLHttpRequest (0)
- DB pool (0)
- tomcat内存溢出设置JAVA_OPTS (1)
- java bcp (1)
- 文件系统转换 (1)
- Microsoft XMLDom (1)
- tree (0)
- C# installer (0)
- 对付http cc攻击 (0)
- Ckeditor (0)
- MyEclipse (0)
- PDM (0)
- PDM OOM (0)
- asp.net (0)
- tomcat (1)
- Tomcat session (1)
- jdk (0)
- Bootstrap (0)
最新评论
-
kenail:
格式太乱了。
转 使用WebService压缩传输的心得 -
存在即为合理:
写得好乱,但是还是谢谢你的驱动
JDBC连接SQL server 2005 驱动 -
guji528:
长见识了,谢谢分享!
TL1协议(正文信息收集整理来源Internet) -
王大人:
Js window confirm()方法及其使用 -
Eastman:
SqlServer附加数据库出错,错误代码5123
来源:javaeye 作者:elf8848
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";
}
}
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代码
<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 + 支持属性文件中文自动编码的插件(忘记名称了)
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";
}
}
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代码
<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 + 支持属性文件中文自动编码的插件(忘记名称了)
发表评论
-
tomcat安装不成功.提示是:failed to install tomcat6 service ,check your setting and permis
2018-03-08 14:55 434以管理员身份运行 命令提示符,弹出窗口 ,选择“是”,输入 ... -
把系统时间设置成跟数据库的一致
2016-08-22 16:41 0public String time(int x) { ... -
struts标签<logic:iterate>的用法
2016-01-08 16:17 0<logic:iterate>主要用来 ... -
WIN7环境下cmd javac不是内部或外部命令 .
2015-07-21 11:27 1220一般步骤如下: 网上摘抄部分: JAVA_HOME ... -
jdk环境变量配置
2014-08-25 11:01 0进行java开发,首先要安装jdk,安装了jdk后还要进行环境 ... -
[转]JDBC使用TNS连接多节点Oracle
2012-06-29 15:15 1207JDBC使用TNS连接多节点O ... -
一个简单的JDBC通用工具
2012-06-29 15:01 0一个简单的JDBC通用工具 支持多种数据库,统一方式产 ... -
Java调用BCP导入数据到数据库解决标识列ID问题
2012-06-29 14:53 1126面的一篇博文讲解了调用bcp批量导出数据,对于批量导入数据则写 ... -
java 可变参数方法Object... objs
2012-06-29 14:42 4209public abstract List find(Str ... -
java调用存储过程
2012-06-14 12:34 0在java可以使用java.sql.CallableState ... -
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接 错误解决办法
2012-06-13 12:56 3148用java连接sqlserver2005时总是出现下面这个错误 ... -
javac编译外部jar包
2012-06-12 14:23 3589这个有个很简单到解决 ... -
[转]Eclipse中将Java项目(引用了第三方包) 打包为jar
2012-06-12 14:13 1019如果自己的java project中需要引用额外的jar包作为 ... -
java 调用BCP导入文本数据到表
2012-06-04 15:53 0在dos下的导入语句bcp SMM_SQL_REPLICA.d ... -
[转]jdk和jre有什么区别?
2012-03-09 14:28 795来源 简单的说JDK是面 ... -
[转]Java线程:线程栈模型与线程的变量
2012-02-16 14:06 767Java线程:线程栈模型与线程的变量 SCJP5学 ... -
[转] Java线程:概念与原理
2012-02-16 13:29 811Java线程:概念与原理 ... -
Java线程:创建与启动
2012-02-16 13:26 529SCJP5学习笔记 一、定义线程 ... -
JSP页面用get传递参数乱码问题
2011-06-24 15:52 1262通过get 方式传递参数时,如果参数是中文 ,则会出现乱码现在 ... -
PO/VO/DAO/BO/POJO是什么(JAVA几种对象的解释)
2011-03-30 16:49 0/*PO:persistant object持久对 ...
相关推荐
无论是Struts1还是Struts2,自定义类型转换器都是一个非常实用的功能,它允许开发者根据具体需求定制数据转换逻辑,从而提高程序的灵活性和可维护性。在实际开发过程中,选择合适的转换策略并正确实现转换逻辑是非常...
本文将深入探讨Struts2自定义类型转换的原理、分类以及具体实施步骤,帮助开发者更好地理解和应用这一功能。 #### 自定义类型转换原理 Struts2框架内置了一套类型转换系统,能够自动将前端表单提交的字符串数据...
在Java世界里,`json-lib-2.1.jar` 是一个用于处理JSON的库,它提供了一系列的方法来将Java对象转换为JSON格式,以及将JSON字符串反序列化回Java对象。这个库支持多种Java类型,包括基本类型、集合、Map、自定义Java...
然而,对于如Date这样的复杂类型,需要自定义转换器来处理。 创建自定义类型转换器的步骤如下: 1. **定义转换器类**:继承`org.apache.struts2.util.FieldConverter`或`...
Struts2作为一款流行的Java Web框架,其在处理用户输入数据时扮演着重要角色。...在练习中,你可以尝试创建不同的自定义转换器,并理解它们在处理不同类型数据时的作用,从而加深对Struts2数据处理机制的理解。
Struts2 JSON Plugin是针对Apache Struts2框架的一个重要组件,版本为2.3.8。这个插件主要的功能是让Struts2应用程序能够轻松地处理JSON(JavaScript Object Notation)数据格式,使得Web应用可以方便地进行JSON序列...
通过以上步骤,你可以在Struts2应用中有效地处理类型转换错误,尤其是时间转换错误,提高用户体验,并防止因为这类错误导致的程序崩溃。这需要对Struts2的配置、拦截器机制以及异常处理有深入理解。
总的来说,Struts2的类型转换机制为开发者提供了灵活的输入数据处理方式,既可以利用内置转换,也可以自定义转换器以适应复杂的业务场景。正确理解和使用这一机制,可以提高代码的可维护性和用户体验,确保数据的...
标签中的“源码”可能意味着博客会深入到Struts2框架的源代码中,解释类型转换器的工作原理和如何根据源代码实现自定义转换器。而“工具”可能指的是使用Struts2提供的工具类或API来辅助类型转换。 在`Struts2_3500...
自定义类型转换器是Struts 2的核心特性之一,允许开发者根据业务需求定制数据转换规则。以下将详细介绍如何创建、注册以及使用自定义类型转换器。 1. **创建自定义类型转换器** - 创建一个类,实现`org.apache....
struts2-ssl-plugin-1.2.1.jar
6. **类型转换**:Struts2的类型转换器在处理JSON请求时起着关键作用,将JSON字符串转换为Java对象。 7. **自定义JSON序列化和反序列化**:源码中可能会包含自定义的序列化和反序列化逻辑,以便在转换过程中处理...
首先,我们来看`struts-json-plugin-2.1.8.jar`,这是Struts2的JSON插件,它允许Struts2的动作类直接返回JSON格式的数据,方便前端进行Ajax请求处理。该插件在2.1.8版本中修复了若干bug,并提供了对JSON输出的支持。...
在Struts2中,结果类型(Result Type)是动作执行后处理结果的关键部分,它决定了如何将控制权转移给下一个资源,如JSP、FreeMarker模板或者重定向到其他URL。自定义结果类型允许开发者根据项目需求定制化结果处理...
- `struts-core` 是Struts2框架的核心部分,包含了许多核心服务,如Action的执行、结果的处理、拦截器的管理等。 - 它提供了`Action`接口,开发者通过实现这个接口来定义应用程序的业务逻辑。 - 拦截器是Struts2...
Struts2是一个强大的MVC框架,它在处理用户请求时涉及到数据类型的转换,这在处理复杂的表单数据或者自定义对象时尤其重要。本篇文章将详细介绍如何在Struts2中进行配置与自定义类型转换。 首先,Struts2的配置主要...
Struts2-Spring-Plugin-2.3.4.jar 是一个专门为 Struts 2 框架和 Spring 框架整合而设计的插件,主要用于处理 Struts 2 和 Spring 之间的集成问题。在Java Web开发中,这两个框架经常一起使用,Spring 提供了依赖...
接着,当Struts2接收到相关参数时,会自动调用自定义转换器进行转换。 6. **调试与测试** 调试自定义类型转换器通常涉及到设置断点,观察转换过程中的变量状态,以及通过单元测试确保转换逻辑的正确性。在IDE如...