struts 有什么好办法处理ActionForm中Date对象

ben0759 2009-04-18 02:08:17
我用的是struts 1.3
好像在struts中需要录入数据,但是struts不支持对Date对象的解析,大家有什么好办法去将string转换成Date吗?
...全文
623 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
men2011it 2012-03-19
  • 打赏
  • 举报
回复
创建一个日期转换器类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;
}
}
}

在Form里注册
public class UserForm extends ActionForm{

static{
ConvertUtils.register(new DateConverter(), Date.class);
}

}
cxalxpks 2009-04-21
  • 打赏
  • 举报
回复
只要在数据库里 把 日期都定义为了 varchar(20) 了, 在页面做验证就可以了。。那样就不用那么麻烦了
ben0759 2009-04-21
  • 打赏
  • 举报
回复
还有吗?
ben0759 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ethan119 的回复:]
差一点点忘了,这个依赖于commons-beanutils包。我都是在form-〉vo这个时候用beanutils自动转换的,试了才知道原来struts也在用beanutils做转换,而且转换成功就赋值给ActionForm。
[/Quote]

所以应该怎么讲string转换成date呢。。
gwikimo 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wad12302 的回复:]
一般看来 是弄一个Converter  专门处理java.util.Date

主要代码如下UtilDateConverter.java
Java code


public class UtilDateConverter implements Converter {

private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

public Object convert(Class type, Object value) {
if (value == null) {
return value;
}
if (value instanceof Date) {

[/Quote]

如7楼所说,采用Converter方式可以处理,然后通过Servlet加载,印象在中,也可以通过Plug-In的方式进行加载。
ethan119 2009-04-19
  • 打赏
  • 举报
回复
差一点点忘了,这个依赖于commons-beanutils包。我都是在form-〉vo这个时候用beanutils自动转换的,试了才知道原来struts也在用beanutils做转换,而且转换成功就赋值给ActionForm。
ethan119 2009-04-19
  • 打赏
  • 举报
回复
测试了下,如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,Struts才可以转换。
wad12302 2009-04-18
  • 打赏
  • 举报
回复
一般看来 是弄一个Converter 专门处理java.util.Date

主要代码如下UtilDateConverter.java


public class UtilDateConverter implements Converter {

private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

public Object convert(Class type, Object value) {
if (value == null) {
return value;
}
if (value instanceof Date) {
return value;
}
if (value instanceof String) {
try {
return format.parse((String)value);
} catch (ParseException ignore) {
}
}
return null;
}

}


然后在弄个servlet 。InitServlet.java

public class InitServlet extends HttpServlet {

@Override
public void init() throws ServletException {

//注册日期类型的转换器
ConvertUtils.register(new UtilDateConverter(), Date.class);

}

}




注意配置 InitServlet 哦 在 web.xml 里里面配置
<servlet>
<servlet-name>initServlet</servlet-name>
<servlet-class>com.xxx.xxx.xxx.InitServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
xia0jieli 2009-04-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dadizhilong 的回复:]
用个javabean比较好做的。也更加方便点。
javabean里面用java.sql.Data
[/Quote]

我同意这个。。如果是Hibernate的话,最好把映射文件里的type改成java.sql.Date..
chenleicom 2009-04-18
  • 打赏
  • 举报
回复
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd");
String s="1998-01-02";
Date date = formatter.parse(s);
dadizhilong 2009-04-18
  • 打赏
  • 举报
回复
用个javabean比较好做的。也更加方便点。
javabean里面用java.sql.Data
ethan119 2009-04-18
  • 打赏
  • 举报
回复
sorry,看错了,Struts不会把一个字符串转化成Date再存到form里的,再用一层vo吧,把form的内容封装到一个或多个vo实例中,这样更符合面向对象的思想,呵呵。
ben0759 2009-04-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ethan119 的回复:]
Validator里有现成的验证实例。验证通过了就可以把String转成Date了。
[/Quote]

具体是怎么样的?
ethan119 2009-04-18
  • 打赏
  • 举报
回复
Validator里有现成的验证实例。验证通过了就可以把String转成Date了。
Myeclipse开发struts+hibernate+spring新手入门---环境配置----项目开发示例 Myeclipse开发struts+hibernate+spring小记 开发前准备工作: 1、下载eclipse3.1版本 下载地址: 2、下载Myeclipse插件 下载地址: 3、根据需要下载所需要的数据库驱动。 部分下载地址: 4、下载的eclipse3.1进行解压缩。安装Myeclipse,分为手工安装和自动安装两种安装方法。 具体安装方法如下: 手工安装: 自动安装: 5、安装完成后。启动Myeclipse。 准备开发工作: 步骤: 1、新建项目: New>projects后进入下图 本文主要介绍开发Web Project项目,因此需要选择Web Project,下一步,进入下图: Project Name:为需要建立的项目名称。填写好项目名称后,Finish。新建项目完成。本文在项目命名为test.。 项目建立完成之后,在Myeclipse视图,Package Explorer显示如下: test:为项目名称。 Src:为源文件所放路径。 WebRoot:为Web root folder 2、加载Struts 在所建立项目test上右键后,提示如下页面: 在弹出的菜单,根据图例提示,选择Myeclipse后在弹出的二级菜单选择Add Struts Capabilities…后提示如下图所示: 在弹出的对话框,设置如下: Struts config path:默认,一般不需要改变。 Struts specification:选择Struts版本,在此项目,选择Struts 1.2版本。 Base Package for new classes:设置为空。 取消Install Struts TLDs选项。 其他默认: Finish.后在Package Explorer的Lib包如下: 到此,加载Struts完成。在此需要关注Struts-config.xml文件。 3、加载hibernate: 同加载struts方式类似,选择Myeclipse后在弹出的二级菜单选择Add Hibernate Capabilities…后提示如下图所示: 可以根据提示,选择Hibernate Specification:本项目选择Hibernate3,其他默认,Next> 默认后直接下一步。在此可以去掉Configuration File Name的内容。Next> 后去掉下一级页面的Create SessionFactory class选项。然后Finish,Finish完成后,在Lib目录下会提示相关的jar包。 4、加载spring in action in action 同加载struts方式类似,选择Myeclipse后在弹出的二级菜单选择Add spring in action in action Capabilities…后提示如下图所示: 选择所需要的spring in action in action包,然后默认下一步,直到完成。 到此,Struts+hibernate+spring配置完成。 附加:在项目名称的右键后进入Properties然后进入Java Build Path后查看加载的jar包。 具体项目的开发详细文档请见下一篇文章《struts+hibernate+spring项目开发示例》 Myeclipse平台struts+hibernate+spring项目开发示例 接:Myeclipse开发struts+hibernate+spring新手入门---环境配置 如果您按照上篇文章配置成功,可以进行开发简单的J2EE项目。 开发前准备: 1、新建项目包:如下图: Dao:数据层;service:逻辑层;web:web展现层。 2、建立好三层架构,部署好包名。建立一个jsp文件,取名为:login.jsp 代码如下: <% @ taglib uri = " http://struts.apache.org/tags-bean " prefix = " bean " %> <% @ taglib uri = " http://struts.apache.org/tags-html " prefix = " html " %> <% @ taglib uri = " http://struts.apache.org/tags-logic " prefix = " logic " %> <% @ taglib uri = " http://struts.apache.org/tags-tiles " prefix = " tiles " %> < HTML > < HEAD > < TITLE > test < TITLE > < HEAD > < BODY > < html:form action = " /login " method = " post " > 用户名: < html:text property = " username " size = " 15 " /> < br > 密 码: < html:password property = " password " size = " 15 " />< br > < html:submit property = " submit1 " style = " FONT-WEIGHT:bold;COLOR:red " > 登 录 < html:submit > < html:form > < BODY > < HTML > 3、配置struts-config.xml文件;建立actionformbean; 改配置可以自动生成,使用eclipse进行自动生成,在建立时,如下图,可直接生成对应的action类和formbean类。 1 2 struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"> 3 4 <struts-config> 5 6 <form-beans> 7 <form-bean name="LoginForm" type="com.test.web.form.LoginForm" /> 8 9 form-beans> 10 11 12 13 <action-mappings> 14 <action attribute="LoginForm" input="/login.jsp" name="LoginForm" path="LoginAction" scope="request" type="com.test.web.action.LoginAction" validate="true"> 15 16 17 action> 18 19 action-mappings> 20 21 22 struts-config> 对应生成的formbean如下代码所示: 1 import javax.servlet.http.HttpServletRequest; 2 import org.apache.struts.action.ActionErrors; 3 import org.apache.struts.action.ActionForm; 4 import org.apache.struts.action.ActionMapping; 5 6 /** 7 * MyEclipse Struts 8 * Creation date: 11-10-2005 9 * 10 * XDoclet definition: 11 * @struts.form name="LoginForm" 12 */ 13 public class LoginForm extends ActionForm { 14 15 /** password property */ 16 private String password; 17 18 /** username property */ 19 private String username; 20 21 22 /** 23 * Method validate 24 * @param mapping
package com.actionForm; import org.apache.struts.action.*; import org.apache.struts.upload.*; public class FileActionForm extends ActionForm { private String fileName;//上传文件的名称 private String fileSize;//上传文件的大小 private String filePath;//上传文件到服务器的路径 private String fileDate;//上传文件的日期 private FormFile file;//上传文件 public String getFileName() { return fileName; } public FormFile getFile() { return file; } public String getFileSize() { return fileSize; } public String getFilePath() { return filePath; } public String getFileDate() { return fileDate; } public void setFileName(String fileName) { this.fileName = fileName; } public void setFile(FormFile file) { this.file = file; } public void setFileSize(String fileSize) { this.fileSize = fileSize; } public void setFilePath(String filePath) { this.filePath = filePath; } public void setFileDate(String fileDate) { this.fileDate = fileDate; } } package com.action; import org.apache.struts.action.*; import javax.servlet.http.*; import com.actionForm.FileActionForm; import org.apache.struts.actions.DispatchAction; import java.util.Date; import java.text.*; import org.apache.struts.upload.FormFile; import java.io.*; import java.net.URLEncoder; public class FileAction extends DispatchAction { private JDBConnection connection =new JDBConnection(); //以下方法实现文件的上传 public ActionForward upLoadFile(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForward forward=null; Date date = new Date(); FileActionForm fileActionForm = (FileActionForm) form; //FormFile用于指定存取文件的类型 FormFile file = fileActionForm.getFile(); //获取当前的文件 // 获得系统的绝对路径 String dir = servlet.getServletContext().getRealPath("/image"); //我上传的文件没有放在服务器上。而是存在D:D:\\loadfile\\temp\\ String dir="D:\\loadfile\\temp\\"; int i = 0; String type = file.getFileName(); while(i!=-1){ //找到上传文件的类型的位置,这个地方的是'.' i = type.indexOf("."); /**//* System.out.println(i);*/ /**//*截取上传文件的后缀名,此时得到了文件的类型*/ type = type.substring(i+1); } // 限制上传类型为jpg,txt,rar; if (!type.equals("jpg") && !type.equals("txt")&& !type.equals("bmp")) {//当上传的类型不为上述类型时,跳转到错误页面。 forward=mapping.findForward("error"); } else { // 将上传时间加入文件名(这个地方的是毫秒数) String times = String.valueOf(date.getTime()); //组合成 time.type String fname = times + "." + type; //InInputStream是用以从特定的资源读取字节的方法。 InputStream streamIn = file.getInputStream(); //创建读取用户上传文件的对象 //得到是字节数,即byte,我们可以直接用file.getFileSize(),也可以在创建读取对象时用streamIn.available(); // int ok=streamIn.available(); int ok=file.getFileSize(); String strFee = null; //这个地方是处理上传的为M单位计算时,下一个是以kb,在下一个是byte; if(ok>=1024*1024) { float ok1=(((float)ok)/1024f/1024f); DecimalFormat myformat1 = new DecimalFormat("0.00"); strFee = myformat1.format(ok1)+"M"; System.out.println(strFee+"M"); } else if(ok>1024 && ok<=1024*1024) { double ok2=((double)ok)/1024; DecimalFormat myformat2=new DecimalFormat("0.00"); strFee = myformat2.format(ok2)+"kb"; System.out.println(strFee+"kb"); } else if(ok<1024) { System.out.println("aaaaaaaaa"); strFee=String.valueOf(ok)+"byte"; System.out.println(strFee); } System.out.println( streamIn.available()+"文件大小byte"); //这个是io包下的上传文件类 File uploadFile = new File(dir); //指定上传文件的位置 if (!uploadFile.exists() || uploadFile == null) { //判断指定路径dir是否存在,不存在则创建路径 uploadFile.mkdirs(); } //上传的路径+文件名 String path = uploadFile.getPath() + "\\" + fname; //OutputStream用于向某个目标写入字节的抽象类,这个地方写入目标是path,通过输出流FileOutputStream去写 OutputStream streamOut = new FileOutputStream(path); int bytesRead = 0; byte[] buffer = new byte[8192]; //将数据读入byte数组的一部分,其读入字节数的最大值是8192,读入的字节将存储到,buffer[0]到buffer[0+8190-1]的部分 //streamIn.read方法返回的是实际读取字节数目.如果读到末尾则返回-1.如果bytesRead返回为0则表示没有读取任何字节。 while ((bytesRead = streamIn.read(buffer, 0, 8192)) != -1) { //写入buffer数组的一部分,从buf[0]开始写入并写入bytesRead个字节,这个write方法将发生阻塞直至字节写入完成。 streamOut.write(buffer, 0, bytesRead); } // 关闭输出输入流,销毁File流。 streamOut.close(); streamIn.close(); file.destroy(); String paths=path; System.out.println(paths); String fileName = Chinese.toChinese(fileActionForm.getFileName()); //获取文件的名称 //String fileSize = String.valueOf(file.getFileSize()); String fileDate = DateFormat.getDateInstance().format(date); String sql = "insert into tb_file values('" + fileName + "','" + strFee + "','" + fileDate + "','" + paths + "')"; connection.executeUpdate(sql); connection.closeConnection(); forward=mapping.findForward("upLoadFileResult"); } return forward; } //实现文件的下载 public ActionForward downFile(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String path = request.getParameter("path"); System.out.println(path+"111"); BufferedInputStream bis = null; BufferedOutputStream bos = null; OutputStream fos = null; InputStream fis = null; //如果是从服务器上取就用这个获得系统的绝对路径方法。 String filepath = servlet.getServletContext().getRealPath("/" + path); String filepath=path; System.out.println("文件路径"+filepath); File uploadFile = new File(filepath); fis = new FileInputStream(uploadFile); bis = new BufferedInputStream(fis); fos = response.getOutputStream(); bos = new BufferedOutputStream(fos); //这个就就是弹出下载对话框的关键代码 response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(path, "utf-8")); int bytesRead = 0; //这个地方的同上传的一样。我就不多说了,都是用输入流进行先读,然后用输出流去写,唯一不同的是我用的是缓冲输入输出流 byte[] buffer = new byte[8192]; while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) { bos.write(buffer, 0, bytesRead); } bos.flush(); fis.close(); bis.close(); fos.close(); bos.close(); return null; } }

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧