Jsp приложение. Стандартные элементы action. Какие методы жизненного цикла JSP могут быть переопределены
Продолжаю описывать процесс создания веб-приложения используя сервлеты, jsp, мавен и томкат. , если необходимо.
Создаем сущности. Создадим в пакете entities класс User, в котором создадим две приватные строковые переменные name и password. Создадим конструкторы (по умолчанию и такой, который бы принимал оба значения), геттеры/сеттеры, переопределим метод toString() на всякий случай, а так же методы equals() и hashCode(). public class User { private String name; private String password; public User() { } public User(String name, String password) { this.name = name; this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "name="" + name + "\"" + ", password="" + password + "\"" + "}"; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; if (name != null ? !name.equals(user.name) : user.name != null) return false; return password != null ? password.equals(user.password) : user.password == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (password != null ? password.hashCode() : 0); return result; } } Теперь можем приступить к созданию списка пользователей, куда мы будем наших пользователей добавлять, и откуда будем их забирать для отображения. Но есть проблема. Объекты наших сервлетов мы не создаем, их создает за нас томкат. Методы, которые мы переопределяем в них - тоже за нас уже определены и добавить параметр мы не можем. Как же тогда создать общий список, который бы виден был в обоих наших сервлетах? Если мы просто в каждом сервлете создадим свой объект списка - то получится, что добавлять пользователей мы будем в один список, а выводить список пользователей сервлетом ListServlet - совершенно другой. Получается, что нам нужен такой объект, который был бы общим для обоих сервлетов. Если говорить обобщенно, то нам нужен такой объект, который был бы общим для всех классов в нашей программе; единственный объект на всю программу. Надеюсь, вы что-то да слышали про шаблоны проектирования. И возможно для кого-то это первая реальная необходимость использования шаблона в своей программе. Можете поизвращаться и запилить какой-нибудь крутой синглтон, с двойными проверками и синхронизациями (да-да, у нас многопоточное приложение, так как сервлеты томкат запускает в разных потоках), но я буду использовать вариант с ранней инициализацией, так как в данном случае он вполне подходит. Создание модели. Создадим тогда класс (и реализуем в нем шаблон singleton) в пакете model, ну и назовем тоже вполне красочно Model. Создадим в нем приватный объект списка пользователей, и сделаем два метода: один для того, чтоб можно было добавить пользователя, а второй - пусть просто возвращает список строк (имен пользователей). Поскольку наш объект пользователя состоит из имени и пароля - то пароли пользователей мы "светить" не хотели бы, поэтому и возвращать будем только список их имен. public class Model { private static Model instance = new Model(); private List model; public static Model getInstance() { return instance; } private Model() { model = new ArrayList(); } public void add(User user) { model.add(user); } public List list() { return model.stream() .map(User::getName) .collect(Collectors.toList()); } } Немного про mvc. Раз уж вы слышали про singleton, значит возможно слышали и про другой шаблон проектирования - MVC (model-view-controller, или по-русски модель-представление-контроллер, или прям так как и на английском модель-вью-контроллер). Его суть в том, чтобы отделять бизнес-логику от представления. То-есть, отделять код, который определяет что делать от кода, который определяет как отображать . View (представление или просто вьюхи) как-раз и отвечает за то, в каком виде представлять какие-то данные. В нашем случае вьюхи - это наши jsp странички. Именно поэтому я их и положил в папочку с названием views. Модель - это собственно сами данные, с которыми работает программа. В нашем случае это пользователи (список пользователей). Ну а контроллеры - связующее звено между ними. Берут данные из модели и передают их во вьюхи, ну или получают от томката какие-то данные, обрабатывают их и передают модели. Бизнес-логика (то-есть что делать ) должна быть описана в них, а не в модели или во вьюхе. Таким образом, каждый занимается своим делом:- модель хранит данные
- вьюхи рисуют красивое представление данных
- контроллеры занимаются обработкой данных
И напоследок. Если будет желание попрактиковаться с этим проектом - можете попробовать:
- сделать сервлет и jsp для удаления пользователя и еще пару для изменения/редактирования существующего пользователя. Получится настоящее CrUD веб приложение:) на сервлетах))
- заменить список (List) на работу с базой данных, чтоб добавленные пользователи не пропадали после перезапуска сервера:)
Вопросы и ответы на собеседование по теме Java Server Pages (JSP).
Вопросы
2. Расскажите об этапах (фазах) жизненного цикла jsp.
3. Расскажите о методах жизненного цикла jsp.
4. Какие методы жизненного цикла JSP могут быть переопределены?
5. Как можно предотвратить прямой доступ к JSP странице из браузера?
6. Как закомментировать код в jsp?
7. Объясните Scriptlet, Expression и Declaration в JSP.
8. Какие неявные, внутренние объекты и методы есть на jsp странице?
9. Почему неявные объекты не доступны в обычной JSP странице?
10. Что вы знаете о PageContext и какие преимущества его использования?
11. Как сконфигурировать init параметры для JSP?
12. Почему не рекомендуется использовать скриптовые элементы в jsp?
13. Можем ли мы определить класс внутри JSP страницы?
14. Какие есть способы вставки java кода в jsp страницу?
15. Как можно запретить использование скриптов и java кода на jsp странице?
16. Что вы знаете о jsp тегах? Объясните как вы понимаете Action tag и JSP Action Elements.
17. Какая разница между директивой include и jsp:include action?
18. Что вы знаете о языке выражений jsp (JSP Expression Language – EL)?
19. Назовите неявные, внутренние объекты JSP EL и их отличия от объектов jsp.
20. Как узнать имя http метода используя JSP EL?
21. Что такое JSTL (Jsp Standard tag library)?
22. На какие категории можно разделить JSTL теги, приведите примеры.
23. Что вы знаете о написании пользовательских jsp тегов?
24. Приведите пример использования собственных тегов.
25. Почему не нужно конфигурировать стандартные JSP теги в web.xml?
26. Как можно обработать ошибки jsp страниц?
27. Как происходит обработка ошибок с помощью jstl?
28. Как сделать «новую линию в HTML» в JSP?
29. Приведите пример конфигурации JSP в дескрипторе развертывания.
30. Как деактивировать использование EL на JSP?
31. Когда контейнер проинициализирует множество JSP/Servlet объектов?
32. Можно ли использовать javascript на jsp странице?
33. Всегда ли создается объект сессии на jsp странице, можно ли отключить его создание?
34. Какая разница между JspWriter и Servlet PrintWriter?
35. Как можно расширить функциональность jsp?
36. Best Practices в JSP.
JSP — это JavaServer Pages. JSP является серверной технологией для создания динамических веб-страниц. JSP расширяет технологию сервлетов, чтобы помочь разработчикам создавать динамические страницы с HTML подобным синтаксисом.
Создание представлений поддерживается и в сервлетах, но в таком случае код выглядит ужасным и подвержен ошибкам. Так же было замечено, что большинство элементов веб страницы является статическими и поэтому JSP страница больше подходит к веб-страницам. По возможности необходимо избегать бизнес логики на странице JSP и использовать страницу только в качестве представления. Поэтому рекомендуется использовать JSP actions элементы или JSTL теги вместо написания JSP скриптов.
Еще одним преимуществом в JSP является горячее развертывание. Мы можем заменить старую страницу на другую в контейнере и пользователям будет отображаться новая JSP страница. Таким образом нет необходимости компилировать весь проект или перезапускать сервер для обновления части страниц.
2. Расскажите об этапах (фазах) жизненного цикла jsp.Если посмотреть код внутри созданной JSP страницы, то он будет выглядеть как HTML и не будет похож на java класс. Конвертацией JSP страниц в HTML код занимается контейнер, который так же создает сервлет для использования в веб приложении. Жизненный цикл JSP состоит из нескольких фаз:
Жизненные циклы методов JSP:
- jspInit() — метод объявлен в JSP странице и реализуется с помощью реализаций контейнера. Этот метод вызывается один раз в жизненном цикле JSP для того, чтобы инициализировать конфигурационные параметры, указанные в дескрипторе развертывания. Этот метод можно переопределить с помощью определения элемента JSP scripting и указания необходимых параметров для инициализации.
- _jspService() — этот JSP метод внедряется JSP контейнером для каждого запроса клиента с помощью передачи объекта запроса и ответа. Отметьте, что имя метода начинается с нижнего подчеркивания и отличается от других методов жизненного цикла тем, что его невозможно переопределить. Весь JSP код проходит через этот метод и он переопределен по умолчанию. Этот метод определен в HttpJspPage интерфейсе.
- jspDestroy() — метод вызывается контейнером JSP для удаления объекта из памяти (на последней фазе жизненного цикла JSP — Destroy). Метод вызывается только один раз и мы можем его переопределить для очищения любых ресурсов, которые были созданы в JSP init методе.
Мы можем переопределить jspInit() и jspDestroy() методы с помощью использования скриптов JSP. Метод jspInit() переопределяется для создания общих ресурсов, которые мы хотели бы использовать в методе обслуживания JSP, а jspDestroy() метод переопределяется, чтобы освободить общие ресурсы на фазе уничтожения.
5. Как можно предотвратить прямой доступ к JSP странице из браузера?Директория WEB-INF не имеет прямого доступа из веб приложения. Поэтому мы можем положить JSP страницы внутри этой папки и тем самым запретить доступ к странице из браузера. Однако в этом случае необходимо настраивать дескриптор развертывания наподобие сервлетов. Простая конфигурация дескриптора web.xml показана ниже.
Test /WEB-INF/test.jsp test Test Value Test /Test.do
< servlet - name > Test < / servlet - name > < jsp - file > / WEB - INF / test . jsp < / jsp - file > < init - param > < param - name > test < / param - name > < param - value > Test Value < / param - value > < / init - param > < / servlet > < servlet - mapping > < servlet - name > Test < / servlet - name > < url - pattern > / Test . do < / url - pattern > < / servlet - mapping > |
JSP предоставляет две возможности закомментировать код:
- HTML комментарии — . Такие комментарии будут видны клиенту при просмотре кода страницы.
- JSP комментарии — . Такие комментарии создаются в созданном сервлете и не посылаются клиенту. Для любых комментариев по коду или отладочной информации необходимо использовать этот тип комментариев.
Scriptlet, Expression и Declaration — скриптовые элементы внутри JSP страницы, которые могут выполнять Java код. Скриптлеты задаются тегом . Любой код внутри этих тегов будет передан _jspService() методу.
Date d = new Date () ; System . out . println ("Current Date=" + d ) ; |
Достаточно часто требуется показать динамическую информацию с использованием метода out.print() . Для этого существует язык выражений (expression), который записывается как . Например, выражение может быть переписано с помощью JSP выражения . Отметьте, что всё, что находится внутри тегов будет передано в out.print() метод. Так же обратите внимание, что скриптлеты могут содержать несколько java выражений, разделенных точкой с запятой, в то время как выражения не должны заканчиваться на точку с запятой.
JSP Declaration используется для объявления методов и переменных класса сервлета. Declaration записываются с помощью тега , например — .
8. Какие неявные, внутренние объекты и методы есть на jsp странице?JSP implicit objects (неявные объекты) создаются контейнером при конвертации JSP страницы в код сервлета для помощи разработчикам. Эти объекты можно использовать напрямую в скриптлетах для передачи информации в сервис методы, однако мы не можем использовать неявные объекты в JSP Declaration, т.к. такой код пойдет на уровень класса.
Существует 9 видов неявных объектов, которые можно использовать прямо на JSP странице. Семь из них объявлены как локальные переменные в начале _jspService()
метода, а два оставшихся могут быть использованы как аргументы метода _jspService()
.
Index JSP Page
Hi There
Current Time is:
Request User-Agent:
User init param value:
User context param value:
User Session ID:
PageContext attribute: {Name="Test",Value=""}
Generated Servlet Name:
< ! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< meta http - equiv = "Content-Type" content = "text/html; charset=US-ASCII" > Index JSP Page < / title > < / head >
Current
Time
is
<
/
strong
>
:
Request
User
-
Agent
<
/
strong
>
:
User
init
param
value
<
/
strong
>
:
User
context
param
value
<
/
strong
>
:
User
Session
ID
<
/
strong
>
:
PageContext
attribute
<
/
strong
>
:
{
Name
=
"Test"
,
Value
=
"
"
}
Generated Servlet Name < / strong > : < / body > < / html > |
Неявный объект исключений JSP недоступен в обычных JSP страницах и используется на страницах ошибок JSP только для того, чтобы перехватить исключение, брошенное JSP страницей и далее предоставить какую-либо полезную информацию клиенту.
10. Что вы знаете о PageContext и какие преимущества его использования?Неявный объект JSP pageContext является экземпляром реализации абстрактного класса javax.servlet.jsp.PageContext . Мы можем использовать объект pageContext для получения и установки атрибутов с различной областью видимости и для проброса запросов к другому ресурсу. Этот объект так же обладает ссылкой на другой неявный объект. Это единственный объект, который представлен в JSP implicit objects и JSP EL implicit objects.
11. Как сконфигурировать init параметры для JSP?Мы можем задать параметры инициализации для JSP аналогично сервлетам в web.xml файле. Мы должны сконфигурировать init параметры JSP с элементами servlet и servlet-mapping. Единственным отличием будет указание местонахождения JSP страницы.
JSP страницы в основном используются для целей отображения представления, а вся бизнес логика и модели должны быть реализованы в сервлетах или классах моделях. Мы должны передавать параметры к JSP странице через атрибуты и затем использовать их для создания HTML ответа на JSP странице. Большая часть JSP содержит HTML код и для того, чтобы помочь дизайнерам понять код JSP страницы и разрабатывать их, предоставляют элементы action, JSP EL, JSP Standart Tag Library. Именно эти элементы необходимо использовать вместо скриптлетов для создания моста между JSP HTML и JSP java частями.
13. Можем ли мы определить класс внутри JSP страницы?Определить класс внутри JSP страницы можно, но это считается плохой практикой. Это можно сделать так
< jsp - property - group > < url - pattern > * . jsp < / url - pattern > < scripting - invalid > true < / scripting - invalid > < / jsp - property - group > < / jsp - config > |
JSP элементы или теги action предоставляют полезную функциональность для работы с Java Bean, вложения ресурсов, проброса запроса и создания динамических XML элементов. Элементы jsp action всегда начинаются с записи jsp: и мы можем использовать их прямо внутри страницы JSP без необходимости подключения библиотек или других настроек.
Наиболее часто используемыми элементами action являются: jsp:useBean , jsp:getProperty , jsp:setProperty , jsp:include , jsp:forward .
17. Какая разница между директивой include и jsp:include action?Разница между директивой JSP include
и jsp:include
action заключается в том, что для директивы include, контент для другого ресурса будет добавлен в созданный сервлет на этапе трансляции JSP (фаза Translation), в то время как jsp:include
action работает в рантайме.
Другое отличие JSP include action
в том, что мы можем передать параметры для вложения с помощью команды jsp:params
, в то время как директива jsp include
не имеет возможности передавать параметры.
Использовать директиву JSP include необходимо для статических ресурсов вроде header, footer, image file для повышения производительности. Если же нам необходима динамика, передача параметров для обработки, то необходимо использовать тег jsp:include action.
В большинстве случаев мы используем JSP для целей просмотра, а вся бизнес-логика присутствует в сервлете или классах модели. После получения запроса клиента он обрабатывается в сервлете, а затем добавляем атрибуты в request/session/context scope, которые должны быть извлечены в JSP коде. Для создания ответа представлений так же используются request
, headers
, cookies
и init
параметры.
Мы можем использовать скриптлеты в JSP выражениях для получения атрибутов и параметров в JSP с Java кодом и использовать его для представлений. Проблема заключается в том, что веб дизайнеры обычно не знают java код, и именно поэтому в JSP 2.0 введен язык выражений (EL), через который мы можем получить атрибуты и параметры с помощью тегов HTML.
Синтаксис expression language выглядит как $ {имя}
, и мы можем использовать EL неявные объекты и операторы языка выражений для извлечения атрибутов из разных scopes и использовать их в JSP странице.
Язык выражений JSP предоставляет множество неявных объектов, которые можно использовать для получения атрибутов в различных областях видимости (scopes) и для значений параметров. Важно отметить, что они отличаются от неявных объектов JSP и содержат атрибуты в заданной области видимости. Наиболее часто использующийся implicit object в JSP EL и JSP page — это объект pageContext. Ниже представлена таблица неявных объектов JSP EL.
pageScope | Map | Карта атрибутов для page scope. |
requestScope | Map | Используется для получения атрибутов в request scope. |
sessionScope | Map | Используется для получения атрибутов из session scope. |
applicationScope | Map | Используется для получения атрибутов из application scope. |
param | Map | Используется для получения значения параметра request, возвращает одно значение. |
paramValues | Map | Используется для получения значений параметров запроса в массиве. Удобно для параметров запроса, который содержит множество значений. |
header | Map | Используется для получения информации о request header. |
headerValues | Map | Используется для получения значений header values в массиве. |
cookie | Map | Используется для получения значения cookie в JSP |
initParam | Map | Используется для получения параметров context init. Мы не можем использовать их для параметров инициализации сервлета (servlet init params). |
pageContext | pageContext | Такой же как и объект JSP implicit pageContext. Используется для получения request, session references и т.д. К примеру, получение имени request HTTP Method. |
Вот так: ${pageContext.request.method} .
21. Что такое JSTL (Jsp Standard tag library)?Стандартная библиотека тегов JSP (англ. JavaServer Pages Standard Tag Library, JSTL) - расширение спецификации JSP, добавляющее библиотеку JSP тегов для общих нужд, таких как разбор XML данных, условная обработка, создание циклов и поддержка интернационализации. JSTL - конечный результат JSR 52, разработанного в рамках процесса сообщества Java.
JSTL является альтернативой такому виду встроенной в JSP логики, как скриптлеты, то есть прямые вставки Java кода. Использование стандартизованного множества тегов предпочтительнее, поскольку получаемый код легче поддерживать и проще отделять бизнес-логику от логики отображения. Для использования JSTL тегов необходимо подключить библиотеку и указать на страницах пространство имен.
jstl jstl 1.2 taglibs standard 1.1.2
jstl < / groupId > jstl < / artifactId > 1.2 < / version > < / dependency >
taglibs < / groupId > standard < / artifactId > 1.1.2 < / version > < / dependency > |
Для подключения пространства имен основных тегов JSTL необходимо указать на JSP странице код:
|
JSTL теги разделяются на пять категорий согласно их функциональности:
JSP позволяет создавать свои собственные теги с необходимой функциональностью. Мы можем добавить библиотеку тегов на страницу JSP используя указание пространства имен. Для создания своего тега мы можем использовать следующие компоненты:
- JSP Custom Tag Handler
- Создание файла Tag Library Descriptor (TLD)
- Deployment Descriptor конфигурацию для TLD
Например нам необходимо отформатировать в каком-либо стиле очень длинное число. Для этого можно использовать собственный тег вроде:
< mytags : formatNumber number = "123456.789" format = "#,###.00" / > |
Используя входные параметры, число должно быть преобразовано на JSP странице в таком виде 123,456.79 согласно шаблону. Т.к. JSTL не предоставляет такой функциональности, то нам придется создать собственный тег для получения необходимого результата.
25. Почему не нужно конфигурировать стандартные JSP теги в web.xml?Нам не нужно настраивать стандартные теги JSP в web.xml, потому что TLD файлы уже находятся внутри каталога META-INF в JSTL jar файлах. Когда контейнер загружает веб-приложение и находит TLD файлы в директории META-INF в JAR файле, то он автоматически настраивает их для непосредственного использования на JSP страницах. Остается только задать пространство имен на jsp странице.
26. Как можно обработать ошибки jsp страниц?Для обработки исключений выброшенных на jsp странице необходимо всего лишь задать страницу ошибки. Для создания страницы ошибки JSP мы должны установить значение page directive attribute isErrorPage в значение true. Тогда мы получим доступ к неявным объектам исключений в JSP и сможем передавать собственные сообщение об ошибках клиенту (обычно более информативных).
Настройка дескриптора развертывания выглядит так.
404 /error.jsp java.lang.Throwable /error.jsp
< error - page > < error - code > 404 < / error - code > / error . jsp < / location > < / error - page > < error - page > < exception - type > java . lang . Throwable < / exception - type > / error . jsp < / location > < / error - page > |
Перехватывать исключения и обрабатывать их в служебных методах класса можно с помощью JSTL Core Tags c:catch и c:if . Тег c:catch перехватывает исключение и обертывает его в переменную exception, которую мы можем обработать в теге c:if .
Exception is: ${exception}
Exception Message: ${exception.message}
< c : catch var = "exception" >
< / c : catch > < c : if test = "${exception ne null}" > Exception is : $ { exception } < br / > Exception Message : $ { exception . message } < / p > < / c : if > |
Обратите внимание что используется язык выражений JSP EL в теге c:if .
28. Как сделать «новую линию в HTML» в JSP?Для переноса строки можно использовать тег c:out и атрибут escapeXml для отключения обработки HTML элементов и браузер получит следующий код как строку (и обработает элемент
как требуется).
Как мы уже видели в предыдущей статье, сервлеты позволяют нам получать запросы от клиента, совершать некоторую работу и выводить ее результаты на экран. До того момента, как надо осуществлять вывод на экран сервлет прекрасно работает. В него можно вставить достаточно сложную логику, сделать вызовы к базе данных и многое-многое другое, что необходимо для приложения. Но вот осуществлять вывод на экран внутри самого сервлета — очень неудобно. В нашем примере мы ограничились крайне простым решением. А что придется делать в случае вывода сложных дизайнерских идей? Вряд ли Web-дизайнер сможет понять, как надо осуществлять вывод внутри нашего сервлета. И когда он захочет осуществить свои дизайнерские идеи, то ему придется приходить к программисту и просить поменять код сервлета для того, чтобы изменить дизайн. Это надо будет перекомпилировать, надо будет придумывать умные алгоритмы для вывода не только картинок, но и того же JavaScript. Просто кошмар.
Каждому здравомыслящему разработчику ясно, что надо использовать иное решение. Самое очевидное – придумать механизм, который разделил бы задачу на две составляющие: одна часть обрабатывает запрос, меняет данные, собирает данные, укладывает это в некий пакет и передает второй части, которая делает только одно – показывает эти данные.
Так мы подошли к уже известному нам петтерну – Model-View-Controller (MVC). Для случая Web-приложений контроллером у нас становится сервлет, пакет данных, который мы сформировали – моделью. А вот на роль представления (View) прекрасно подходит JSP – Java Server Pages.
В этой статье мы сделаем общий обзор этой технологии. А «Отдел кадров» продолжим в следующей статье, где сможем сразу использовать знакомые технологии – сервлеты и JSP.
Основная идея JSP очень проста – сама страница пердставляет из себя шаблон с уже заготовленными HTML-тэгами, между которыми надо вставить нужные данные. Что-то вроде такого (это только схема)
Hello World Sample [И тут какие-то данные]
Чтобы вам не было скучно и для наглядности давайте изменим наш самый первый сервлет HelloWorldServlet из предыдущей статьи. Мы добавим ему возможность работать с параметром, который передадим с помощью URL. Его мы увидим чуть позже. А пока давайте посмотрим на несколько измененный сервлет HelloWorldServlet. Его задача сейчас очень проста – вывести приветствие «Hello, world !» в случае если не будет передано параметра name. Если же он передан, то приветствие несколько изменится. Например, при передаче параметра name=Antonсервлет должен вывести надпись «Hello, world. I’m Anton».
Ничего сложного в задаче нет и ее можно решить без JSP, но для демонстрации нам подойдет.
package students.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { getServletContext().getRequestDispatcher("/hello.jsp").forward(req, resp); } }
package students . web ; import javax . servlet . ServletException ; import javax . servlet . http . HttpServlet ; import javax . servlet . http . HttpServletRequest ; import javax . servlet . http . HttpServletResponse ; public class HelloWorldServlet extends HttpServlet { public void doGet (HttpServletRequest req , HttpServletResponse resp ) throws ServletException , IOException { getServletContext () . getRequestDispatcher ("/hello.jsp" ) . forward (req , resp ) ; |
Самая интересная строка (она же пока и единственная) позволяет нам получить ресурс (в нашем случае это hello.jsp) и передать этому ресурсу наши данные. В данном случае мы ничего не меняли и не добавляли. Теперь давайте посмотрим на файл hello.jsp, который должен представить пользователю некую страницу. В данном случае она не очень сложная, но все-таки мы остановимся на ней подробнее.
Hello World Sample Hello, world ! Hello, world ! I"m
< html > < head > < title > Hello World Sample < / title > < / head > < body > < h1 > String name = request . getParameter ("name" ) ; if (name == null || name . length () == 0 ) { Hello , world !
Похожие публикации
|