Подтвердить что ты не робот

Как передать параметр в jsp: включить через c: set? Каковы области переменных в JSP?

У меня есть это на welcome.jsp

<c:set var="pgTitle" value="Welcome"/>
<jsp:include page="/jsp/inc/head.jsp" />

И это в head.jsp:

<title>Site Name - ${pgTitle}</title>

Но переменная пустая, а выход - просто

Site Name -

Я прочитал много статей, и я не могу понять, в чем проблема. Если я повторю ${pgTitle} в другом месте в пределах того же приветствия .jsp, он выводит штраф.

Я включаю библиотеку основных тегов на обе страницы.

4b9b3361

Ответ 1

Это связано с тем, что переменная pgTitle задана в области страниц. Проверьте здесь (извините, я не могу получить официальную документацию для этого).

Если вы хотите сделать эту работу, вам нужно как минимум установить переменную в области запроса. Чтобы установить переменную в области запроса, используйте атрибут scope на <c:set>:

<c:set var="pgTitle" value="Welcome" scope="request" />

В вашем комментарии, в веб-разработке, объем переменных имеет значение, поскольку он определяет, где можно использовать переменную (похожую на переменную, объявленную как поле в классе и переменную, объявленную локально в методе). В JSP есть четыре области, известные как контекст:

  • Область страницы (обрабатывается PageContext). Переменные могут быть достигнуты только в том случае, если они заданы в качестве атрибутов на текущей странице. Это означает, что только текущая страница может получить доступ к этим атрибутам, включая страницы разных страниц, поэтому они не могут получить доступ к этим атрибутам.
  • Область запроса (обрабатывается ServletRequest). Переменные могут быть достигнуты только в том случае, если они заданы в качестве атрибутов в текущем запросе. Это означает, что каждая страница, обрабатываемая одним и тем же запросом, может обращаться к этим атрибутам. Важное примечание: перенаправление подразумевает новый процесс запроса/ответа. Это означает, что если вы установите атрибуты в запросе и выполните перенаправление, эти атрибуты не будут установлены в качестве атрибутов нового запроса.
  • Область сеанса (обрабатывается HttpSession). Переменные могут быть достигнуты только в том случае, если они установлены в качестве атрибутов текущего сеанса пользователя. Это означает, что каждая страница, используемая в одном сеансе пользователя, может использовать эти атрибуты до тех пор, пока они не будут удалены или сеанс не завершится.
  • Область применения (обрабатывается ServletContext). Переменные могут быть достигнуты только в том случае, если они заданы в качестве атрибутов в текущем контексте. Это означает, что каждая страница каждого атрибута сеанса может обращаться к этим переменным до тех пор, пока они не будут удалены из SessionContext или веб-приложение не будет развернуто.

Дополнительная информация:

Является ли это правильным способом выполнения того, что я пытаюсь сделать?

Если есть сервлет или другой контроллер, который обрабатывает атрибуты, которые должны быть установлены в запросе (например, @Controller из Spring MVC или JSF, управляемый bean), тогда установите атрибут там, а не на своей странице.

Лично для получения опыта и определения наилучшего объема переменных при использовании в веб-приложениях требуется некоторое время. Основные примеры:

  • Разделение String на запятую для целей презентации будет влиять только на текущий вид, поэтому это можно установить в области страниц.
  • Ошибка и успешные сообщения лучше всего подходят для области запроса. Если пользователь обновляет страницу, он, вероятно, не должен видеть те же сообщения, если данные не будут повторно обработаны.
  • Информация о пользователе как имя, псевдоним и предпочтения может быть задана в области сеанса.
  • Если вам нужно отобразить список стран (которые не должны меняться через несколько дней), вы можете сохранить этот список в области приложения.

Ответ 2

Один из способов - передать переменные в include через параметры запроса:

<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>

Затем вы можете получить доступ к этим параметрам с помощью ${param.foo}

Другим может быть использование пользовательских тегов:

/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/>

Ответ 3

Вы должны установить переменную как минимум (не менее) request. Вы можете сделать id следующим образом:

<c:set var="pgTitle" value="Welcome" scope="request"/>
<jsp:include page="/jsp/inc/head.jsp" />

И затем, в head.jsp, вы можете вывести переменную следующим образом:

<c:out value="${requestScope.pgTitle}" />

Ответ 4

Вы можете сделать это, используя комбинацию <c:import> и <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>