【问题标题】:How to input Date to a Struts2 action from a jsp?如何从 jsp 将日期输入到 Struts2 动作?
【发布时间】:2011-01-24 17:54:08
【问题描述】:

我在我的 jsp 页面中遇到了很多问题。我应该使用什么标签从用户那里获取日期(yyyy-MM-dd)并将其存储在 Struts2 操作的 Date 属性中?

我的操作中的属性被声明为 java.util.Date。我希望来自 jsp 页面的输入登陆这个属性。

请帮忙。

如果使用 s:textfield 标签以正确的格式输入日期,我会收到 Invalid field 错误(在 JSP 中)。

【问题讨论】:

  • 我不做 Struts,所以我不能给出直接的答案,但是任何像样的 MVC 框架都应该为任何非字符串值提供类型转换。检查此链接以获取一些提示:google.com/search?q=struts2+date+converter
  • struts2 处理日期类型似乎有问题。那么有没有其他方法可以让我以正确的格式获取日期并将其存储在 java 中的日期对象中

标签: java jsp struts2


【解决方案1】:

我知道这篇文章有点旧,但解决方案可能对其他人有用。

Struts 的默认转换器似乎无法正常工作。字段错误甚至发生在从操作填充的只读字段中。

我通过定义自己的转换器解决了这个问题:

  1. 创建转换器类(使用您需要的日期格式):

    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;
            }
        }
    }
    
  2. 将转换注解放在属性设置器上(或使用conversion.properties 文件)

    @Conversion()
    public class MyEditAction {
        // ...
    
        @TypeConversion(converter="my.app.common.converter.StringToDateTimeConverter")
        public void setUploadedDate(Date uploadedDate) {
            this.uploadedDate = uploadedDate;
        }
    

在我的情况下,我不需要编辑它,但想在 jsp 中指定格式。 我使用了一个额外的隐藏字段来保留原始值(另一种选择是使用 Preparable 接口):

<s:textfield name="uploadedDateDisplay" value="%{getText('format.datetimesecond',{uploadedDate})}" size="70" disabled="true"/>
<s:hidden name="uploadedDate" />

【讨论】:

  • 第 n 次我觉得有必要添加此评论:不要像那样使用 SimpleDateFormat。两个线程同时使用会产生垃圾。
  • @Samuel 是的。最快的解决方法是将它放在 ThreadLocal 中。最好的解决办法是使用另一个日期/时间框架。
【解决方案2】:

这就是我解决这个问题的方法。

    <s:date name="nameOfInputVal" var="formattedVal"/>
    <s:textfield name="nameOfInputVal" value="%{#formattedVal}" key="labelkey" />

并且在您的消息属性中有一个键/值:

struts.date.format=dd/MM/yyyy

这表示默认格式,你不必在每个日期标签中都写。

希望对你有帮助

【讨论】:

  • 或更简单:。但这并不能解决将日期解析为您的操作中填写的日期的问题!
  • 我同意Pierre的观点,当你发送表单时,输入的是String,然后Struts 2将String转换为Date,但问题是:Struts 2在哪里配置这个转换的默认格式?
  • @DavidGarcíaGonzález 这是必须使用转换器完成的转换。 struts.apache.org/2.x/docs/type-conversion.html
  • 更直接:&lt;s:date name="myDateField" var="dd" format="MM/dd/yyyy hh:mm a" /&gt; 然后&lt;s:textfield name="myDateField" value="%{dd}"&gt;
【解决方案3】:

所以也许我不明白这个问题。但我希望这个例子有帮助(顺便说一句,这段代码不会起作用,它只是为了帮助你了解它 sturts2 是如何发挥它的魔力的);因此,对于表单输入,您需要在 java 中有一个持有者类,这样您就可以从您的操作类中调用您的日期,例如 Holder.java:

public class Holder{
  pirvate Date date; 
  public getDate(){
     return date; 
  }
  public setDate(Date date){
    this.date = date; 
  }
}

您的 Holder.java 验证,因此您可以确保它是一个日期 Holder-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>

您调用确保 holder.getdate 以获取日期 getDateAction.java 的操作类:

private Holder holder;
    public class getDateAction{
    public String execute(){
     //get your date
      Date date = holder.getDate(); 

       return SUCCESS; 
     }
    }

您的 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 对象。

【讨论】:

  • s:date标签是用来输出各种格式的java.lang.Date值,不是用来输入表单的。
【解决方案4】:

&lt;s:date /&gt; 标签只显示日期 - 它不提供输入。

我不相信 Struts 提供开箱即用的日期输入,除非您使用日期时间选择器,它是一个 dojo / javascript 标记。更多信息在这里:http://struts.apache.org/2.0.14/docs/datetimepicker.html

如果您不走这条路,您很可能需要将 JSP 上的日期映射到字符串,然后在您的操作类中对其进行格式化。您可以通过让 Struts 先验证值来简化此操作。

【讨论】:

    【解决方案5】:

    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 (我不推荐 struts datepicker): http://jqueryui.com/datepicker/

    $("#date").datepicker({dateFormat: dateFormat});
    

    【讨论】:

      【解决方案6】:
      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效率低。
      【解决方案7】:

      我尝试了一种解决方案,并且成功了 :)
      1)仅将要在数据库表中存储日期的列保留为“DATE”数据类型。 2) 在 JSP 页面中仅使用 Textfield 标记。不要使用 Date 标记。
      注意:确保仅通过在 textfield 标记中放置占位符来使用户输入 YYYY-MM-DD 格式的日期!
      3) 只保留用于访问字符串类型字段的变量。不要使用 DATE 数据类型。
      4)现在运行查询:Select DATE_FORMAT(datecolumnname,'%d/%m%/Y') as date_two from tablename;,您将从该列中以 dd/mm/yyyy 格式获取日期,即使它以 YYYY-MM-DD 格式存储在表中。
      5)您还可以将 datecolumn 的数据与 curdate() 和相关函数进行比较,它也可以工作:)。
      6)就像我使用查询:Select id,name,DATE_FORMAT(datecolumnname,'%d/%m/%Y') as datecolumn2 from tablename where datecolumnname >= curdate();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 1970-01-01
        • 2013-10-24
        相关资源
        最近更新 更多