如何从jsp向Struts2动作输入Date?

Ana*_*and 8 java jsp struts2

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

我的操作中的属性声明为java.util.Date.我希望jsp页面的输入落在这个属性中.

请帮忙.

我得到无效字段错误(在JSP中),如果用作:textfield标签,以正确的格式输入日期.

Sam*_*uel 10

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

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

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

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

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


PJT*_*PJT 1

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

public class Holder{
  pirvate Date date; 
  public getDate(){
     return date; 
  }
  public setDate(Date date){
    this.date = date; 
  }
}
Run Code Online (Sandbox Code Playgroud)

您的 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>
Run Code Online (Sandbox Code Playgroud)

您的操作类,您可以在其中调用确保holder.getdate来获取日期getDateAction.java:

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

       return SUCCESS; 
     }
    }
Run Code Online (Sandbox Code Playgroud)

您的 jsp 表单让客户端能够输入日期。确保输入 name="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>
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的一点是你的 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>
Run Code Online (Sandbox Code Playgroud)

这里有关于 Struts2 日期格式的解释:Struts 2 Date Format Examples

但我相信你在jsp中寻找的标签是

<s:date name="Date_Name" format="yyyy-MM-dd" />
Run Code Online (Sandbox Code Playgroud)

其中 Date_Name 是 Java 中的 Date 对象。