Где JSP инициализируется? - PullRequest
       10

Где JSP инициализируется?

2 голосов
/ 11 сентября 2009

У меня есть проект, который работает отлично. пример книжного магазина Я не понял, где он инициализирует переменную JSP? Там нет бобов. Все, что у нас есть, это класс Java. JSP вызывает переменную класса Java, но как? Я искал все файлы конфигурации, но ничего не нашел.

public class Bookstore {    
    private final Map<String, Item> items = new TreeMap<String, Item>();

    private String name;

    public Bookstore() {
        setName("Otel Sheriton");
    }

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

вот мой файл jsp:

.....
<body>

    <h1>${it.name}</h1>
 ......

</body>   

$ {it.name} означает: получить переменную 'name' из одного из объектов BookStore
Итак, как и где я могу идентифицировать $ {it}

Ответы [ 3 ]

1 голос
/ 11 сентября 2009

$ {it.name} означает получить свойство name от объекта, который можно найти как именованный атрибут it .

Это можно найти, например, в вашем запросе или в вашем сеансе. Это в основном переводится как

((Bookstore) pageContext.findAttribute("it")).getName()

При этом выполняется поиск именованного атрибута в странице, запросе, сеансе (если он действителен) и области (ях) приложения по порядку и возвращается значение, связанное со значением NULL.

Таким образом, вы должны поместить объект в желаемую область видимости, прежде чем перейти к JSP, что-то вроде

request.setAttribute("it", bookStoreObj)

Я предполагаю, что вы используете MVC, поэтому задача контроллера - установить это в области видимости перед выбором JSP.

1 голос
/ 11 сентября 2009

Если вы поместите код в скриптлет (старые теги <%%>), они будут преобразованы компилятором JSP в метод _jspService (). Этот метод вызывается всякий раз, когда к странице JSP обращаются, либо непосредственно клиентом, либо внутри контейнера с использованием пересылки на стороне сервера или включением.

Метод _jspService () не может быть переопределен. Компилятор JSP создает тело метода службы в том же порядке, в котором код отображается на странице JSP. Поэтому переменные создаются как локальные переменные и инициализируются каждый раз, когда вызывается метод службы.

В тех случаях, когда вы используете более старый <%! %> теги или более новые теги jsp: объявление для определения методов, переменные создаются и инициализируются при выполнении объявленного метода.

Кстати, все неявные переменные будут инициализированы контейнером.

Дополнительные сведения об этом поведении можно найти в спецификации JSP и в JspPage javadoc .

Если вы хотите знать, как JspPage и класс HttpJspPage инициализируются и используются контейнером, вам нужно будет просмотреть исходный код контейнера. Однако спецификация JSP (глава 11, касающаяся контракта контейнера JSP) определяет, как контейнер JSP инициализирует и создает страницу JSP. Обычно инициализация самого класса страницы выполняется один раз; в этот момент вызывается jspInit (). Когда страница уничтожается, обычно при закрытии приложения или контейнера, метод jspDestroy () вызывается до того, как страница будет уничтожена.

Обновление

Выражения EL в конечном итоге находят bean-компонент, пытаясь разрешить переменную в области страницы, запроса, сеанса и приложения . Используемая переменная должна быть объявлена ​​и инициализирована в соответствующей области видимости. Компоненты JavaBean можно инициализировать с помощью тега jsp: useBean . Другие объекты должны были быть объявлены и инициализированы в сервлете или в скриптлете.

0 голосов
/ 11 сентября 2009

JSP, как вы знаете, собирается в сервлет. Ваши переменные, определенные в JSP, будут входить в класс скомпилированного сервлета. Вы должны проверить документацию сервера, который вы используете, и увидеть класс скомпилированного сервлета. Если это файл .class, вы можете декомпилировать и проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...