Область применения jsp: useBean - PullRequest
0 голосов
/ 06 декабря 2009

home.jsp

<jsp:useBean id="username" class="java.lang.String" scope="application"/>

<%
      username="Jitendra";
%>

<jsp:include page="include.jsp"/>

include.jsp

<%=username%>

Это выдает ошибку о том, что «имя пользователя» не определено в include.jsp, даже если область действия Бина - приложение…

Ответы [ 3 ]

14 голосов
/ 06 декабря 2009

Что касается вашей проблемы, все, что вы объявляете локально, используя старомодные скриптлеты, это , а не , связанное с jsp:useBean. Кроме того, объявление локальной переменной скриптлета не видимым на включенных страницах, вам необходимо явно поместить их как минимум в область запроса. Использование скриплетов - это плохая практика . Рекомендую вообще об этом забыть.

В вашем конкретном случае просто создайте Java-бин real для хранения данных. То есть, класс с (неявным) конструктором по умолчанию и закрытыми свойствами, которые предоставляются публичными получателями / установщиками. Вот основной пример:

public class User {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Затем вы можете использовать класс сервлета для предварительной обработки запросов. Для этого вы можете использовать метод doGet() сервлета.

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    User user = new User();
    user.setName("Jitendra");
    request.setAttribute("user", user); // Store in request scope.
    request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request, response);
}

Отобразите этот сервлет в web.xml на url-pattern, например, /show. Этот сервлет должен быть доступен по http://example.com/context/show, и его doGet() будет немедленно выполнен.

Затем измените / создайте файл JSP show.jsp, который вы поместите в /WEB-INF, чтобы предотвратить прямой доступ (чтобы клиенты не могли получить к нему доступ http://example.com/context/show.jsp, но "вынуждены" вызывать сервлет) со следующей строкой :

<p>User name: ${user.name}</p>

${user} относится к объекту, связанному с любым ключом атрибута запроса / сеанса / приложения user. Это негласно jspContext.findAttribute("user"). Поскольку возвращенный экземпляр User соответствует спецификации javabean, ${user.name} вызовет метод getName() для экземпляра User, и EL отобразит его результат.

О, я должен добавить, вы не нуждаетесь в jsp:useBean для этого, поскольку сервлет уже создал и поместил нужный бин в область действия.

Тем не менее, я рекомендую начать с приличного учебника / книги по JSP / сервлету. Примеры:

Надеюсь, это поможет.

1 голос
/ 06 декабря 2009

На Tomcat 6 home.jsp переводится в код сервлета:

java.lang.String username = null;
synchronized (application) {
  username = (java.lang.String) _jspx_page_context.getAttribute("username", 
                                                  PageContext.APPLICATION_SCOPE);
  if (username == null){
    username = new java.lang.String();
    _jspx_page_context.setAttribute("username", username,
                                                  PageContext.APPLICATION_SCOPE);
  }
}

username="Jitendra"; 

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, 
                                                 "include.jsp", out, false);

Хотя поведение такое же, сгенерированный точный код зависит от реализации сервера приложений.

Область действия локальной переменной username не распространяется на сервлет, который будет сгенерирован из include.jsp. Вы не устанавливаете значение «Jitendra» в области приложения, а только устанавливаете значение локальной переменной.

Как уже отмечали другие, неизменяемая строка не может быть очень хорошим бобом.

1 голос
/ 06 декабря 2009

Ваш код "злой", потому что java.lang.String на самом деле не боб. Важно отметить, что у него нет метода «set» для изменения текста (это сделано намеренно, оно должно быть неизменным).

Способ доступа к bean-компонентам состоит в том, чтобы объявить один из них, а затем использовать его свойства (то есть имена за методами get () и set ()), чтобы изменить его. Вы не можете напрямую изменить фактический экземпляр компонента, только его значения.

...