Pourquoi un fichier avec l'extension '.jspf' n'est-il pas traité comme un fichier 'jsp' lorsqu'il est inclus avec PageContext.include ()

Lucas

J'ai une application Web qui utilise des pages Spring MVC et jsp. Dans l'un de mes fichiers jsp, j'ai une boucle qui itère sur a Map<String, Object>et rend chaque valeur d'entrée en utilisant escapeXml(toString):

<c:forEach var="attr" items="${attributes}">
  <ns:entry name='${attr.key}' value='${fn:escapeXml(attr.value)}' />
</c:forEach>

Ce n'est évidemment pas une très bonne solution car il vole le toStringpour ses objectifs et couple le balisage au modèle. Je veux éviter cela en vérifiant un dossier spécifique pour voir s'il existe un .jspffichier avec le même nom que la clé d'entrée, et si tel est le cas, utilisez ce fragment pour le rendre avec l' toStringapproche comme solution de secours:

<c:if test="! ${fn:includeJspf(pageContext, '/WEB-INF/attributes/', ${attr.key}>
  <c:forEach var="attr" items="${attributes}">
    <ns:entry name='${attr.key}' value='${fn:escapeXml(attr.value)}' />
  </c:forEach>
</c:if>

Et ma includeJspffonction est définie:

public static boolean includeJspf( PageContext pageContext, String folderPath, String jspfName ) {
    String relativePath = folderPath + "/" + jspfName + ".jspf";
    if ( new File( pageContext.getServletContext().getRealPath( relativePath ) ).exists() ) {
        try {
            pageContext.getRequest().setAttribute( "parentPageContext", pageContext );
            pageContext.include( relativePath );
        }
        catch ( ServletException | IOException e ) {
            logger.warn( "Unable to include fragment [{}]: {}", relativePath, e.getMessage() );
        }
        return true;
    }
    return false;
}

Et mon jspf

<%@ page session="false" contentType="application/xml; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="name"
  value="${requestScope['parentPageContext'].getAttribute('attr').key}" />
<c:set var="value"
  value="${requestScope['parentPageContext'].getAttribute('attr').value}" />

<myobj:${fn:escapeXml(name)} value=${fn:escapeXml(value.value)} />

Cela échoue ainsi:

:30: parser error : StartTag: invalid element name
                    <%@ page session="false" contentType="application/xml; chars
...

Mais ... Si je change l'extension en jsp, tout fonctionne parfaitement. Je suppose qu'il me manque quelque chose de simple comme la configuration dans web.xml, mais je n'ai trouvé aucune documentation pour l'expliquer. Aucun conseil?

ljgw

Dans tomcat (je ne suis pas sûr des autres conteneurs de servlet), vous devez ajouter un .jspfmappage au web.xml:

<servlet-mapping>
    <servlet-name>{jspservlet-name}</servlet-name>
    ...
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jspf</url-pattern>
</servlet-mapping>

(SO source: jsp include ne fonctionne pas pour les fichiers jspf sous tomcat 8 mais fonctionne sous la jetée - jsp: include et une fonction d'inclusion programmatique de la même manière je pense)

Cependant, il y a une discussion sur l'opportunité d'utiliser des fragments pour les inclusions d'exécution / dynamiques: ici sur coderanch et ici sur oracle .

Ceci est une recommandation à ce sujet, mais pas la spécification:

Utilisez l'extension .jsp pour les pages de niveau supérieur, les pages incluses de manière dynamique et les pages qui sont transférées vers - des pages qui sont traduisibles par elles-mêmes.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    comment afficher un bouton au-dessus d'un autre élément ?

  2. 2

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  3. 3

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

  4. 4

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  5. 5

    Conversion double en BigDecimal en Java

  6. 6

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Passer la taille d'un tableau 2D à une fonction ?

  9. 9

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  10. 10

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  11. 11

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  12. 12

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  13. 13

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  14. 14

    Exporter la table de l'arborescence vers CSV avec mise en forme

  15. 15

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  16. 16

    Créer un système Buzzer à l'aide de python

  17. 17

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  18. 18

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  19. 19

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  20. 20

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  21. 21

    Microsoft.WebApplication.targets

chaudétiquette

Archive