Вопрос

Home.jsp

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

<%
      username="Jitendra";
%>

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

Включите.jsp

<%=username%>

Это дает ошибку, говоря, что «Имя пользователя» не определен, include.jsp, хотя объем бобов является применением…

Это было полезно?

Решение

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

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

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/сервлета. Примеры:

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

Другие советы

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

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

На 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» в область приложения, только устанавливая значение локальной переменной.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top