- 浏览: 275227 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
qq642617822:
有用,谢谢了。
eclipse 导入jquery后报错 -
nbh219:
电脑配置问题?
MyEclipse+tomcat debug启动非常之慢 -
bngd032:
如此做了,还是不行的,我的myeclipse里没有断点 ...
MyEclipse+tomcat debug启动非常之慢 -
x9x9x9x9:
很管用呀
eclipse 导入jquery后报错
基于Struts做应用程序开发的时候,对日期数据的处理,这个是最常见的,由于Struts默认是不支持自动将网页POST的数据自动转化成Date型数据,所以,很多程序员就直接在ActionForm当中直接使用String,然后在Action当中再进行字符串跟日期数据的处理。那假如在ActionForm当中是使用Date类型呢?会出现什么问题?能用什么样的解决办法?我们先看一下在ActionForm当中会出现的问题先。首先,我们先创建一个新的Struts工程,创建一个新的ActionForm,取名叫UserForm,UserForm的实现代码如下: 程序代码
package zizz.struts; 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的代码如下: 程序代码
<%@ page contentType="text/html; charset=GBK"%>
<%@ 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>
<?xml version="1.0" encoding="UTF-8"?>
<!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>
第四步,发布该应用程序,浏览,并提交页面,如下图所示:
提交将会报以下的错误信息:
程序代码
exception
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,该类代码如下:
程序代码
package zizz.struts;
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如下:
程序代码
package zizz.struts;
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;
}
}
发表评论
-
maven 安装jar包命令
2017-03-11 10:43 877mvn install:install-file -Dfile ... -
aspose word 单元格加斜杠
2017-03-10 17:14 1371Document doc = new Document(); ... -
beans profile
2017-03-01 17:05 527http://www.cnblogs.com/pangguom ... -
一个action操作两个service,其中一个报错,如何保证事务的一致性?
2016-05-17 14:14 1748你可以把这两个操作写在一个Service中,一般一个Actio ... -
web service 事物
2016-05-17 11:31 551转载:http://www.griddss.cn/show.a ... -
java 为什么只能单继承
2016-05-12 14:33 817从技术的角度来说,是为了降低复杂性。例如,A类中有一个m方法, ... -
java 递归
2015-12-23 16:13 556//菜单树形结构 public JSONArray tre ... -
bootstrap 验证是否通过
2015-11-27 17:57 739alert($('#formname').data('boot ... -
springMvc分页
2015-11-10 17:26 783@Override public Pagination&l ... -
jdbc 连接mysql
2015-10-13 13:45 596import java.sql.Connection; i ... -
java 定时任务
2015-07-31 19:54 601import java.util.TimerTask; ... -
java 判断为空
2015-07-31 18:44 656list.add(obj.getRegion()==null? ... -
js json里加数据
2015-03-21 09:28 552//记录答案 prop 属性,答案 function co ... -
查询多表返回一个list
2015-03-18 10:29 1083public List<?> getCourse ... -
判断多个参数
2015-03-12 17:09 508/** * @param obj 判断传入参数是否为空,如 ... -
xml 路径
2014-10-30 17:44 723三、如何获取XML文件全路径并读取配置参数 获取XML ... -
json嵌套 解析
2014-08-11 10:44 676JSONArray group = jsonObj.get ... -
java 读取txt和解析json
2014-08-06 16:20 1822File file = new File("e:\ ... -
读取properties配置文件里边的属性方法
2014-07-10 18:40 1092/** * */ package com.xcj ... -
求最大值和百分比
2014-07-09 19:20 750int[] num={4,3,1,7}; int ma ...
相关推荐
### Struts框架中Date问题解决方法 在使用Struts框架进行Web应用开发的过程中,经常会遇到对日期类型数据的处理。由于Struts框架的核心组件ActionForm会自动封装表单中的数据到对应的JavaBean对象中,因此当涉及到...
- **使用PropertyEditor**:在ActionForm或Action类中注册一个自定义的`java.beans.PropertyEditor`,处理日期字符串到Date对象的转换。 - **使用Struts的datetime标签**:如果使用Struts的标签库,可以使用`...
在实际应用中,你可能还需要处理时区问题,因为用户可能来自全球各地。可以使用`java.util.TimeZone`来处理不同的时区,或者利用Joda-Time或Java 8的`java.time`包提供更丰富的日期时间操作。 综上所述,Struts中...
在本案例中,问题出在Struts框架对`java.util.Date`类型的处理上,它默认处理的是`java.sql.Date`,而实际传入的数据可能是`java.util.Date`或者其他格式。 为了解决这个问题,有两种主要的处理方法: 1. **使用...
- 使用Struts构建的应用程序通常遵循一个固定的请求响应流程:客户端发送请求至控制器(ActionServlet),控制器根据配置转发到相应的模型层(ActionForm)进行处理,并最终返回视图层(如JSP页面)展示结果。...
然而,在处理大型项目时,传统ActionForm可能会带来一些不便,比如需要手动创建大量的ActionForm类,并且当表单字段发生变更时,还需要修改并重新编译这些类。 为了解决这一问题,Struts 1.1引入了一个新的概念——...
示例代码中还引用了一些辅助类,例如 `ListPage`、`Date`、`Calendar` 和 `Vector`,这些可能是用于处理分页、日期和集合数据的。此外,还有 `URLEncoder` 类用于编码文件名以避免 URL 中的特殊字符问题。 7. **...
在ActionForm中定义一个File类型的属性来接收上传的文件,然后使用Commons FileUpload库处理文件。下载通常通过Servlet或Action来实现,将文件内容写入响应流中,供客户端下载。 5. **国际化(i18n)**: Struts...
相比于Struts内置的ActionForm Bean验证方式,Struts Validator提供了更灵活、更强大的验证功能,能够处理复杂的验证逻辑,并且可以与Spring和Hibernate等其他框架无缝集成,形成完整的Struts2 + Spring + Hibernate...
- `java.text.NumberFormat`和`java.util.Date`用于处理数字和日期的格式化,确保数据在展示或存储时遵循特定的格式。 6. **日志记录**: - `LogFactory`和`Log`是Apache Commons Logging的一部分,用于记录应用...
它们通常继承自`org.apache.struts.action.ActionForm`类,并且包含一系列的属性,这些属性对应HTML表单中的各个输入元素。当用户提交表单时,Struts框架会自动将请求参数填充到对应的FormBean属性中。 二、日期...
7. **ActionForm**:在Struts1中,`ActionForm`类是Form Bean的实现,你可以在这里处理时间字段的验证和转换逻辑。 8. **日期格式化**:在Java中,`SimpleDateFormat`类用于解析和格式化日期。自定义转换器通常会...
然而,内置的Converter仅支持基础类型,对于复杂类型如`java.util.Date`,需要自定义Converter。自定义Converter后,需要创建`BeanUtilsBean`实例来注册和使用。 4. **在Struts中的应用**: 在Struts框架中,...
这个元素用于定义ActionForm Bean,即处理用户表单数据的类。每个`form-bean`子元素代表一个ActionForm,包含`name`(唯一标识)、`type`(ActionForm类的全限定名)等属性。动态Action FormBean还需要`form-...
- **ActionForm**:表单类,封装用户输入的数据。 - **Action**:业务逻辑组件,处理请求并调用模型。 - **ActionMapping**:映射Action与URL的关系。 - **Tiles**:视图组织工具,用于创建复杂的页面布局。 ...
Struts通过定义Action类来处理HTTP请求,ActionForm对象则用于封装用户输入的数据,而配置文件(struts-config.xml)是整个框架的灵魂,它定义了请求和Action之间的映射关系,以及ActionForm的使用等。在数据库连接...
在文档中,你将会找到关于如何配置Validator的详细指南,包括各种内置验证器的使用方法(如required、int、date等),以及如何自定义验证器来满足特定需求。此外,文档还会解释如何在JSP页面上显示验证错误,通常...
在Struts的ActionForm中,用于接收文件的字段必须是`FormFile`类型的,例如: ```java private String title; private FormFile myfile; // setter 和 getter 方法 public String getTitle() { return title; } ...