有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Struts 2中带时间验证的java日期选择器

我正在使用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 我找到了一种解决这个问题的方法,如在对这个问题的评论中提到的那样。我也放弃了验证。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);

  ...
}

共 (1) 个答案

  1. # 1 楼答案

    使用validate()验证操作代码是一种良好的做法。这种类型的验证称为编程的验证,在^{} interceptor下的Struts文档中进行了描述。您可以将此拦截器配置为执行所有类型的验证,这是默认设置。因此,通过重写validate方法vs声明性验证来使用编程验证是一种合法的方法。当然,您可以通过同一个拦截器执行这两种类型的验证。该框架支持核心包使用的许多基本验证器,所有这些验证器都在bundled validators一节中描述。您还可以通过提供自定义验证器来扩展框架。用于验证两个字段的custom validator经典示例

    无论您选择哪种类型的验证,您不应该在action方法中这样做(除非您有理由这样做,并且您知道自己在做什么),因为您可以使用框架功能和验证框架将验证逻辑与控制器逻辑分离(假设业务逻辑在服务层上执行)

    您应该修复的代码:

    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值,则需要解析两次)。此外,它使用固定格式模式,而不考虑上下文的区域设置