J'ai ceci sur welcome.jsp
<c:set var="pgTitle" value="Welcome"/>
<jsp:include page="/jsp/inc/head.jsp" />
Et cela dans head.jsp:
<title>Site Name - ${pgTitle}</title>
Mais la variable est vide et la sortie est simplement
Site Name -
J'ai lu de nombreux articles et je n'arrive pas à comprendre quel est le problème. Si je fais écho ${pgTitle}
ailleurs dans le même welcome.jsp, puis il sort très bien.
J'inclus la bibliothèque de balises de base sur les deux pages.
En effet, la variable pgTitle
est définie dans la portée de la page. Vérifiez-le ici (désolé, je ne peux pas obtenir de documentation officielle pour cela).
Si vous voulez que cela fonctionne, vous devez au moins définir la variable dans la portée de la demande. Pour définir votre variable dans la portée de la demande, utilisez l'attribut scope
sur <c:set>
:
<c:set var="pgTitle" value="Welcome" scope="request" />
Selon votre commentaire, dans le développement Web, la portée des variables est importante car elle définit où la variable peut être utilisée (similaire à une variable déclarée comme champ dans une classe et une variable déclarée localement dans une méthode). Il existe quatre étendues dans JSP appelées contexte:
Plus d'informations:
Est-ce la bonne façon d'accomplir ce que j'essaie de faire?
S'il existe un servlet ou un autre contrôleur qui gère les attributs à définir dans la demande (par exemple @Controller
à partir du bean géré Spring MVC ou JSF), puis définissez l'attribut ici et non directement dans votre page.
Personnellement, il faut un certain temps pour acquérir de l'expérience et définir la meilleure portée des variables lorsqu'elles sont utilisées sur des applications Web. Exemples de base:
String
par une virgule à des fins de présentation n'affectera que la vue actuelle, donc cela peut être défini dans la portée de la page.Une façon consiste à passer des variables à un include via des paramètres de requête:
<jsp:include page="/WEB-INF/views/partial.jsp?foo=${bar}" />
<jsp:include page="/WEB-INF/views/partial.jsp">
<jsp:param name="foo" value="${bar}" />
<jsp:param name="foo2" value="${bar2}" />
</jsp:include>
Vous pouvez ensuite accéder à ces paramètres avec ${param.foo}
Un autre serait d'utiliser des balises personnalisées:
/ WEB-INF/tags/head.tag
<%@ attribute name="title" %>
<head>
<title>${title}</title>
</head>
somePage.jsp
<%@ taglib prefix="layout" tagdir="/WEB-INF/tags" %>
<html>
<layout:head title="myRadTitle" />
<body></body>
<html/>
Vous devez définir la variable pour être (au moins) request
portée. Vous pouvez faire id comme suit:
<c:set var="pgTitle" value="Welcome" scope="request"/>
<jsp:include page="/jsp/inc/head.jsp" />
Et puis, dans le head.jsp
, vous pouvez sortir la variable comme ceci:
<c:out value="${requestScope.pgTitle}" />
Vous pouvez accomplir cela en utilisant une combinaison de <c:import>
et <c:param>
.
somePage.jsp
<c:import url="header.jsp" >
<c:param name="pageTitle" value="Whatever the title of the page is"/>
</c:import>
header.jsp
<html>
<head>
<title>
<c:out value="${param.pageTitle}" default="Default is optional" />
</title>
</head>
</html>