【问题标题】:Datepicker with time validation in Struts 2Struts 2 中具有时间验证的日期选择器
【发布时间】:2014-04-21 09:57:29
【问题描述】:

我正在使用Struts2 JQuery datepicker tag

但我无法验证它。在我的validation.xml 文件中,我将其视为date,但它删除了时间部分。有什么解决办法吗?我应该使用正则表达式来验证我的日期时间吗?

JSP 表单

代码与我之前的问题Struts2 jquery datepicker passing 0 or null value to action class中的代码有些相同

动作类:

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 我找到了一种方法来解决这个问题,方法是收到这个问题Struts2 JQuery Datepicker not working properly 的 cmets 中提到的内容。我也删除了validation.xml。现在我正在使用注释。现在的问题是如何验证它?应该是regex 还是有一种将字符串验证为日期的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);

  ...
}

【问题讨论】:

  • 你读过那个问题的 cmets 吗?
  • @AleksandrM 谢谢。但我无法验证它。我应该使用正则表达式还是日期?
  • @maxx777 你已经问过同样的问题stackoverflow.com/q/22836503/573032。如果你可以更新它,这反映了最后一个状态并以某种可读的格式提出问题,顺便说一句,你不喜欢你接受的答案吗?
  • @RomanC 我创建了一个新帖子,因为这次我遇到了另一个问题。之前是因为命名约定,这次是因为插件本身的转换问题。如果它不道德,那么我应该删除其中一个帖子。由于我在社区的帮助下解决了这两个问题,请告诉我是否应该删除该帖子。谢谢先生
  • @maxx777 如果您有新问题,请仅发布相关代码,不要复制它,只需参考上一个问题即可。因此,编辑问题并删除重复代码,突出显示问题并解释它与前一个问题的不同之处。然后发布一个答案,如果您解决了问题,请接受它。

标签: java jquery validation struts2 datepicker


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2013-02-02
    相关资源
    最近更新 更多