Struts 2 datepicker带有时间验证

时间:2014-04-21 09:57:29

标签: java jquery validation struts2 datepicker

我是Struts2的新手。我正在使用Struts2 JQuery datepicker tag。但我无法验证它。在我的validation.xml文件中,我将其视为date,但它删除了时间部分。任何解决方案?我应该使用正则表达式来验证我的日期时间吗?

JSP表格

代码与earlier question

中的代码有些相同

动作类

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验证器吗?

更新

对于实验,我删除了验证部分,但在操作中收到的时间仍为00:00:00

更新2 我找到了一种解决这个问题的方法,就像正则表达式的注释中所提到的那样,或者有一种struts验证方式将字符串验证为日期(比如使用validate()方法,我不确定它是不是好的做法)。

更新的代码(更新2)

动作类

@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 :(得分:1)

使用validate()验证您的操作代码是一种很好的做法。这种类型的验证称为编程验证,并在validation interceptor下的Struts文档中进行了描述。您可以配置此拦截器以执行默认设置的各种验证。因此,通过覆盖验证方法vs 声明性验证来使用程序验证是一种可以在您的操作中合法执行的方法。当然,您可以通过相同的拦截器进行两种类型的验证。该框架支持核心包使用的许多基本验证器,所有这些验证器都在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值,则需要多次解析)。此外,无论上下文的语言环境如何,它都使用固定格式模式。