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

时间:2010-03-07 18:57:38

标签: java jsp struts2

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

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

请帮忙。

如果使用s:textfield标记以正确的格式输入日期,我会收到无效字段错误(在JSP中)。

7 个答案:

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

    @Conversion()
    public class MyEditAction {
        // ...
    
        @TypeConversion(converter="my.app.common.converter.StringToDateTimeConverter")
        public void setUploadedDate(Date uploadedDate) {
            this.uploadedDate = uploadedDate;
        }
    
  3. 在我的情况下,我不需要编辑它,但想在jsp中指定格式。 我使用了一个额外的隐藏字段来保持原始值(另一个替代方案是使用Preparable接口):

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

答案 1 :(得分:4)

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

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

在您的邮件属性中有一个键/值:

struts.date.format=dd/MM/yyyy

表示默认格式,您不必在每个日期标记中写入。

希望这有帮助

答案 2 :(得分:1)

所以也许我不明白这个问题。但我希望这个例子有所帮助(顺便说一句,这段代码不会起作用,只是为了让你了解sturts2如何发挥其魔力);所以对于表单输入,你需要在java中有一个holder类,所以你可以从你的动作类中调用你的日期,比如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表单,您可以让客户端输入日期。确保输入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>

最后但并非最不重要的是你的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对象。

答案 3 :(得分:0)

<s:date />标记仅显示日期 - 它不提供输入。

我不相信Struts提供开箱即用的日期输入,除非您使用日期时间选择器,这是一个dojo / javascript标记。有关详细信息,请访问:http://struts.apache.org/2.0.14/docs/datetimepicker.html

如果你不沿着那条路走下去,你很可能需要将JSP上的日期映射到一个字符串,然后在你的动作类中对它进行格式化。您可以通过让Struts首先验证值来简化这一过程。

答案 4 :(得分:0)

<强> JSP:

<s:textfield name="date" id="date" key="invitation.date" required="true" value="%{getText('format.date',{date})}" size="8"/>

<强>?属性

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});

答案 5 :(得分:0)

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>

答案 6 :(得分:0)

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