Spring MVC: comment faire pour afficher formaté les valeurs de date en JSP EL
Voici une simple valeur de haricots annoté avec le Printemps du nouveau (3.0) commodité @DateTimeFormat
annotation (qui, comme je comprends remplace le pré-3.0 besoin pour personnalisé PropertyEditor
s comme par cette SORTE de question):
import java.time.LocalDate;
import org.springframework.format.annotation.DateTimeFormat;
public class Widget {
private String name;
@DateTimeFormat(pattern = "MM/dd/yyyy")
private LocalDate created;
//getters/setters excluded
}
Quand biding les valeurs à partir d'un formulaire de soumission pour ce widget, le format de la date fonctionne parfaitement. C'est, uniquement date de chaînes dans le MM/dd/yyyy
format convertir avec succès à de véritables LocalDate
objets. Super, nous sommes à mi-chemin.
Cependant, je voudrais aussi être en mesure d'afficher également la créé LocalDate
propriété dans une JSP d'affichage dans le même MM/dd/yyyy
format à l'aide de JSP EL comme (en supposant que mon printemps contrôleur ajouté un widget d'attribut dans le modèle):
${widget.created}
Malheureusement, cela ne fera qu'afficher la valeur par défaut toString
format de LocalDate
(en yyyy-MM-dd
format). Je comprends que si j'utilise du printemps balises de formulaire la date s'affiche comme vous le souhaitez:
<form:form commandName="widget">
Widget created: <form:input path="created"/>
</form:form>
Mais je voudrais simplement afficher la date formatée chaîne sans utiliser le printemps balises de formulaire. Ou même JSTL est fmt:formatDate
tag.
Venant de Struts2, le HttpServletRequest
était enveloppé dans une StrutsRequestWrapper
qui a permis à EL expressions de ce type à fait d'interroger la OGNL valeur de la pile. Alors je me demandais si le printemps fournir quelque chose de similaire à ce pour permettre à des convertisseurs pour les exécuter?
MODIFIER
Je me rends compte que lors de l'utilisation de ce printemps eval
tag de la date d'affichage selon le modèle défini dans le @DateTimeFormat
annotation:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<spring:eval expression="widget.created"/>
Il est intéressant de noter, lors de l'utilisation d'une coutume PropertyEditor
pour le format de la date, cette balise n'invoque PAS que PropertyEditor
's getAsText
méthode et donc par défaut le DateFormat.SHORT
comme décrite dans les docs. En tout cas, je voudrais encore savoir si il existe un moyen pour parvenir à la date de mise en forme sans avoir à utiliser une balise--uniquement à l'aide de JSP standard EL.
OriginalL'auteur Brice Roncace | 2014-12-17
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser la balise de vous fournir ce genre de formatage, comme de l'argent, de données, de temps, et beaucoup d'autres.
Vous pouvez ajouter sur vous JSP de la référence:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
Et utiliser la mise en forme:
<fmt:formatDate pattern="yyyy-MM-dd" value="${now}" />
Trouverez ci-dessous une référence:
http://www.tutorialspoint.com/jsp/jstl_format_formatdate_tag.htm
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
taglib ne fonctionne pas avecjava.time.LocalDate
OriginalL'auteur Eduardo Mioto
Précis Eduardo réponse:
fmt:formatDate
tag. (Et, en tout cas, cette balise ne fonctionne pas lors de l'utilisation deLocalDate
date d'objets.)Pourquoi vous ne voulez pas utiliser la JSTL?
OriginalL'auteur Remy Mellet
J'ai été découragés d'apprendre que le printemps, les développeurs ont décidé de ne pas intégrer la EL (expression language utilisé dans les JSP 2.1+) avec le Printemps EL déclarant:
Mais en s'inspirant de l'JIRA billet cité, j'ai créé un custom ELResolver qui, si la valeur résolue est un
java.time.LocalDate
oujava.time.LocalDateTime
, tenter de tirer le@DateTimeFormat
valeur de modèle pour le format retournéString
valeur.Voici la
ELResolver
(avec laServletContextListener
utilisés pour l'amorçage):Enregistrer le
ELResolver
dans web.xml:Et maintenant, quand j'ai
${widget.created}
dans ma jsp, la valeur affichée sera formaté selon le@DateTimeFormat
annotation!En outre, si le
LocalDate
ouLocalDateTime
objet est nécessaire par la jsp (et pas seulement de la Chaîne mise en forme de la représentation), vous pouvez toujours accéder à l'objet lui-même à l'aide de la méthode directe, l'invocation comme:${widget.getCreated()}
tant pis, trouvé un commentaire dans une ancienne dépôt github qui m'a conduit à la fin.
// This resolver is in the original resolver chain. To prevent // infinite recursion, set a flag to prevent this resolver from // invoking the original resolver chain again when its turn in the // chain comes around.
OriginalL'auteur Brice Roncace
Je préfère aussi de ne pas faire de mise en forme via les tags. Je constate que ce ne peut pas être la solution que vous cherchez et cherchez un moyen de le faire via le printemps des annotations. Néanmoins, Dans le passé, j'ai utilisé les travaux suivants:
Créer un nouveau getter avec la signature suivante:
(Vous pouvez modifier le nom de la lecture, si vous préférez.)
Dans la lecture, le format de la
created
attribut date en tant désiré à l'aide d'un module de formatage telles que les SimpleDateFormat.Alors vous pouvez communiquer les éléments suivants à partir de votre JSP
@DateTimeFormat
et de manière déclarative obtenir ce dont j'ai besoin dans la vue plutôt que d'avoir à faire le travail (impérativement) dans la fève. Nous sommes sur la même page, cependant, parce que le résultat final de${widget.createDateDisplay}
est très agréable (surtout lorsqu'il s'agit de la plus récentejava.time.LocalDate
ce qui n'est pas aussi beau avec JSTL de l'équipe de la bibliothèque de tags).OriginalL'auteur applejack42