2010-03-26 17 views
3

J'utilise la bibliothèque de balises de formulaire Spring dans une application Spring MVC que je développe. La société pour laquelle je travaille a mis en place des stratégies à l'échelle de l'entreprise basées sur la définition d'attributs personnalisés pour certaines balises. Par exemple, par défaut (bien que l'inclusion d'un fichier javascript standard) tous les tags ont leurs valeurs automatiquement converties en majuscules. Pour désactiver celui-ci définirait leur balise avec un attribut personnalisé de la manière suivante:Extension des attributs de bibliothèque de balises de forme de ressort

<input type="text" uppercase="false" /> 

Le problème est que l'ajout de ces attributs personnalisés à un ressort: balise form provoque une erreur lors de l'exécution. J'ai collé l'erreur ci-dessous.

org.apache.jasper.JasperException: /WEB-INF/jsp/reportCriteria.jsp(45,5) Attribute uppercase invalid for tag input according to TLD 

Ma question est: est-il possible d'étendre le TLD pour permettre ces attributs, ou est-il une autre façon d'ajouter ces attributs personnalisés à ces printemps: balises de formulaire?

Répondre

9

Ok, 2 ans plus tard ... c'est parti!

COMMENT créer notre propre TAG PROLONGER UN CLASSIQUE AVEC UN NOUVEAU AU PRINTEMPS ATTRIBUTS MVC 3


1. Créez votre propre taglib.tld

Vous devez créez votre propre fichier TLD. Là, vous allez ajouter le nouvel attribut que vous allez utiliser. La meilleure option est copier/coller spring-form.tld. Vous pouvez le trouver dans le paquet spring-mvc (org.springframework.web.servlet-.jar) .Rechercher dans le dossier META-INF.

N'hésitez pas à le placer directement dans WEB-INF ou dans un sous-dossier. Je l'ai mis en /WEB-INF/tld.

Recherchez maintenant dans votre nouveau fichier TLD le tag que vous allez modifier. Je modifié balise d'entrée, donc je dû rechercher:

... 
    <tag> 
    <description>Renders an HTML 'input' tag with type 'text' using the bound value.</description> 
    <name>input</name> 
    <tag-class>org.domain.tags.CustomTags</tag-class> 
    <body-content>empty</body-content> 
    <attribute> 
    ... 

Copier à partir de et le coller ci-dessous. Changez le nouveau tag pour votre propre nom. Le mien était monInput. Alors maintenant, nous avons ceci:

... 
    <tag> 
    <description>Renders an HTML 'input' tag with type 'text' using the bound value.</description> 
    <name>input</name> 
    <tag-class>org.springframework.web.servlet.tags.form.InputTag</tag-class> 
    <body-content>empty</body-content> 
    <attribute> 
    ... 
    </tag> 

    <tag> 
    <description>Renders an HTML 'input' tag with type 'text' using the bound value.</description> 
    <name>myInput</name> 
    <tag-class>org.domain.tags.CustomTags</tag-class> 
    <body-content>empty</body-content> 
    <attribute> 
    ... 
    </tag> 

RÉSUMÉ: maintenant j'ai un nouveau fichier appelé taglib.tld ici: /WEB-INF/tld/taglib.tld. attention à la <tag-class> partie

Dans votre nouvelle balise ajouter un nouvel attribut appeler (copier/coller un autre) rendre.

<attribute> 
    <description>Enables/Disables the field rendering</description> 
    <name>render</name> 
    <required>false</required> 
    <rtexprvalue>true</rtexprvalue> 
    <type>java.lang.Boolean</type> 
</attribute> 

Maintenant, nous avons créé le fichier taglib dont nous avons besoin. Voyons voir comment l'utiliser.

2.Créez votre propre gestionnaire

Maintenant, nous allons créer la classe qui va gérer le nouvel attribut (et les classiques). J'ai créé la classe CustomTags.java en el paquete org.domain.tags. Voyons d'abord le code et l'expliquer:

package org.domain.tags; 

import javax.servlet.jsp.JspException; 
import org.springframework.web.servlet.tags.form.InputTag; 
import org.springframework.web.servlet.tags.form.TagWriter; 

public class CustomTags extends InputTag { 

private static final long serialVersionUID = 1L; 
private boolean render; 

public boolean isRender() { 
    return render; 
} 

public void setRender(boolean render) { 
    this.render = render; 
} 

protected int writeTagContent(TagWriter tagWriter) throws JspException { 
    if(render){ 
    super.writeTagContent(tagWriter); 
    return SKIP_BODY; 
    } 
    else 
    return SKIP_BODY; 
    } 
} 

Bien sûr, si nous allons ajouter quelques fonctionnalités à la balise d'entrée du framework Spring, nous devons l'étendre afin de mantenir le reste des caractéristiques. Comme vous pouvez le voir, nous venons d'ajouter l'attribut privé render comme booléen (dans taglib.tld nous le mettons aussi).

Nous avons ajouté à la getter et setter méthodes pour cet attribut.

Enfin nous avons remplacer la méthode writeTagContent afin que JSP fasse ce que nous voulons. Dans ce cas, nous voulons que le champ de saisie soit affiché si le rendu est vrai. Sinon, le champ ne peut pas être affiché. C'est pourquoi nous appelons le writeTagContent de la classe parente.

Si nous devons apporter des modifications au comportement du tag, cette méthode est le bon endroit pour le faire.

3. En utilisant la nouvelle étiquette.

Maintenant nous avons seulement besoin d'un JSP avec un formulaire pour utiliser le nouveau tag. Il est facile de le faire, donc je laisse seulement ici le code:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix = "newtags" uri = "/WEB-INF/tld/taglib.tld" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>Spring 3.0 MVC Series: Welcome World</title> 
</head> 
<body> 
    <h1>User Data</h1> 
    Please, fill the fields with your information:<br> 
    <newtags:form name="userForm" id="userForm" modelAttribute="userForm" action="user.htm" method="POST"> 
    Name: <newtags:myInput type="text" name="textName" path="userName" render="true" size="50" /><newtags:errors path="userName" /><br> 
    Surname: <newtags:myInput type="text" name="textSurname" path="userSurname" render="true" size="50" /><newtags:errors path="userSurname" /><br> 
    Age: <newtags:myInput type="text" name="textAge" path="userAge" render="true" size="2" /><newtags:errors path="userAge" /><br> 
    Example: <newtags:myInput type="text" name="textSurname" render="false" size="20" path="userSurname"/> 
    <hr> 
    <input type="submit" value="Next" /> 
    </newtags:form> 
</body> 
</html> 

Maintenant, au lieu d'appeler springframework tld, nous appelons notre propre TLD. Comme vous pouvez le voir le seul champ qui ne va pas être montré est Exemple un.

Bonne chance à tous!

+0

Comment puis-je faire html5 une étiquette de forme de ressort comme afin que je puisse l'utiliser dans la forme comme une étiquette de forme de ressort? – devdar