Question

Récemment, je l'ai décidé d'obtenir des connaissances sur l'écriture des balises personnalisées. Et il y a un problème.

Dans mon application web que j'utilise des balises JSTL et dans chaque page JSP j'ai un morceau identique de code:

<c:if test="${sessionScope.locale == 'locale_ru_RU' or empty sessionScope.locale}" >
    <fmt:setBundle basename="locale_ru_RU" />
</c:if>
<c:if test="${sessionScope.locale == 'locale_en_US'}">
    <fmt:setBundle basename="locale_en_US" />
</c:if>

Comme vous pouvez le voir ensembles de construction bundle de ressources correct.

Je voudrais savoir s'il est possible de conclure ce morceau de code et d'utiliser au lieu de une seule étiquette (je sais qu'il ya une autre façon - il suffit de mettre ce code dans la page JSP individuelle et l'utilisation <% @% inclus> directive, mais je voudrais essayer une balise)?

Si je comprends bien je SOMEWAY le contenu du corps ensemble (à l'intérieur de la classe d'étiquette, pas de JSP) et le récipient de faire pour l'exécuter, mais je ne peux pas trouver des exemples à ce sujet.

Ce que j'ai maintenant:

tld:

<?xml version="1.0" encoding="UTF-8"?>
<taglib   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
 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
 version="2.0">
<tlib-version>1.0</tlib-version>
<tag>
    <name>setLocale</name>
    <tag-class>com.test.tags.LocaleBundleTag</tag-class>
    <body-content>empty</body-content>
</tag>
</taglib>

et mon tag:

public class LocaleBundleTag extends BodyTagSupport {

@Override
public void setBodyContent(BodyContent b) {

    try {
        b.clear();
        b.append("<c:if test=\"${sessionScope.locale == 'locale_ru_RU' or empty sessionScope.locale}\" >");
        b.append("<fmt:setBundle basename=\"locale_ru_RU\" />");
        b.append("</c:if>");
        b.append("<c:if test=\"${sessionScope.locale == 'locale_en_US'}\">");
        b.append("<fmt:setBundle basename=\"locale_en_US\" />");
        b.append("</c:if>");
    } catch (IOException e) {
    }

    super.setBodyContent(b);
}
}

Il compile, mais ne rien correctement.

Était-ce utile?

La solution

Non, ce ne fonctionnera pas, car il n'y a pas d'attente que le contenu du corps sera ensuite traité également par le compilateur JSP. Plutôt que vous devrez mettre en œuvre la FMT. SetBundle-vous au sein de votre balise

Un fichier JSP Tag serait plus facile. Opérationnellement ce n'est pas loin du vous comprennent mentionné, mais il fait refactorisations comme ce vraiment trivial.

J'ai un exemple étendu ici: astuces JSP pour rendre plus facile Templating

Autres conseils

Vous ne pouvez pas utiliser d'autres balises JSP dans une balise personnalisée (. Celui créé dans une classe Java) comme ça. Cependant, vous pouvez créer un « fichier tag » qui vous permet de définir une balise personnalisée à peu près comme vous définiriez une page JSP. Voici un lien pour vous lancer: http: //java.sun .com / j2ee / 1.4 / docs / tutorial / doc / JSPTags5.html .

Cependant, ce que vous essayez de faire quelque chose qui ressemble à autre chose devrait être en mesure de le faire pour vous. Utilisez-vous du printemps dans votre application? Si alors pensez à regarder Spring MessageSource et LocaleResolver.

La meilleure façon d'aborder ce serait d'utiliser un filtre servlet . Un filtre peut intercepter toutes les requêtes et attributs définis dans la portée de la demande. L'équivalent java de la balise fmt:bundle est quelque chose comme:

Config.set(request, Config.FMT_LOCALE, "ru_RU")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top