我在我的jsp頁面中遇到了很多問題。我應該使用什麼標籤從用戶處獲取日期(yyyy-MM-dd)並將其存儲在Struts2操作的Date屬性中?如何將日期輸入到jsp的Struts2動作?
我的行爲屬性被聲明爲java.util.Date。我想從jsp頁面輸入到這個屬性。
請大家幫忙。
我得到無效的字段錯誤(在JSP中)如果使用s:textfield標記來以正確的格式輸入日期。
我在我的jsp頁面中遇到了很多問題。我應該使用什麼標籤從用戶處獲取日期(yyyy-MM-dd)並將其存儲在Struts2操作的Date屬性中?如何將日期輸入到jsp的Struts2動作?
我的行爲屬性被聲明爲java.util.Date。我想從jsp頁面輸入到這個屬性。
請大家幫忙。
我得到無效的字段錯誤(在JSP中)如果使用s:textfield標記來以正確的格式輸入日期。
所以也許我不明白這個問題。但我希望這個例子能夠幫助(順便說一句,這段代碼不會起作用,它只是爲了讓你瞭解它是如何運作的)。因此,對於表單輸入你需要有在Java holder類,所以你可以從你的動作類打電話給你的日期,例如Holder.java:
public class Holder{
pirvate Date date;
public getDate(){
return date;
}
public setDate(Date date){
this.date = date;
}
}
你Holder.java驗證,所以你可以確保它的日期持有人-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>
Action類,你打電話給你的化妝肯定holder.getdate讓你的約會getDateAction.java:
private Holder holder;
public class getDateAction{
public String execute(){
//get your date
Date date = holder.getDate();
return SUCCESS;
}
}
,你給CLI爲JSP表單有能力輸入日期。確保輸入名稱=「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對象。
它沒有工作。我試過這個 – Anand 2010-03-08 14:39:59
s:date標記用於輸出各種格式的java.lang.Date值,而不是表單輸入。 – 2011-03-25 20:12:41
<s:date />
標籤只顯示日期 - 它不提供輸入。
我不相信Struts提供了開箱即用的日期輸入,除非您使用日期時間選擇器,這是一個dojo/javascript標記。更多的信息在這裏:http://struts.apache.org/2.0.14/docs/datetimepicker.html
如果你不走這條路線,你很可能需要將你的JSP日期映射到一個字符串,然後在你的動作類中進行格式化。通過讓Struts首先驗證值,可以使這更容易。
這就是我解決這個問題的方法。
<s:date name="nameOfInputVal" var="formattedVal"/>
<s:textfield name="nameOfInputVal" value="%{#formattedVal}" key="labelkey" />
而在你的消息屬性鍵/值:
struts.date.format=dd/MM/yyyy
指示默認格式,你不必把它寫在每個日期的標籤。
希望這有助於
或更直截了當:。但是這並不能解決將日期解析爲日期的問題! –
2011-03-25 20:13:56
或'format'可以添加到's:date'標籤 – draw 2012-01-19 21:28:57
我同意Pierre的觀點,當你發送表單時,輸入是String,然後Struts 2將String轉換成日期,但問題是:Where does Struts 2爲此轉換配置默認格式? – 2012-06-13 08:20:30
我知道這個帖子是有點老,但一個解決方案可能是有用的人。
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;
}
}
}
把轉換註釋的屬性setter(
我定義我自己的轉換器解決了它或使用conversion.properties文件)
@Conversion()
public class MyEditAction {
// ...
@TypeConversion(converter="my.app.common.converter.StringToDateTimeConverter")
public void setUploadedDate(Date uploadedDate) {
this.uploadedDate = uploadedDate;
}
在我的情況下,我不需要編輯它,但想要在jsp中指定格式。 我用了一個額外的隱藏字段,以保持原來的值(另一種選擇將是使用製備的接口):
<s:textfield name="uploadedDateDisplay" value="%{getText('format.datetimesecond',{uploadedDate})}" size="70" disabled="true"/>
<s:hidden name="uploadedDate" />
對於第n次我感到不得不添加此評論:不要使用SimpleDateFormat。當兩個線程同時使用它時會產生垃圾。 – Bloodboiler 2013-12-19 09:16:21
這裏是「靜態」的原因嗎?隨時編輯我的答案 – Samuel 2013-12-21 11:39:46
@Samuel是的。最快的解決方法是將其放入ThreadLocal中。最好的解決方法是使用另一個日期/時間框架。 – 2014-09-26 13:39:20
JSP:
<s:textfield name="date" id="date" key="invitation.date" required="true" value="%{getText('format.date',{date})}" size="8"/>
的.properties
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(我不推薦支柱日期選擇器): http://jqueryui.com/datepicker/
$("#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>
每次訪問getter時創建'SimpleDateFormat'效率不高。 – 2015-05-28 09:06:09
有一個解決方案,我想和它工作:)
1)僅在「DATE」數據類型中保留要在其中將數據存儲在其中的列。 2)在JSP頁面中只使用Textfield標籤。不使用Date標籤。
注意:確保僅通過在文本字段標記中放置佔位符,以YYYY-MM-DD格式製作用戶輸入日期!
3)保持變量只訪問字符串類型的字段。不使用DATE數據類型。
4)現在運行查詢:從tablename中選擇DATE_FORMAT(datecolumnname,'%d /%m%/ Y')作爲date_two;,即使它在表格中以YYYY-MM-DD格式存儲,您也將從該列中獲得日期,格式爲dd/mm/yyyy格式。
5)您還可以將您的日期列的數據與curdate()及相關函數進行比較,它也可以工作:)。
6)像我用過的查詢:從tablename where datecolumnname> = curdate()中選擇id,name,DATE_FORMAT(datecolumnname,'%d /%m /%Y')作爲datecolumn2。
我不做Struts,所以我不能直接給出答案,但任何體面的MVC框架都應該爲任何非String值提供類型轉換。檢查這個鏈接的一些提示:http://google.com/search?q=struts2+date+converter – BalusC 2010-03-07 18:59:25
似乎有一個問題,struts2處理日期類型很好。那麼有什麼其他方式可以以適當的格式獲取日期並將其存儲在java中的日期對象中 – Anand 2010-03-07 19:10:24