Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从jsp向Struts2操作输入日期?_Java_Jsp_Struts2 - Fatal编程技术网

Java 如何从jsp向Struts2操作输入日期?

Java 如何从jsp向Struts2操作输入日期?,java,jsp,struts2,Java,Jsp,Struts2,在我的jsp页面中,我面临很多问题。我应该使用什么标记从用户处获取日期(yyyy-MM-dd)并将其存储在Struts2操作的日期属性中 我的操作中的属性声明为java.util.Date。我希望来自jsp页面的输入能够进入这个属性 请帮忙 如果使用s:textfield标记以正确的格式输入日期,则会出现无效字段错误(在JSP中)。因此,可能我不理解这个问题。但我希望这个例子能有所帮助(顺便说一句,这段代码不会仅仅是为了帮助您了解sturts2是如何发挥其魔力的);因此,对于表单输入,您需要在j

在我的jsp页面中,我面临很多问题。我应该使用什么标记从用户处获取日期(yyyy-MM-dd)并将其存储在Struts2操作的日期属性中

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

请帮忙


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

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

public class Holder{
  pirvate Date date; 
  public getDate(){
     return date; 
  }
  public setDate(Date date){
    this.date = date; 
  }
}
您的Holder.java验证,因此您可以确保它是date 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>
您可以使用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>

但是我相信您在jsp中寻找的标记是

<s:date name="Date_Name" format="yyyy-MM-dd" />

其中Date\u Name是Java中的日期对象。

标签只显示日期,不提供输入

我不相信Struts提供现成的日期输入,除非您使用日期时间选择器,它是一个dojo/javascript标记。有关这方面的更多信息,请参见:


如果您不遵循这条路线,那么很可能需要将JSP上的日期映射为字符串,然后在action类中格式化它。您可以通过让Struts先验证值来简化这一过程。

我就是这样解决的

    <s:date name="nameOfInputVal" var="formattedVal"/>
    <s:textfield name="nameOfInputVal" value="%{#formattedVal}" key="labelkey" />
它指示默认格式,您不必在每个日期标记中写入它


希望这有帮助

我知道这篇文章有点老了,但一个解决方案可能对其他人有用

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

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

  • 创建转换器类(使用所需的日期格式):

  • 将转换注释放在属性设置器上(或使用conversion.properties文件)

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

    
    
    jsp:

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

    import java.util.Date;
    private Date date;
    public void setDate(Date date) {
        this.date = date;
    }
    
    脚本: 您可以添加jquery.datepicker(我不推荐struts datepicker):

    私人日期;
    公共无效设置日期(字符串日期){
    //setter方法参数类型为String
    试一试{
    this.date=新的SimpleDataFormat(“yyyy-MM-dd”).parse(日期);
    }捕获(解析异常){
    e、 printStackTrace();
    }
    }
    提交
    
    我尝试了一个解决方案,它成功了:)
    1) 将要在数据库表中存储日期的列仅保留为“日期”数据类型。 2) 在JSP页面中仅使用Textfield标记。不要使用日期标记。
    注意:确保仅通过在textfield标记中放置占位符,才能使用YYYY-MM-DD格式设置用户输入日期
    3) 保留用于访问字符串类型字段的变量。不要使用日期数据类型。
    4) 现在运行查询:选择日期格式(datecolumnname,'%d/%m%/Y')作为tablename中的日期并且您将以dd/mm/yyyy格式从该列获取日期,即使它以yyyy-mm-dd格式存储在表中。
    5) 您还可以将datecolumn的数据与curdate()及相关函数进行比较,结果如下:)。

    6) 就像我使用的查询:选择id、name、DATE_格式(datecolumnname、%d/%m/%Y')作为tablename中的datecolumn2,其中datecolumnname>=curdate()

    我不使用Struts,所以我不能给出一个直接的答案,但是任何合适的MVC框架都应该为任何非字符串值提供类型转换。查看此链接以获得一些提示:struts2处理日期类型似乎有问题。那么,是否有其他方法可以以适当的格式获取日期并将其存储在JavaS中的date对象中:date标记用于以各种格式输出java.lang.date值,而不是用于表单输入。或者更简单:。但这并不能解决将日期解析为在操作中指定的日期的问题!我同意Pierre的观点,当您发送表单时,输入是字符串,然后Struts 2将字符串转换为日期,但问题是:Struts 2在哪里配置此转换的默认格式?@DavidGarcíaGonzález必须使用转换器进行转换。更直截了当:
    然后
    这是我第n次觉得有必要添加这样的评论:不要像那样使用SimpleDataFormat。当两个线程同时使用它时,它将产生垃圾。@Samuel是的。最快的修复方法是将其放在ThreadLocal中。最好的解决方法是使用另一个日期/时间框架。每次访问getter时创建
    SimpleDateFormat
    效率低下。
    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;
            }
        }
    }
    
    @Conversion()
    public class MyEditAction {
        // ...
    
        @TypeConversion(converter="my.app.common.converter.StringToDateTimeConverter")
        public void setUploadedDate(Date uploadedDate) {
            this.uploadedDate = uploadedDate;
        }
    
    <s:textfield name="uploadedDateDisplay" value="%{getText('format.datetimesecond',{uploadedDate})}" size="70" disabled="true"/>
    <s:hidden name="uploadedDate" />
    
    <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}
    
    import java.util.Date;
    private Date date;
    public void setDate(Date date) {
        this.date = date;
    }
    
    $("#date").datepicker({dateFormat: dateFormat});
    
    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>