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 toString
pour 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 .jspf
fichier 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' toString
approche 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 includeJspf
fonction 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?
Dans tomcat (je ne suis pas sûr des autres conteneurs de servlet), vous devez ajouter un .jspf
mappage 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.
laisse moi dire quelques mots