Java 如何从jsp向Struts2操作输入日期?
在我的jsp页面中,我面临很多问题。我应该使用什么标记从用户处获取日期(yyyy-MM-dd)并将其存储在Struts2操作的日期属性中 我的操作中的属性声明为java.util.Date。我希望来自jsp页面的输入能够进入这个属性 请帮忙Java 如何从jsp向Struts2操作输入日期?,java,jsp,struts2,Java,Jsp,Struts2,在我的jsp页面中,我面临很多问题。我应该使用什么标记从用户处获取日期(yyyy-MM-dd)并将其存储在Struts2操作的日期属性中 我的操作中的属性声明为java.util.Date。我希望来自jsp页面的输入能够进入这个属性 请帮忙 如果使用s:textfield标记以正确的格式输入日期,则会出现无效字段错误(在JSP中)。因此,可能我不理解这个问题。但我希望这个例子能有所帮助(顺便说一句,这段代码不会仅仅是为了帮助您了解sturts2是如何发挥其魔力的);因此,对于表单输入,您需要在j
如果使用s:textfield标记以正确的格式输入日期,则会出现无效字段错误(在JSP中)。因此,可能我不理解这个问题。但我希望这个例子能有所帮助(顺便说一句,这段代码不会仅仅是为了帮助您了解sturts2是如何发挥其魔力的);因此,对于表单输入,您需要在java中有一个holder类,以便可以从操作类(如holder.java)调用日期:
public class Holder{
pirvate Date date;
public getDate(){
return date;
}
public setDate(Date date){
this.date = date;
}
}
您的Holder.java验证,因此您可以确保它是date Holder-validation.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="date">
<field-validator type="date">
<message><![CDATA[ Must be a date ]]></message>
</field-validator>
</field>
</validators>
您可以使用jsp表单,让客户端能够输入日期。确保输入name=“holder.date”。以下是site.jsp:
<s:form id="Form" name="MyForm" action="getDateAction" method="post" class="form">
<input type="text" name="holder.date" id="date" size="25" value="" class="required text">
</s:form>
最后但并非最不重要的一点是您的struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="example" extends="struts-default">
<action name="getdate" class="com.location.action.getDateAction">
<result>example.jsp</result>
</action>
</package>
</struts>
但是我相信您在jsp中寻找的标记是
<s:date name="Date_Name" format="yyyy-MM-dd" />
其中Date\u Name是Java中的日期对象。标签只显示日期,不提供输入
我不相信Struts提供现成的日期输入,除非您使用日期时间选择器,它是一个dojo/javascript标记。有关这方面的更多信息,请参见:
如果您不遵循这条路线,那么很可能需要将JSP上的日期映射为字符串,然后在action类中格式化它。您可以通过让Struts先验证值来简化这一过程。我就是这样解决的
<s:date name="nameOfInputVal" var="formattedVal"/>
<s:textfield name="nameOfInputVal" value="%{#formattedVal}" key="labelkey" />
它指示默认格式,您不必在每个日期标记中写入它
希望这有帮助我知道这篇文章有点老了,但一个解决方案可能对其他人有用
Struts的默认转换器似乎无法正常工作。字段错误甚至发生在从操作填充的只读字段中
我通过定义自己的转换器解决了这个问题:
创建转换器类(使用所需的日期格式):
将转换注释放在属性设置器上(或使用conversion.properties文件)
在我的例子中,我不需要编辑它,但希望在jsp中指定格式。
我使用了一个额外的隐藏字段来保留原始值(另一种选择是使用Preparable接口):
jsp:
<s:textfield name="date" id="date" key="invitation.date" required="true" value="%{getText('format.date',{date})}" size="8"/>
Action.java
import java.util.Date;
private Date date;
public void setDate(Date date) {
this.date = date;
}
脚本:
您可以添加jquery.datepicker(我不推荐struts datepicker):
私人日期;
公共无效设置日期(字符串日期){
//setter方法参数类型为String
试一试{
this.date=新的SimpleDataFormat(“yyyy-MM-dd”).parse(日期);
}捕获(解析异常){
e、 printStackTrace();
}
}
提交
我尝试了一个解决方案,它成功了:)
1) 将要在数据库表中存储日期的列仅保留为“日期”数据类型。
2) 在JSP页面中仅使用Textfield标记。不要使用日期标记。
注意:确保仅通过在textfield标记中放置占位符,才能使用YYYY-MM-DD格式设置用户输入日期
3) 保留用于访问字符串类型字段的变量。不要使用日期数据类型。
4) 现在运行查询:选择日期格式(datecolumnname,'%d/%m%/Y')作为tablename中的日期并且您将以dd/mm/yyyy格式从该列获取日期,即使它以yyyy-mm-dd格式存储在表中。
5) 您还可以将datecolumn的数据与curdate()及相关函数进行比较,结果如下:)。
6) 就像我使用的查询:选择id、name、DATE_格式(datecolumnname、%d/%m/%Y')作为tablename中的datecolumn2,其中datecolumnname>=curdate()我不使用Struts,所以我不能给出一个直接的答案,但是任何合适的MVC框架都应该为任何非字符串值提供类型转换。查看此链接以获得一些提示:struts2处理日期类型似乎有问题。那么,是否有其他方法可以以适当的格式获取日期并将其存储在JavaS中的date对象中:date标记用于以各种格式输出java.lang.date值,而不是用于表单输入。或者更简单:。但这并不能解决将日期解析为在操作中指定的日期的问题!我同意Pierre的观点,当您发送表单时,输入是字符串,然后Struts 2将字符串转换为日期,但问题是:Struts 2在哪里配置此转换的默认格式?@DavidGarcíaGonzález必须使用转换器进行转换。更直截了当:
然后
这是我第n次觉得有必要添加这样的评论:不要像那样使用SimpleDataFormat。当两个线程同时使用它时,它将产生垃圾。@Samuel是的。最快的修复方法是将其放在ThreadLocal中。最好的解决方法是使用另一个日期/时间框架。每次访问getter时创建SimpleDateFormat
效率低下。
public class StringToDateTimeConverter extends StrutsTypeConverter {
// WARNING not safe in multi-threaded environments
private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss");
public Object convertFromString(Map context, String[] strings, Class toClass) {
if (strings == null || strings.length == 0 || strings[0].trim().length() == 0) {
return null;
}
try {
return DATETIME_FORMAT.parse(strings[0]);
} catch (ParseException e) {
throw new TypeConversionException("Unable to convert given object to date: " + strings[0]);
}
}
public String convertToString(Map context, Object date) {
if (date != null && date instanceof Date) {
return DATETIME_FORMAT.format(date);
} else {
return null;
}
}
}
@Conversion()
public class MyEditAction {
// ...
@TypeConversion(converter="my.app.common.converter.StringToDateTimeConverter")
public void setUploadedDate(Date uploadedDate) {
this.uploadedDate = uploadedDate;
}
<s:textfield name="uploadedDateDisplay" value="%{getText('format.datetimesecond',{uploadedDate})}" size="70" disabled="true"/>
<s:hidden name="uploadedDate" />
<s:textfield name="date" id="date" key="invitation.date" required="true" value="%{getText('format.date',{date})}" size="8"/>
format.date={0,date,dd/MM/yyyy}
import java.util.Date;
private Date date;
public void setDate(Date date) {
this.date = date;
}
$("#date").datepicker({dateFormat: dateFormat});
private Date date;
public void setDate(String date) {
//setter method param type is String
try {
this.date=new SimpleDateFormat("yyyy-MM-dd").parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
<form action="target.do">
<input name="date" value="2015-5-28">
<button type="submit">submit</button>
</form>