JSTL formatDate and java.time.LocalDate

2019-04-08 09:46发布

I haven't been able to figure out how to display a java.time.LocalDate value in a JSP. In my JSP, I have this:

<fmt:formatDate value="${std.datum}" type="date" pattern="dd.MM.yyyy" var="stdDatum" />

std.datum is of type java.time.LocalDate. When rendering the jsp I get this exception:

javax.el.ELException: Cannot convert 2015-02-14 of type class java.time.LocalDate to class java.util.Date

I'm assuming it's the conversion?

Thanks, john.

2条回答
成全新的幸福
2楼-- · 2019-04-08 10:04

This is an old question, but i find it is very best to do a custom tld in this case: without any double conversion to and from String.

Do your own tld file, then override the FormatDate class. Finally, declare your own custom prefix and use custom:formatDate instead of fmt:formatDate.

here is a simplified version

usage in JSP:

<%@ taglib uri="/WEB-INF/custom" prefix="custom" %>
...
<custom:formatDate value="${std.datum}" pattern="dd/MM/yyyy" />

WEB-INF/custom.tld file

<?xml version="1.0" encoding="UTF-8"?>
<tag ib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">

<tag>
    <description>
        FormatDate with java8 type
    </description>
    <name>formatDate</name>
    <tag-class>com.custom.tag.FormatDateTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
        <description>
            Date and/or time to be formatted.
        </description>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>

    <attribute>
        <description>
            Custom formatting style for dates and times.
        </description>
        <name>pattern</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>
</taglib>

Then the java class tag file

public class FormatDateTag extends TagSupport  {

    protected Temporal value;
    protected String pattern; 
    private String var; 
    private int scope; 


    public FormatDateTag()
    {
        super ();
        init ();
    }

    private void init()
    {

        this.pattern = this.var = null;
        this.value = null;
        this.scope = PageContext.PAGE_SCOPE;
    }


    public void setVar(final String var)
    {
        this.var = var;
    }

    public void setScope(final String scope)
    {
        this.scope = Util.getScope (scope);
    }


    public void setValue(final Temporal value)
    {
        this.value = value;
    }


    public void setPattern(final String pattern)
    {
        this.pattern = pattern;
    }


    @Override
    public int doEndTag() throws JspException
    {

        String formatted = null;

        if (this.value == null)
        {
            if (this.var != null)
            {
                this.pageContext.removeAttribute (this.var, this.scope);
            }
            return EVAL_PAGE;
        }

        // Create formatter
        if (this.pattern != null)
        {
            final DateTimeFormatter formatter = DateTimeFormatter.ofPattern (this.pattern);
            formatted = formatter.format (this.value);
        }
        else
        {
            // no formatting locale available, use Date.toString()
            formatted = this.value.toString ();
        }

        if (this.var != null)
        {
            this.pageContext.setAttribute (this.var, formatted, this.scope);
        }
        else
        {
            try
            {
                this.pageContext.getOut ().print (formatted);
            }
            catch (final IOException ioe)
            {
                throw new JspTagException (ioe.toString (), ioe);
            }
        }

        return EVAL_PAGE;
    }


    @Override
    public void release()
    {
        init ();
    }

}
查看更多
该账号已被封号
3楼-- · 2019-04-08 10:30

Yes. You could use fmt:parseDate to do the conversion and then do the formatting. Example below

<fmt:parseDate value="${std.datum}" pattern="yyyy-MM-dd" 
                          var="parsedDate" type="date" />

<fmt:formatDate value="${parsedDate}" var="stdDatum" 
                           type="date" pattern="dd.MM.yyyy" />

Good luck.

查看更多
登录 后发表回答