I have this on welcome.jsp
<c:set var="pgTitle" value="Welcome"/>
<jsp:include page="/jsp/inc/head.jsp" />
And this in head.jsp:
<title>Site Name - ${pgTitle}</title>
But the variable is blank, and the output is merely
Site Name -
I have read many articles, and I cannot figure out what the problem is. If I echo ${pgTitle}
elsewhere within the same welcome.jsp, then it outputs fine.
I am including the core tag library on both pages.
This is because the
pgTitle
variable is set in page scope. Check it here(sorry I can't get an official documentation for this).If you want to make this work, you have to set the variable in request scope at least. To set your variable in request scope, use the
scope
attribute on<c:set>
:Per your comment, in web development, the scope of the variables matter because it defines where the variable can be used (similar to a variable declared as field in a class and a variable declared locally in a method). There are four scopes in JSP known as context:
More info:
If there's a Servlet or another controller that handles the attributes to be set in the request (e.g.
@Controller
from Spring MVC or JSF managed bean), then set the attribute there and not in your page directly.Personally, it takes some time to earn experience and define the best scope of the variables when used on web applications. Basic examples:
String
by comma for presentation purposes will affect only to current view, so this can be set in page scope.One way is to pass variables to an include via query params:
You can then access those params with
${param.foo}
Another would be to use custom tags:
/WEB-INF/tags/head.tag
somePage.jsp
You have to set the variable to be (at least)
request
scoped. You can do id as follows:And then, in the
head.jsp
, you can output the variable like this: