我在jsp页面中遇到了很多问题。我应该用什么标签从用户那里获取日期(yyyy-MM-dd)并将其存储在Struts2动作的Date属性中?
我的操作中的属性声明为java.util.Date。我希望jsp页面的输入落在这个属性中。
请帮忙。
如果使用s:textfield标记以正确的格式输入日期,我会收到无效字段错误(在JSP中)。
答案 0 :(得分:10)
我知道这篇文章有点旧,但解决方案可能对其他人有用。
Struts的默认转换器似乎无法正常工作。即使从操作中填充了只读字段,也会出现字段错误。
我通过定义自己的转换器来解决它:
创建转换器类(使用您需要的日期格式):
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.properties文件)
@Conversion()
public class MyEditAction {
// ...
@TypeConversion(converter="my.app.common.converter.StringToDateTimeConverter")
public void setUploadedDate(Date uploadedDate) {
this.uploadedDate = uploadedDate;
}
在我的情况下,我不需要编辑它,但想在jsp中指定格式。 我使用了一个额外的隐藏字段来保持原始值(另一个替代方案是使用Preparable接口):
<s:textfield name="uploadedDateDisplay" value="%{getText('format.datetimesecond',{uploadedDate})}" size="70" disabled="true"/>
<s:hidden name="uploadedDate" />
答案 1 :(得分:4)
这就是我解决这个问题的方法。
<s:date name="nameOfInputVal" var="formattedVal"/>
<s:textfield name="nameOfInputVal" value="%{#formattedVal}" key="labelkey" />
在您的邮件属性中有一个键/值:
struts.date.format=dd/MM/yyyy
表示默认格式,您不必在每个日期标记中写入。
希望这有帮助
答案 2 :(得分:1)
所以也许我不明白这个问题。但我希望这个例子有所帮助(顺便说一句,这段代码不会起作用,只是为了让你了解sturts2如何发挥其魔力);所以对于表单输入,你需要在java中有一个holder类,所以你可以从你的动作类中调用你的日期,比如Holder.java:
public class Holder{
pirvate Date date;
public getDate(){
return date;
}
public setDate(Date date){
this.date = date;
}
}
您的Holder.java验证,以便您可以确保其日期为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>
你的行动类,你打电话给你确认holder.getdate来获取你的约会日期getDateAction.java:
private Holder holder;
public class getDateAction{
public String execute(){
//get your date
Date date = holder.getDate();
return SUCCESS;
}
}
您的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>
有关Struts2日期格式的解释,请访问:Struts 2 Date Format Examples
但我相信你在jsp中寻找的标签是
<s:date name="Date_Name" format="yyyy-MM-dd" />
其中Date_Name是Java中的Date对象。
答案 3 :(得分:0)
<s:date />
标记仅显示日期 - 它不提供输入。
我不相信Struts提供开箱即用的日期输入,除非您使用日期时间选择器,这是一个dojo / javascript标记。有关详细信息,请访问:http://struts.apache.org/2.0.14/docs/datetimepicker.html
如果你不沿着那条路走下去,你很可能需要将JSP上的日期映射到一个字符串,然后在你的动作类中对它进行格式化。您可以通过让Struts首先验证值来简化这一过程。
答案 4 :(得分:0)
<强> JSP:强>
<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}
<强> Action.java 强>
import java.util.Date;
private Date date;
public void setDate(Date date) {
this.date = date;
}
<强>脚本:强> 你可以添加jquery.datepicker(我不建议使用struts datepicker): http://jqueryui.com/datepicker/
$("#date").datepicker({dateFormat: dateFormat});
答案 5 :(得分:0)
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>
答案 6 :(得分:0)
有一种解决方案,我尝试过它有效:)
1)将要存储日期的列保存在&#34; DATE&#34;中的数据库表中。仅限数据类型。
2)在JSP页面中仅使用Textfield标签。不要使用Date标签
注意:确保仅通过在textfield标记中放置占位符,使用户输入日期为YYYY-MM-DD格式!
3)保留变量以仅访问字符串类型的字段。不要使用DATE数据类型
4)现在运行查询:从表名中选择DATE_FORMAT(datecolumnname,&#39;%d /%m%/ Y&#39;)作为date_two; ,您将从该列获取日期dd / mm / yyyy格式,即使它在表格中以YYYY-MM-DD格式存储
5)您还可以将日期列的数据与curdate()和相关函数进行比较,并且它可以工作:)。
6)像我使用的查询一样:从tablename中选择id,name,DATE_FORMAT(datecolumnname,&#39;%d /%m /%Y&#39;)作为datecolumn2,其中datecolumnname&gt; = curdate(); 强>