2014-04-21 40 views
2

我是Struts2的新手。我正在使用Struts2 JQuery datepicker tag。但我無法驗證它。在我的validation.xml文件中,我將它作爲date,但它刪除了時間部分。任何解決方案?我應該使用正則表達式來驗證我的日期時間嗎?Struts 2 datepicker與時間驗證

JSP表單

代碼是有點相同,因爲它是在我earlier question

Action類

public Date getDateAndTimeOfOccurance() { 
    return dateAndTimeOfOccurance; 
} 

public void setDateAndTimeOfOccurance(Date dateAndTimeOfOccurance) { 
    System.out.println(dateAndTimeOfOccurance); 
    this.dateAndTimeOfOccurance = dateAndTimeOfOccurance; 
} 

public String execute() throws Exception { 
    . 
    . 

    ps.setTimestamp(13, new java.sql.Timestamp(getDateAndTimeOfOccurance().getTime())); 
    /* i have modified my database because the time values in java.sql.Date have been depreciated */ 

    . 
    . 
} 

是否有任何現有的解決方案?我應該使用regex驗證程序嗎?

UPDATE

對於實驗,我刪除了驗證的一部分,但在行動收到的時間仍是00:00:00

更新2 我發現了一種通過在正則表達式的評論中提到的或有驗證字符串作爲一個日期的支柱驗證方式recieving解決這個問題(如使用validate()方法,我不知道這是一個很好的做法)。

更新的代碼(與更新2)

Action類

@RequiredStringValidator(message = "Please enter the date and time of occurance") 
public String getDateAndTimeOfOccurance() { 
    return dateAndTimeOfOccurance; 
} 

public void setDateAndTimeOfOccurance(String dateAndTimeOfOccurance) { 
    this.dateAndTimeOfOccurance = dateAndTimeOfOccurance; 
} 

public void execute(){ 
    .... 
    Date d = null; 
    try { 
     d = new SimpleDateFormat("dd-MMM-yyyy hh:mm", Locale.getDefault()).parse(getDateAndTimeOfOccurance()); 
    } catch (java.text.ParseException e) { 
     e.printStackTrace(); 
     addFieldError(dateAndTimeOfOccurance, "Please enter a valid date"); 
     return INPUT; 
    } 
    Timestamp t = new java.sql.Timestamp(d.getTime()); 
    ps.setTimestamp(13, t); 

    ... 
} 
+1

您是否閱讀過該問題的評論? –

+0

@AleksandrM謝謝。但我無法驗證它。我應該使用正則表達式還是日期? – maxx777

+0

@ maxx777你已經提出了同樣的問題http://stackoverflow.com/q/22836503/573032。如果你可以更新它,這反映了最後的狀態,並以一些可讀的格式來制定問題,順便說一句,你有什麼不喜歡你有答案,你接受? –

回答

1

使用validate()驗證您的操作代碼是一個很好的做法。這種驗證稱爲編程驗證,並在他的Struts文檔中描述了validation interceptor。您可以配置此攔截器以執行各種驗證,這是默認設置。因此,通過重寫驗證方法來使用編程驗證,聲明驗證是您在操作中可以合法執行的一種方式。當然,你可以通過同一個攔截器進行兩種類型的驗證。該框架支持核心軟件包使用的許多基本驗證器,所有這些都在bundled validators部分進行了描述。您還可以通過提供自定義驗證器來擴展框架。 custom validator經典示例用於驗證兩個字段。

無論您選擇哪種驗證類型,都不應該在操作方法中執行此操作(除非您有理由這樣做,並且您知道您在做什麼),因爲您可以使用框架功能和驗證框架將驗證邏輯與控制器邏輯分開(假定業務邏輯在服務層上執行)。

的代碼,你應該修正:

protected static SimpleDateFormat getDateFormat(){ 
    return new SimpleDateFormat("dd-MMM-yyyy hh:mm"); 
} 

@Override 
public void validate(){ 
    try { 
    SimpleDateFormat df = getDateFormat(); 
    df.parse(dateAndTimeOfOccurance); 
    } catch (java.text.ParseException e) { 
    e.printStackTrace(); 
    addFieldError(dateAndTimeOfOccurance, "Please enter a valid date"); 
    } 
} 


@Override 
public void execute() throws Exception { 
    SimpleDateFormat df = getDateFormat(); 
    Date d = df.parse(dateAndTimeOfOccurance); 
    Timestamp t = new java.sql.Timestamp(d.getTime()); 
    ps.setTimestamp(13, t); 
    ... 
    return SUCCESS; 
} 

此代碼有點笨拙,因爲它需要兩倍(和多次解析字符串現場根據需要,如果你想從字符串領域的Date值)。此外,它使用固定格式的模式,而不考慮上下文的​​語言環境。