2015-02-14 21 views
5

Nie byłem w stanie dowiedzieć się, jak wyświetlić wartość java.time.LocalDate na stronie JSP. W moim JSP mam to:JSTL formatDate i java.time.LocalDate

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

std.datum jest typu java.time.LocalDate. Podczas renderowania jsp otrzymuję ten wyjątek:

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

Zakładam, że to nawrócenie?

Dzięki, john.

+1

Zgodnie z komunikatem "Can not conv ert 2015-02-14 klasy typu java.time.LocalDate do klasy java.util.Date', znacznik JSTL '' nie obsługuje 'java.time.LocalDate' który jest wprowadzone w języku Java 8. – Tiny

+0

http://www.tech.theplayhub.com/jstl_formatdate_and_java-time-localdate/ –

Odpowiedz

5

Tak. Możesz użyć polecenia fmt: parseDate, aby wykonać konwersję, a następnie sformatować. Przykład poniżej:

<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" /> 

Powodzenia.

1

To jest stare pytanie, ale uważam, że najlepiej jest zrobić niestandardową tld w tym przypadku: bez podwójnej konwersji do i od String.

Wykonaj własny plik tld, a następnie zastąp klasę FormatDate. Na koniec zadeklaruj własny niestandardowy prefiks i użyj niestandardowego: formatDate zamiast fmt: formatDate.

tutaj jest uproszczoną wersją

wykorzystanie w JSP:

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

WEB-INF/custom.tld plik

<?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> 

Następnie plik tag klasy java

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

}