web-dev-qa-db-fra.com

Comment passer le paramètre à jsp: include via c: set? Quelles sont les portées des variables dans JSP?

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.

26
vcardillo

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:

  • Portée de la page (gérée par PageContext ). Les variables ne peuvent être atteintes que si elles sont définies comme attributs dans la page en cours. Cela signifie que seule la page actuelle peut accéder à ces attributs, les pages incluses sont des pages différentes et ne peuvent donc pas accéder à ces attributs.
  • Portée de la demande (gérée par ServletRequest ). Les variables ne peuvent être atteintes que si elles sont définies comme attributs dans la demande en cours. Cela signifie que chaque page traitée dans la même demande peut accéder à ces attributs. Remarque importante : Une redirection implique un nouveau processus de demande/réponse. Cela signifie que si vous définissez des attributs sur la demande et exécutez une redirection, ces attributs ne seront pas définis en tant qu'attributs sur la nouvelle demande.
  • Portée de la session (gérée par HttpSession ). Les variables ne peuvent être atteintes que si elles sont définies comme attributs dans la session utilisateur en cours. Cela signifie que chaque page utilisée dans la même session utilisateur peut utiliser ces attributs jusqu'à ce qu'ils soient supprimés ou que la session expire.
  • Portée de l'application (gérée par ServletContext ). Les variables ne peuvent être atteintes que si elles sont définies comme attributs dans le contexte actuel. Cela signifie que chaque page de chaque attribut de session peut accéder à ces variables jusqu'à ce qu'elles soient supprimées de SessionContext ou que l'application Web ne soit pas déployée.

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:

  • La division d'un 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.
  • Les messages d'erreur et de réussite conviennent mieux à la portée de la demande. Si l'utilisateur met à jour la page, il/elle ne doit probablement pas voir les mêmes messages à moins que les données ne soient retraitées.
  • Les informations utilisateur telles que le nom, le surnom et les préférences peuvent être définies dans la portée de la session.
  • Si vous devez afficher une liste de pays (qui ne devrait pas changer dans quelques jours), vous pouvez stocker cette liste dans la portée de l'application.
35
Luiggi Mendoza

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/>
4
Allan Hortle

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}" />
2

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>
0
German B.