- 浏览: 734985 次
- 性别:
- 来自: 嘉兴
文章分类
- 全部博客 (386)
- Struts1.1 (2)
- Database (18)
- Core Java (15)
- Log4j (4)
- SSH (0)
- Dao (1)
- Architecture Design (1)
- References (2)
- Eclipse&MyEclipse (10)
- Hibernate (7)
- Spring (8)
- JavaMail (1)
- Data Structure And Algorithm (48)
- Struts 2 (2)
- SSI (1)
- SSL (2)
- JSTL (1)
- EJB3 (2)
- NET (2)
- XML (2)
- Components (2)
- Ant (3)
- Multi Thread (1)
- Performance Monitoring (1)
- Web Server (17)
- Oracle (1)
- jQuery (8)
- Regular Expression (1)
- Weblogic (1)
- Exception (1)
- Security (2)
- File Manipulation (1)
- JavaScript (12)
- JVM (2)
- HTML&DIV&CSS (4)
- Android (10)
- Beyond GFW (0)
- Business (0)
- SVN (6)
- 虚拟主机 (1)
- Virtual Host (3)
- My mentality (5)
- OS (15)
- ISPMP (3)
- Magento (5)
- Jsoup&HttpClient (7)
- LINUX (9)
- Database Design (0)
- Power Designer (1)
- TaobaoOpenPlatform (2)
- C/C++ (3)
- Maven (11)
- Quartz (1)
- Load Balance (1)
- Zabbix (4)
- Product&Business (1)
- Pay Interface (1)
- Tomcat (2)
- Redis (1)
- 集群 (1)
- Session (1)
- 共享Session (1)
- Jedis (1)
- jenkins (1)
- 持续集成 (1)
- Web前端 (1)
最新评论
-
aqq331325797:
特意注册账号上来说一句。牛逼!
swagger2.2.2 与 spring cloud feign冲突 -
KitGavinx:
跨顶级域名怎么保持sessionid一致?
Tomcat7集群共享Session 基于redis进行统一管理 -
jaychang:
dujianqiao 写道HI ,能否给一个完整的demo 啊 ...
淘宝订单同步方案 - 丢单终结者 -
GGGGeek:
找了一会儿,感觉mybatis应该没有这种操作,直到发现博主的 ...
mybatis collection list string -
dujianqiao:
HI ,能否给一个完整的demo 啊 ?
淘宝订单同步方案 - 丢单终结者
转自http://www.suneca.com
基
于Struts做应用程序开发的时候,对日期数据的处理,这个是最常见的,由于Struts默认是不支持自动将网页POST的数据自动转化成Date型数
据,所以,很多程序员就直接在ActionForm当中直接使用String,然后在Action当中再进行字符串跟日期数据的处理。
那假如在
ActionForm当中是使用Date类型呢?会出现什么问题?能用什么样的解决办法?我们先看一下在ActionForm当中会出现的问题先。
首
先,我们先创建一个新的Struts工程,创建一个新的ActionForm,取名叫UserForm,UserForm的实现代码如下:
import java. util. Date;
import org. apache. struts. action. ActionForm;
/**
* UserForm对应着提交页面的网页表单信息
* @author chen yuzhe
*
*/
public class UserForm extends ActionForm{
/**
* serialVersionUID
*/
private static final long serialVersionUID = - 742922986494711669L;
private int id;
private String name;
private int age;
private String loginId;
private Date birthday;
public int getAge( ) {
return age;
}
public void setAge( int age) {
this . age = age;
}
public Date getBirthday( ) {
return birthday;
}
public void setBirthday( Date birthday) {
this . birthday = birthday;
}
public int getId( ) {
return id;
}
public void setId( int id) {
this . id = id;
}
public String getLoginId( ) {
return loginId;
}
public void setLoginId( String loginId) {
this . loginId = loginId;
}
public String getName( ) {
return name;
}
public void setName( String name) {
this . name = name;
}
}
第二,编写user_form.jsp的
表单页面,user_form.jsp的代码如下:
< %@ taglib uri= "http://struts.apache.org/tags-html " prefix= "html" %>
< !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd " >
< html>
< head>
< meta http-equiv= "Content-Type" content= "text/html; charset=GBK" >
< title> 用户信息表单< / title>
< / head>
< body>
< div> < strong> 创建新用户< / strong> < / div>
< html:form action= "/userSave" >
< table width= "50%" border= "1" >
< tr>
< td> 编号< / td>
< td> < html:text property= "id" / > < / td>
< / tr>
< tr>
< td> 姓名< / td>
< td> < html:text property= "name" / > < / td>
< / tr>
< tr>
< td> 登录号< / td>
< td> < html:text property= "loginId" / > < / td>
< / tr>
< tr>
< td> 年龄< / td>
< td> < html:text property= "age" / > < / td>
< / tr>
< tr>
< td> 生日< / td>
< td> < html:text property= "birthday" / > < / td>
< / tr>
< / table>
< hr>
< html:submit> < / html:submit>
< html:reset> < / html:reset>
< / html:form>
< / body>
< / html>
第
三,配置struts-config.xml文件,struts-config.xml文件配置如下:
< !DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd " >
< struts-config>
< data-sources / >
< form-beans>
< form-bean name= "userForm" type= "zizz.struts.UserForm" > < / form-bean>
< / form-beans>
< global-exceptions / >
< global-forwards / >
< action-mappings>
< action path= "/userSave" name= "userForm" validate= "false" scope= "request" type= "zizz.struts.UserSaveAction" > < / action>
< / action-mappings>
< message-resources parameter= "zizz.struts.ApplicationResources" / >
< / struts-config>
第
四步,发布该应用程序,浏览,并提交页面,如下图所示:
提交将会报以下的错误信息:
javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:495)
org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
java.lang.IllegalArgumentException: Cannot invoke zizz.struts.UserForm.setBirthday - argument type mismatch
org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1778)
org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:1759)
org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1648)
org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:1677)
org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1022)
org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.13 logs.
会报这个问题其实就是Struts没有提供相应的转换工具,我
们都知道,网页POST过来的所有数据都是String类型,那为什么在ActionForm当中定义int型没有问题呢,原因就是Struts内部有一
个类型转换器,能够自动地将String类型转换成为int,float,double,Integer,Float,Double等类型。那继承
Struts内部有这些转换器,那我们是否可以对其进行扩展?答案是可以的,Struts的Converter框架很好地支持了这一点。
第
五步,创建一个日期转换器类DateConverter.java,该类代码如下:
import java. text. SimpleDateFormat;
import org. apache. commons. beanutils. Converter;
import java. util. Set;
import java. util. HashSet;
import java. util. Iterator;
import java. text. ParseException;
/**
*
* 日期转换对象,使用该转换器,在BaseForm当中做一下注册,系统自动地帮助字符的日期表示转换为java.util.Date对象.
* @author zizz.
* Create Time:2006-9-11 19:11:47.
*/
public class DateConverter implements Converter {
/**
* 日期格式化对象.
*/
private static SimpleDateFormat df = new SimpleDateFormat( ) ;
/**
* 模式集合.
*/
private static Set< String> patterns = new HashSet< String> ( ) ;
//注册一下日期的转换格式
static {
DateConverter. patterns. add( "yyyy-MM-dd" ) ;
DateConverter. patterns. add( "yyyy-MM-dd HH:mm" ) ;
DateConverter. patterns. add( "yyyy-MM-dd HH:mm:ss" ) ;
DateConverter. patterns. add( "yyyy/MM/dd HH:mm:ss" ) ;
}
/**
* 日期转换器.
* @param type Class
* @param value Object
* return Date Object.
*/
public Object convert( Class type, Object value) {
if ( value = = null) {
return null;
} else if ( value instanceof String) {
Object dateObj = null;
Iterator it = patterns. iterator( ) ;
while ( it. hasNext( ) ) {
try {
String pattern = ( String) it. next( ) ;
df. applyPattern( pattern) ;
dateObj = df. parse( ( String) value) ;
break ;
} catch ( ParseException ex) {
//do iterator continue
}
}
return dateObj;
} else {
return null;
}
}
}
第
六步,注册日期转换器
自定义的日期转换工作必须先做注册才能使用,注册我们可以将其放在ActionForm当中。
使
用以下代码进行注册:
ConvertUtils.register(new DateConverter(),
Date.class);
进行注册
修改完的UserForm.java如下:
import java. util. Date;
import org. apache. struts. action. ActionForm;
import org. apache. commons. beanutils. ConvertUtils;
/**
* UserForm对应着提交页面的网页表单信息
* @author chen yuzhe
*
*/
public class UserForm extends ActionForm{
static {
ConvertUtils. register ( new DateConverter( ) , Date. class ) ;
}
/**
* serialVersionUID
*/
private static final long serialVersionUID = - 742922986494711669L;
private int id;
private String name;
private int age;
private String loginId;
private Date birthday;
public int getAge( ) {
return age;
}
public void setAge( int age) {
this . age = age;
}
public Date getBirthday( ) {
return birthday;
}
public void setBirthday( Date birthday) {
this . birthday = birthday;
}
public int getId( ) {
return id;
}
public void setId( int id) {
this . id = id;
}
public String getLoginId( ) {
return loginId;
}
public void setLoginId( String loginId) {
this . loginId = loginId;
}
public String getName( ) {
return name;
}
public void setName( String name) {
this . name = name;
}
}
相关推荐
总结来说,Struts2 Converter是数据绑定和类型转换的核心工具,通过自定义Converter,开发者可以实现更精确的控制,提高数据处理的灵活性和健壮性,同时满足特定项目的需求。理解并熟练运用Converter,能够帮助我们...
Struts2是一个非常流行的Java Web框架,它提供了一种优雅的方式来构建MVC(模型-视图-控制器...通过自定义类型转换器,我们可以解决框架默认转换机制无法满足的特殊需求,如复杂的对象序列化、自定义格式的日期处理等。
Struts 2.0 是一个基于MVC设计模式的Java Web框架,它极大地简化了开发过程,特别是处理用户输入和数据转换。在Struts 2中,类型转换器(Type Converter)扮演着至关重要的角色,它负责将HTTP请求中的字符串数据转换...
在实际开发中,Struts2的类型转换有时会遇到一些问题,例如空值处理、格式错误等。对于空值,Struts2会提供默认值或允许字段为空;对于格式错误,Struts2会抛出`ConversionException`,开发者可以捕获并处理这个异常...
- **自定义转换器**:你可以为Date类型创建一个自定义的Converter,实现`org.apache.struts.action.Converter`接口,并在Struts配置文件中指定这个转换器用于处理Date类型的字段。 - **使用PropertyEditor**:在...
在Struts2中,用户通过表单提交的数据通常是字符串,而服务器端处理时往往需要将其转化为其他类型,如整型、浮点型或日期等。Struts2内置了一套类型转换机制,能够自动将字符串数据转化为预设的类型。如果默认的转换...
6. **源码分析**:提供的博客链接指向了一个关于Struts2的个人博客,尽管已失效,但通常这类资源会提供对源码的深入解析和解决问题的具体步骤。分析源码可以帮助理解Struts2内部的工作机制,从而更好地解决转换问题...
开发者只需实现`org.apache.struts2.conversion.Converter`接口,然后通过配置注册这个转换器,即可让Struts2在处理特定类型时使用自定义的转换逻辑。 在转换过程中,如果出现任何异常,Struts2的`conversionError`...
Struts2的转换器机制就是解决这个问题的关键,它允许我们自定义数据类型的转换过程,确保数据的准确性和一致性。 Struts2框架基于MVC设计模式,其中模型(Model)层处理业务逻辑,视图(View)层负责展示,控制器...
在Struts2中,类型转换是处理用户输入数据的关键环节,它允许开发者将前端表单提交的数据转换为服务器端可处理的类型。在本案例中,我们将深入探讨“struts2注册转换器”,特别是如何将特定的日期格式如"20110202...
Struts 2的魔术师——转换器,使得数据绑定变得更加灵活和强大,它能处理各种类型的数据转换工作,确保数据的正确性并提供异常处理机制。 首先,我们来理解一下转换器(Converter)的基本概念。转换器是Struts 2...
Struts2是一个强大的Java web应用程序框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了构建可维护性、可扩展性极高的Web应用的解决方案。本示例程序是一个基础的Struts2应用,旨在展示如何使用...
Struts2是一个强大的Java web开发框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了构建web应用程序的高效解决方案。本实例练习旨在帮助你深入理解Struts2的工作原理,特别是自定义类型转换和拦截...
5. **转换器Converter**:Struts2允许自定义转换器来处理数据类型转换,比如将用户输入的字符串转换为日期或数字,确保数据的正确性和一致性。 6. **表单数据验证**:Struts2提供了强大的内置验证框架,可以在...
Struts2.0内置了一系列的转换器,如默认转换器、日期转换器等,同时也支持自定义转换器,满足各种复杂类型的转换需求。通过转换器,可以有效防止数据类型不匹配导致的异常,并提高数据处理的效率。 六、Struts2.0中...
例如,假设你有一个需要接收JSON格式日期的字段,但Struts2默认的转换器可能无法正确处理这种格式。你可以创建一个自定义的`Converter`,解析JSON日期字符串,并将其转换为Java的`java.util.Date`对象。然后,通过...
此外,开发者还可以自定义类型转换器,通过实现Converter接口并注册到Struts配置中,以处理特定类型的转换需求。 四、JFreeChart使用 JFreeChart是一个用于生成图表的Java库,它在Struts应用中常用于生成动态报表和...
1. **数组属性的类型转换器**: 在处理用户提交的表单数据时,有时我们需要将一组输入值转化为数组。Struts提供了自定义转化器的能力,允许我们创建特定的转换逻辑,将字符串数组转换为指定类型的数组,例如Integer[]...
例如,用户在表单中输入的数字或日期,可以通过Struts的Converter机制自动转化为对应的Integer或Date类型。 4. **文件上传下载**: Struts支持文件上传和下载功能。在ActionForm中定义一个File类型的属性来接收...
- **`StrutsTypeConverter`**:则用于处理更复杂的对象类型转换,如日期、自定义对象等。 为了更好地支持类型转换,Struts2允许开发者通过配置文件来指定特定类型的转换规则。具体来说,可以利用 `conversion....