Cервлеты позволяют получать запросы от клиента, совершать некоторую работу и выводить результаты на экран. Сервлет прекрасно работает до того момента, пока речь идет об обработке информации, т.е. до вывода информации на экран. В сервлет можно вставить достаточно сложную логику, сделать вызовы к базе данных и многое-многое другое, что необходимо для приложения. Но вот осуществлять вывод на экран внутри самого сервлета - очень неудобно. А как быть при разработке сложных дизайнерских идей и последующее внесение изменений в пользовательский интерфейс? Технология проектирования Java Server Pages (JSP) - это одна из технологий J2EE, которая представляет собой расширение технологии сервлетов для упрощения работы с Web-содержимым. Страницы JSP позволяет легко разделить Web-содержимое на статическую и динамическую часть, допускающую многократное использование ранее определенных компонентов. Разработчики Java Server Pages могут использовать компоненты JavaBeans и создавать собственные библиотеки нестандартных тегов, которые инкапсулируют сложные динамические функциональные средства. Спецификация Java Server Pages (http://java.sun.com/products/jsp) наследует и расширяет спецификацию сервлетов (http://java.sun.com/products/servlets). Как и сервлеты, компоненты JSP относятся к компонентам Web и располагаются в Web-контейнере. Страницы JSP не зависят от конкретной реализации Web-контейнера, что обеспечивает возможность их повторного использования. В дополнение к классам и интерфейсам для программирования сервлетов (пакеты javax.servlet и javax.servlet/http ), в пакетах javax.servlet.jsp и javax.servlet.jsp.target содержатся классы и интерфейсы, относящиеся к программированию Java Server Pages. Полное описание технологии Java Server Pages можно найти в спецификации по адресу (java.sun.com/products/jsp/download.htm)

Обзор технологии Java Server Pages Технология Java Server Pages содержит четыре ключевых компонента:
  • Директивы (directive) представляют собой сообщения для контейнера JSP, дающим возможность определить параметры страницы, подключения других ресурсов, использовать собственные нестандартные библиотеки тегов.
  • Действия (actions) инкапсулируют функциональные возможности в предопределенных тегах, которые можно встраивать в JSP-страницу. Действия часто выполняются на основе информации, посылаемой на сервер в составе запроса от определенного клиента. Действия также могут создавать объекты Java для использования их в скриптлетах JSP.
  • Скриптлеты (scriptlets) позволяют вставлять код Java в страницы JSP, который взаимодействует с объектами страницы при обработке запроса.
  • Библиотеки тегов (tag library) являются составной частью механизма расширения тегов, допускающего разработку и использование собственных тегов.
  • Наличие данных с неизменяемой структурой определяют выбор программиста в принятии решения, какую технологию следует использовать: сервлеты или страницы JSP. Программисты предпочитают использовать страницы JSP, если основная часть посылаемого клиенту содержимого представляет собой данные с неизменяемой структурой, и лишь небольшая часть содержимого генерируется динамически с помощью кода Java. Сервлеты предпочтительнее использовать, если только небольшая часть содержимого, посылаемого клиенту, представляет собой данные с неизменяемой структурой. На самом деле отдельные сервлеты могут вообще не генерировать содержимого для клиента, выполняя определенную задачу в интересах клиента, а затем вызывают другие сервлеты или JSP-страницы, чтобы отправить ответ. Необходимо заметить, что во многих случаях сервлеты и JSP-страницы являются взаимозамеяемыми. Подобно сервлетам, JSP-страницы обычно выполняются на стороне Web-сервера, который называют контейнером JSP. Когда Web-сервер, поддерживающий технологию JSP, принимает первый запрос на JSP-страницу, контейнер JSP транслирует эту JSP-страницу в сервлет Java, который обслуживает текущий запрос и все последующие запросы к этой странице. Если при компиляции нового сервлета возникают ошибки, эти ошибки приводят к ошибкам на этапе компиляции. Контейнер JSP на этапе трансляции помещает операторы Java, которые реализует ответ JSP-страницы, в метод _jspService. Если сервлет компилируется без ошибок, контейнер JSP вызывает метод _jspService для обработки запроса. JSP-страница может обработать запрос непосредственно, либо вызвать другие компоненты Web-приложения, чтобы содействовать обработке запроса. Любые ошибки, которые возникают в процессе обработки, вызывают исключительную ситуацию в Web-сервере на этапе запроса . Весь статический текст HTML, называемый в документации JSP шаблоном HTML (template HTML), сразу направляется в выходной поток. Выходной поток страницы буферизуется. Буферизацию обеспечивает класс JspWriter , расширяющий класс Writer . Размер буфера по умолчанию ограничен до 8 Кбайт, но его можно изменить атрибутом buffer тега . Наличие буфера позволяет заносить заголовки ответа в выходной поток совместно с выводимым текстом. В буфере заголовки будут размещены перед текстом. Таким образом, достаточно написать страницу JSP, сохранить ее в файле с расширением jsp и установить файл в контейнер, так же, как и страницу HTML, не заботясь о компиляции. При установке можно задать начальные параметры страницы JSP так же, как и начальные параметры сервлета.

    30 ответов

    Использование скриптлетов (эти %% вещи) в действительно крайне не рекомендуется с момента рождения taglibs (например, ) и ( , эти ${} вещи) еще в 2001 году.

    Основными недостатками скриплетов являются:

  • Возможность повторного использования : вы не можете повторно использовать скриптлеты.
  • Заменимость: вы не можете сделать скриптлеты абстрактными.
  • ОО-способность: вы не можете использовать наследование/композицию.
  • Отладка: если скриптлет выбрасывает исключение на полпути, вы получаете только пустую страницу.
  • Тестируемость: скриптлеты не тестируются юнитами.
  • Ремонтопригодность: для сохранения логики смешанного/загроможденного/дублированного кода требуется больше времени.
  • Сам Sun Oracle также рекомендует в соглашениях по кодированию JSP избегать использования скриптлетов, когда те же функции возможны с помощью (тегов) классов. Вот несколько ссылок:

    Из спецификации JSP 1.2 настоятельно рекомендуется использовать в вашем веб-приложении стандартную библиотеку тегов JSP (JSTL), чтобы уменьшить потребность в скриплетах JSP на ваших страницах. Страницы, использующие JSTL, в общем, легче читать и поддерживать.

    По возможности избегайте JSP-скриптлетов, когда библиотеки тегов предоставляют эквивалентную функциональность. Это облегчает чтение и обслуживание страниц, помогает отделить бизнес-логику от логики представления и облегчает превращение ваших страниц в страницы в стиле JSP 2.0 (спецификация JSP 2.0 поддерживает, но не подчеркивает использование скриптлетов).

    В духе принятия шаблона проектирования модель-представление-контроллер (MVC) для уменьшения связи между уровнем представления и бизнес-логикой сценарии JSP не должны использоваться для написания бизнес-логики. Вместо этого JSP-скриптлеты используются при необходимости для преобразования данных (также называемых "объектами значений"), возвращаемых при обработке клиентских запросов, в надлежащий формат, готовый для клиента. Даже тогда это лучше сделать с помощью сервлета фронт-контроллера или пользовательского тега.

    То, как заменить скриптлеты, полностью зависит от единственной цели кода/логики. Чаще всего этот код помещается в полноценный класс Java:

      Если вы хотите вызывать один и тот же код Java при каждом запросе, в меньшей или большей степени независимо от запрашиваемой страницы, например, проверяя, вошел ли пользователь в систему, тогда реализуйте и соответственно пишите код в doFilter() . Например:

      Public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { if (((HttpServletRequest) request).getSession().getAttribute("user") == null) { ((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page. } else { chain.doFilter(request, response); // Logged in, just continue request. } }

      При отображении на соответствующий охватывающий интересующие JSP-страницы, вам не нужно копировать и вставлять один и тот же фрагмент кода в общие JSP-страницы.

      предварительной обработки запроса, например, предварительно загрузить некоторый список из базы данных для отображения в некоторой таблице, при необходимости, основываясь на некоторых параметрах запроса, то реализуйте и напишите код соответствующим образом в методе doGet() . Например:

      Protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { ListProducts = productService.list(); // Obtain all products. request.setAttribute("products", products); // Store products in request scope. request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); // Forward to JSP page to display them in a HTML table. } catch (SQLException e) { throw new ServletException("Retrieving products failed!", e); } }

      Таким образом, иметь дело с исключениями проще. К БД не обращаются во время рендеринга JSP, но задолго до того, как JSP был отображен. У вас все еще есть возможность изменить ответ всякий раз, когда доступ к БД вызывает исключение. В приведенном выше примере будет отображена страница ошибки 500 по умолчанию, которую вы в любом случае можете настроить с помощью в web.xml .

      Если вы хотите вызвать некоторый Java-код для постобработки запроса, например, обработки отправки формы, то реализуйте и напишите код соответствующим образом в методе doPost() . Например:

      Protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); User user = userService.find(username, password); if (user != null) { request.getSession().setAttribute("user", user); // Login user. response.sendRedirect("home"); // Redirect to home page. } else { request.setAttribute("message", "Unknown username/password. Please retry."); // Store error message in request scope. request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to JSP page to redisplay login form with error. } }

      Это облегчает работу с различными адресами на странице результатов: повторное отображение формы с ошибками проверки в случае ошибки (в данном конкретном примере вы можете повторно отобразить ее, используя ${message} в ), или просто переход на нужную целевую страницу в случае успеха.

      Если вы хотите вызвать некоторый Java-код для управления планом выполнения и/или местом назначения запроса и ответа, то реализуйте соответствии с шаблоном фронт-контроллера MVC . Например:

      Protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { Action action = ActionFactory.getAction(request); String view = action.execute(request, response); if (view.equals(request.getPathInfo().substring(1)) { request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response); } else { response.sendRedirect(view); } } catch (Exception e) { throw new ServletException("Executing action failed.", e); } }

      Или просто используйте MVC-инфраструктуру, такую как , и т.д., Чтобы в итоге вы получили только страницу JSP/Facelets и класс JavaBean без необходимости использования собственного сервлета.

      Если вы хотите вызвать некоторый Java-код для управления потоком внутри JSP-страницы, то вам нужно получить (существующий) taglib управления потоком, такой как ядро JSTL . Например, отображение ListВ таблице:

      ...

      ${product.name} ${product.description} ${product.price}

      С тегами в стиле XML, которые хорошо вписываются в этот HTML, код лучше читается (и, следовательно, лучше поддерживается), чем набор скриплетов с различными открывающими и закрывающими скобками ("Куда, черт возьми, относится эта закрывающая скобка?"). Легкая помощь состоит в том, чтобы настроить ваше веб-приложение на выдачу исключения, когда скриптлеты все еще используются, добавив следующий фрагмент в web.xml:

      *.jsp true ...

      Обратите внимание, что чувствительность XSS никоим образом не связана конкретно с Java/JSP/JSTL/EL/чем бы то ни было, эту проблему необходимо учитывать в каждом разрабатываемом веб-приложении. Проблема скриплетов в том, что они не предоставляют встроенных предупреждений, по крайней мере, не используя стандартный Java API. У преемника JSP Facelets уже есть неявное экранирование HTML, поэтому вам не нужно беспокоиться о дырах XSS в Facelets.

      Как защитник: отключить скрипты для хорошего

      Вы можете использовать теги JSTL вместе с выражениями EL, чтобы избежать смешения Java и HTML-кода:

      // and so on

      Существуют также основанные на компонентах фреймворки, такие как Wicket , которые генерируют много HTML для вас. Теги, которые попадают в HTML, являются чрезвычайно базовыми, и в них практически нет логики, в результате чего возникают почти пустые страницы HTML с типичными элементами HTML. Недостатком является то, что в API Wicket есть много компонентов, и некоторые из них могут быть трудными для достижения этих ограничений.

      В архитектурном шаблоне MVC JSP представляют собой слой "Вид". Встраивание java-кода в JSP считается плохой практикой. Вы можете использовать JSTL , velocity с JSP как "механизм шаблонов". Поставщик данных для этих тегов зависит от фреймворков , с которыми вы имеете дело. Struts 2 и webwork в качестве реализации шаблона MVC использует OGNL "очень интересный метод для раскрытия Beans Свойства для JSP".

      Опыт показал, что JSP имеет некоторые недостатки, один из которых трудно избежать смешивания разметки с фактическим кодом.

      Если вы можете, подумайте об использовании специализированной технологии для того, что вам нужно сделать. В Java EE 6 есть JSF 2.0, который обеспечивает множество приятных функций, включая склеивание Java beans вместе с страницами JSF с помощью подхода #{bean.method(argument)} .

      Если вы просто хотите избежать недостатков Java-кодирования в JSP, вы можете сделать это даже с помощью скриптов. Просто следуйте некоторой дисциплине, чтобы иметь минимальную Java в JSP и почти нет вычислений и логики на странице JSP.

      // and so on

      Научитесь настраивать и писать свои собственные теги с помощью JSTL

      Обратите внимание, что EL является EviL (исключения времени выполнения, рефакторинг)
      Калитка также может быть злой (производительность, трудная для небольших приложений или простой уровень обзора)

      Пример из java2s,

      Это необходимо добавить в веб-приложение web.xml

      /java2s /WEB-INF/java2s.tld

      создать файл: java2s.tld в /WEB -INF/

      1.0 1.2 Java2s Simple Tags bodyContentTag com.java2s.BodyContentTag JSP howMany

      скомпилируйте следующий код в WEB-INF\classes\com\java2s

      Package com.java2s; import java.io.IOException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; public class BodyContentTag extends BodyTagSupport{ private int iterations, howMany; public void setHowMany(int i){ this.howMany = i; } public void setBodyContent(BodyContent bc){ super.setBodyContent(bc); System.out.println("BodyContent = "" + bc.getString() + """); } public int doAfterBody(){ try{ BodyContent bodyContent = super.getBodyContent(); String bodyString = bodyContent.getString(); JspWriter out = bodyContent.getEnclosingWriter(); if (iterations % 2 == 0) out.print(bodyString.toLowerCase()); else out.print(bodyString.toUpperCase()); iterations++; bodyContent.clear(); // empty buffer for next evaluation } catch (IOException e) { System.out.println("Error in BodyContentTag.doAfterBody()" + e.getMessage()); e.printStackTrace(); } // end of catch int retValue = SKIP_BODY; if (iterations < howMany) retValue = EVAL_BODY_AGAIN; return retValue; } }

      Запустите сервер и загрузите bodyContent.jsp в браузере

      A custom tag: body content This page uses a custom tag manipulates its body content.Here is its output:

    • java2s.com
    • Вы подняли хороший вопрос, и хотя у вас есть хорошие ответы, я бы посоветовал вам избавиться от JSP. Это устаревшая технология, которая в конечном итоге умрет. Используйте современный подход, например, движки шаблонов. У вас будет очень четкое разделение слоев бизнеса и презентаций и, конечно же, кода Java в шаблонах, поэтому вы можете создавать шаблоны непосредственно из программного обеспечения для редактирования веб-презентаций, в большинстве случаев использующих WYSIWYG.

      И, конечно, избегайте фильтров и предварительной и последующей обработки, иначе вы можете столкнуться с проблемами поддержки/отладки, поскольку вы всегда не знаете, где переменная получает значение.

      Независимо от того, насколько вы стараетесь избегать, когда вы работаете с другими разработчиками, некоторые из них по-прежнему предпочитают скриптлет, а затем вставляют злой код в проект. Поэтому настройка проекта при первом знаке очень важна, если вы действительно хотите уменьшить код сценария. Существует несколько способов преодолеть это (в том числе несколько фреймворков, о которых упоминалось выше). Однако, если вы предпочитаете чистый JSP-путь, используйте файл тегов JSTL. Самое приятное в этом - вы также можете настроить мастер-страницы для своего проекта, чтобы другие страницы могли наследовать мастер-страницы

      Создайте главную страницу под названием base.tag под вашими WEB-INF/тегами со следующим контентом

      .... .....

      На этой странице mater я создал фрагмент под названием "title", так что на дочерней странице я мог вставить больше кодов в это место главной страницы. Кроме того, тег будет заменен содержимым дочерней страницы

      Создать дочернюю страницу (child.jsp) в папке WebContent:

      используется для указания главной страницы, которую вы хотите использовать (в данный момент это base.tag). Все содержимое внутри тега здесь заменит на главной странице. Ваша дочерняя страница также может содержать любые теги lib, и вы можете использовать ее, как и другие. Однако, если вы используете код сценария здесь ( ...) и попробуйте запустить эту страницу, вы получите JasperException because Scripting elements (< c: if test= "${!account.isBlocked}" > ${ statusActive }

      < c: if test= "${account.isBlocked}" > ${ statusBlocked }

      < td>< c: if test= "${!account.isBlocked}" >

      < a href= "?command=blockaccount&accountId=${account.accountId}" > ${ block }

      < td>< a href= "?command=showinfo&accountId=${account.accountId}" > ${ showInfo }

      Код выше демонстрирует вывод всех элементов списка. О том, как мы его передали на страницу будет в следующих статьях. Его синтаксис:

      ${item}

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

      Синтаксис:
      a equals b

      Лучше всего рассматривать теги jstl при написании реального проекта, так как я не вижу смысла учить и запоминать весь синтаксис для каждого действия. Код выше должен послужить только примером, как это используется. Не нужно ничего заучивать. Когда Вы будете писать код, тогда и обратитесь к данному синтаксису.

      К стати, код проекта, с которого был взят этот код, находится тут: https://github.com/caligula95/payment-systemapp

      Я выложил проект на heroku: https://payment-systemapp.herokuapp.com/ — тут используется бесплатный аккаунт, так что для первого запроса нужно подождать пару минут, чтобы проект запустился.

      JavaServer Pages (JSP) позволяют вам отделить динамическую часть ваших страниц от статического HTML. Вы, как обычно, пишете обычный код в HTML, используя для этого любую программу для создания Web страниц. Затем вы заключаете динамическую часть кода в специальные таги, большинство которых начинаются с " ". В качестве примера рассмотрим секцию JSP страницы, результатом которой будет что-то вроде "Спасибо за покупку Core Web Programming " по запросу с URL: http://host/OrderConfirmation.jsp?title=Core+Web+Programming:

      Спасибо за покупку

      Вы даете вашему файлу расширение.jsp и размещаете там же, где должны размещаться обычные Web страницы. Хотя то что вы написали больше похоже на обычный HTML файл чем на сервлет, просто за кадром JSP страница преобразуется в обычный сервлет с статическим HTML который просто направляется в поток вывода, связанный с методом сервлета service . Обычно это происходит при первом запросе страницы, и разработчики могут сразу после установки сами выполнить этот запрос, если хотят чтобы первый реальный пользователь при обращении к странице не столкнулся с небольшой задержкой, вызванной трансляцией JSP страницы в сервлет и его последующей компиляцией и загрузкой. Также отметим что большинство Web серверов позволяет вам задавать ссылки (aliases), так что адрес URL, указывающий на HTML файл в действительности будет указывать на сервлет или страницу JSP.

      Помимо стандартных HTML конструкций существуют еще три основных типа конструкций JSP, котрые вы можете включить в страницу: элементы скриптов, директивы и действия. Элементы скриптов позволяют вам указать код на языке Java, который впоследствии станет частью в конечный сервлет, директивы дадут вам возможность управлять всей структурой сервлета, а действия служат для задания существующих используемых компонентов, а также для контроля поведением движка JSP. Для упрощения элементов скриптов, вы имеете доступ к нескольким заранее определенным переменным, таким, например, как переменная request , использованная в приведенном выше отрывке.

      Обратите внимание что это руководство охватывает JSP версии 1.0. А начиная с версии 0.92 JSP претерпела множество изменений, и несмотря на то что эти изменения были лишь во благо, вы должны помнить что JSP версии 1.0 практически полностью не совместима с более ранними JSP движками. Также следует не забывать о том, что предлагаемое вашему вниманию руководство является частью более полного руководства по сервлетам и JSP доступного по адресу http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/ .

      2. Синтаксис Элемент JSP Синтаксис Описание Примечание
      Выражение JSP Выражение обрабатывается и направляется на вывод Эквивалент на XML:

      expression
      . Заранее определенные переменные: request, response, out, session, application, config и pageContext (также доступны в скриплетах).
      Скриплет JSP Код добавляется в метод service. Эквивалент на XML:

      код
      .
      Объявление JSP Код добавляется в тело класса сервлета, вне метода service. Эквивалент на XML:

      код
      .
      Директива JSP page Директивы для движка сервлета с информацией об основных настройках. Эквивалент на XML:
      . Допустимые атрибуты (жирным выделены значения, принимаемые по умолчанию):
      import="пакет.class "
      contentType="MIME-Type "
      isThreadSafe="true |false
      " session="true |false"
      buffer="размер kb|none"
      autoflush="true |false"
      extends="пакет.class "
      info="сообщение"
      errorPage="url "
      isErrorPage="true|false "
      language="java"
      Директива JSP include Файл в локальной системе, подключаемый при трансляции JSP в сервлет. Эквивалент на XML:
      .
      URL должен быть относительным. Для подключения файла в процессе запроса а не в ходе трансляции используйте действие jsp:include.
      Комментарий JSP Комментарий; игнорируется при трансляции JSP страницы в сервлет. Если вы хотите чтобы комментарий сохранился в конечном HTML, используйте обычный синтаксис HTML для описания комментариев: .
      Действие jsp:include Подключает файл при запросе страницы. Если вы хотите чтобы файл подключался в процессе трансляции страницы, используйте директиву page совместно с атрибутом include. Внимание: некоторые сервера требуют чтобы подключаемые файлы были в формате HTML или JSP, в зависимости от настроек сервера (обычно данное ограничение базируется на указании расширений файлов).
      Действие jsp:useBean or

      ...
      Найти или создать Java Bean. Возможные атрибуты:
      id="имя "
      scope="page |request|session|application"
      class="пакет.class "
      type="пакет.class "
      beanName="пакет.class "
      Действие jsp:setProperty Устанавливает свойства bean, или явно, или указанием на соответствующее значение параметра, передаваемое при запросе. Допустимые атрибуты:
      name="имяBean "
      property="имяСвойства |*"
      param="имяПараметра "
      value="значение "
      Действие jsp:getProperty Получение и вывод свойств bean.
      Действие jsp:forward Передает запрос другой странице.
      Действие jsp:plugin
      ...

      Генерирует тэги OBJECT или EMBED, в зависимости от типа броузера, в котором будет выполнятся апплет использующий Java Plugin.
      3. Текст шаблона: Статический HTML

      Как правило большую часть вашей JSP страницы составляет статический HTML, называемый текстом шаблона . Во всех отношениях (кроме одного) этот HTML выглядит как обычный HTML, использующий те же правила синтаксиса, и он просто "передается" клиенту сервлетом, создаваемым для обработки страницы. При этом не только сам HTML выглядит нормальным, он может создаваться с применением тех инструментов, которые вы ранее использовали при создании Web страниц. Я, например, при создании большинства JSP страниц для этого руководства использовал Allaire"s HomeSite.

      Единственным печальным исключением из правила что "текст шаблона передается в неизменном виде" является ситуация, когда в тексте вы хотите отобразить последовательность символов " " внутри скриплета, вместо нее используйте " %\> ". Эквивалентом для XML является:

      Код

      4.3 Объявления JSP

      Объявления JSP позволят вам задать методы или поля, для вставки в тело класса сервлета (вне метода service , обрабатывающего запрос). Они имеют следующую форму:

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

      Количество обращений к странице с момента загрузки сервера:

      Также как и в скриплетах, если вам необходимо использовать последовательность символов " %> ", используйте для этого последовательность " %\> ". XML эквивалентом является

      Код

      5. Директивы JSP Директивы JSP воздействуют на всю структуру класса сервлета. Обычно они имеют следующую форму: Вы также можете объединить установку нескольких атрибутов для одной директивы:

      Существуют два основных типа директив: page , которая позволяет вам совершать такие операции, как импорт классов, изменение суперкласса сервлета, и т.п.; и include , которая дает вам возможность вставить файл в класс сервлета при трансляции JSP файла в сервлет. Также следует упомянуть директиву taglib , которая не поддерживается в JSP версии 1.0, но позволяет авторам JSP задавать свои собственные тэги. Предполагается что эта директива станет основной особенностью JSP 1.1.

      5.1 Директива JSP page Директива page позволяет вам задать один и более следующих чувствительных к регистру атрибутов:
      • import="пакет.class " или import="пакет.class1,...,пакет.classN " . Позволяет вам задать пакеты, которые должны быть импортированы. Например:

        Атрибут import - единственный атрибут, допускающий многократное применение.
      • contentType="MIME-Тип " или
        contentType="MIME-Тип ; charset=Кодировка-Символов "
        Задает тип MIME для вывода. По умолчанию используется text/html . К примеру, директива

        приводит к тому же результату, что и использование скриплета
      • isThreadSafe="true|false" . Значение true ("истина", принимается по умолчанию) задает нормальный режим выполнения сервлета, когда множественные запросы обрабатываются одновременно с использованием одного экземпляра сервлета, исходя из соображения что автор синхронизировал доступ к переменным этого экземпляра. Значение false ("ложь") сигнализирует о том, что сервлет должен наследовать SingleThreadModel (однопоточную модель) при которой последовательные или одновременные запросы обрабатываются отдельными экземплярами сервлета.
      • session="true|false" . Значение true ("истина", принимается по умолчанию) сигнализирует о том, что заранее определенная переменная session (тип HttpSession) должна быть привязана к существующей сессии, если таковая имеется, в противном случае создается новая сессия, к которой и осуществляется привязка. Значение false ("ложь") определяет что сессии не будут использоваться, и попытки обращения к переменной session приведут к возникновению ошибки при трансляции JSP страницы в сервлет.
      • buffer="размерkb|none" . Задает размер буфера для JspWriter out . Значение принимаемое по умолчанию зависит от настроек сервера, но должно превышать 8kb .
      • autoflush="true|false" . Значение true ("истина", принимаемое по умолчанию) устанавливает что при переполнении буфер должен автоматически очищаться. Значение false ("ложь"), которое крайне редко используется, устанавливает что переполнение буфера должно приводить к возникновению исключительной ситуации. При установке значение атрибута buffer="none" установка значения false для этого атрибута недопустимо.
      • extends="пакет.class " . Задает суперкласс для генерируемого сервлета. Этот атрибут следует использовать с большой осторожностью, поскольку возможно что сервер уже использует какой-нибудь суперкласс.
      • info="сообщение " . Задает строку, которая может быть получена при использовании метода getServletInfo .
      • errorPage="url " . Задает JSP страницу, которая вызывается в случае возникновения каких-либо событий Throwable s, которые не обрабатываются на данной странице.
      • isErrorPage="true|false" . Сигнализирует о том, может ли эта страница использоваться для обработки ошибок для других JSP страниц. По умолчанию принимается значение false ("ложь").
      • language="java" . Данный атрибут предназначен для задания используемого языка программирования. По умолчанию принимается значение " java" , поскольку на сегодняшний день это единственный поддерживаемый язык программирования.
      Синтаксис задания директив на XML Пример. Эквивалентом XML для является 5.2 Директива JSP include

      Эта директива позволяет вам включать файлы в процессе трансляции JSP страницы в сервлет. Использование директивы выглядит следующим образом:

      Заданный URL обычно интерпретируется относительно JSP страницы, на которой расположена ссылка, но, как и при использовании любых других относительных URL вы можете задать системе положение интересующего вас ресурса относительно домашнего каталога Web сервера, добавив в начало URL символ "/". Содержимое подключаемого файла обрабатывается как обычный текст JSP и поэтому может включать такие элементы как статический HTML, элементы скриптов, директивы и действия.

      Например, многие сайты используют небольшую панель навигации на каждой странице. В связи с проблемами использования фреймов HTML часто эта задача решается размещением небольшой таблицы сверху или в левой половине страницы, HTML код которой многократно повторяется для каждой страницы сайта. Директива include наиболее естественный способ решения этой задачи, избавляющий разработчика от кошмара рутины копирования HTML в каждый отдельный файл. Это происходит следующим образом:

      Руководство по сервлетам: JavaServer Pages (JSP) 1.0

      6. Пример использования элементов скриптов и директив

      На этом простейшем примере показано использование различных конструкций JSP: выражений, скриплетов, объявлений и директив. Также вы можете скачать исходный файл или вызвать этот скриплет из Интернет .

      Использование JavaServer Pages

      Использование JavaServer Pages

      Некое динамическое содержание созданное с использованием различных механизмов JSP:

      • Выражение.
        Имя вашего хоста: .
      • Scriptlet.
      • Объявление (совместно с выражением).
        Количество обращений к странице с момента загрузки сервера:
      • Директива (совместно с выражением).
        Текущая дата:

      7. Заранее определенные переменные

      Для упрощения кода в выражениях JSP и скриплетах, вам предоставлен набор их восьми автоматически определенных переменных, иногда называемых неявными объектами . Доступные переменные это request , response , out , session , application , config , pageContext и page . Далее мы рассмотрим каждую из них в отдельности

      7.1 request

      Это объект HttpServletRequest , связанный с запросом, который позволяет вам обращаться к параметрам запроса (через метод getParameter), типу запроса (GET , POST , HEAD , и т.д..), и входящим HTTP заголовкам (cookies, Referer , и т.д..). Проще говоря, request является подклассом ServletRequest и может отличаться от HttpServletRequest если используется протокол отличный от HTTP, что на практике практически никогда не встречается.

      7.2 response

      Это объект типа HttpServletResponse , связанный с ответом на запрос клиента. Обратите внимание что, поскольку поток вывода (см. out далее) буферизован, можно изменять коды состояния HTTP и заголовки ответов, даже если это недопустимо в обычном сервлете, но лишь в том случае если какие-то данные вывода уже были отправлены клиенту.

      7.3 out

      Это объект типа PrintWriter , используемый для отправки вывода клиенту. Однако, чтобы сделать объект response (см. предыдущий раздел) полезным, следует использовать буферизированный вариант PrintWriter - JspWriter . Помните что вы можете изменять размер буфера и даже отключить буферизацию, изменяя значение атрибута buffer директивы page . Этот вопрос подробно рассмотрен в . Также обратите внимание что out используется практически исключительно скриплетами, поскольку выражения JSP автоматически помещаются в поток вывода, что избавляет от необходимости явного обращения к out .

      7.4 session

      Это объект типа HttpSession , связанный с запросом. Сессии создаются автоматически, и эта переменная существует даже если нет ссылок на входящие сессии. Единственным исключением является ситуация, когда вы отключаете использование сессий используя атрибут session директивы page (см. ). В этом случае ссылки на переменную session приводят к возникновению ошибок при трансляции JSP страницы в сервлет.

      7.5 application Это объект типа ServletContext полученный через использование метода getServletConfig().getContext() . 7.6 config Это объект типа ServletConfig для текущей страницы. 7.7 pageContext

      В JSP представлен новый класс PageContext для изолированного использования специфических особенностей сервера, таких как более эффективные JspWriter s. Идея заключается в том, что если вы обращаетесь к ним через этот класс а не непосредственно, ваш код может исполняться на "обычных" движках сервлет/JSP.

      7.8 page

      По сути является синонимом для this , и не нужен при работе с Java. Эта переменная создавалась с расчетом на перспективу, когда возможно появятся другие языки программированя скриптов, отличные от Java.

      8. Действия

      Действия JSP используют конструкции с синтаксисом XML для управления работой движка сервлета. Вы можете динамически подключать файл, многократно использовать компоненты JavaBeans, направить пользователя на другую страницу или сгенерировать HTML для Java plugin. Допустимо применение следующих действий:

      Все эти действия детально рассмотрены далее. Помните что как и во всем XML, имена элементов и атрибутов регистрозависимы. 8.1 Действие jsp:include Это действие позволяет вам вставлять файлы в генерируемую страницу. Синтаксис действия: package hall; public class SimpleBean { private String message = "Текст сообщения не задан"; public String getMessage () { return(message); } public void setMessage (String message) { this.message = message; } } 8.3 Еще несколько деталей о использовании jsp:useBean

      Простейший способ использовать bean - это использование конструкции

      для загрузки bean, а затем использовать jsp:setProperty и jsp:getProperty для модификации и получения его свойств. Однако существуют еще два других способа. Во-первых, вы можете использовать формат контейнера, а именно:

      Тело

      для того чтобы обеспечить выполнение Тела только в том случае, если экземпляр bean создается впервые, а не тогда, когда находится и используется уже существующий bean. Как обсуждается далее, beans могут совместно использоваться, поэтому не каждое выражение jsp:useBean приводит к созданию экземпляра нового bean. Во-вторых, кроме id и class , существуют еще три других атрибута, которые вы можете использовать: scope , type , и beanName . Эти атрибуты описаны в следующей таблице.

      Атрибут Применение
      id Дает имя переменной, которая ссылается на bean. Если удается найти bean с теми же самыми значениями id и scope, то вместо создания нового экземпляра используется ранее созданный объект.
      class Задает полное имя пакета bean.
      scope Задает область, в которой bean должен быть доступен. Может принимать четыре допустимых значения: page , request , session и application . По умолчанию принимает значение page , означающее что bean доступен только на текущей странице (размещается в PageContext текущей страницы). Значение request означает что bean доступен только для текущего запроса клиента (размещается в объекте ServletRequest). Значение session означает что объект доступен всем страницам на протяжении жизни текущей HttpSession . И, наконец, значение application означает что он доступен всем страницам, использующим тот же самый ServletContext . Причина необходимости этого атрибута заключается в том что jsp:useBean приводит к созданию нового экземпляра объекта в том случае, если нет уже существующего объекта с тем же id и scope . Иначе используется уже существующий объект, и все элементы jsp:setParameter или любые другие между тэгами jsp:useBean игнорируются.
      type Указывает тип переменной, которая ссылается на объект. Долже совпадать с именем класса, суперкласса или реализуемого интерфейса. Запомните что имя переменной задается через атрибут id .
      beanName Дает имя bean, которое будет использовано методом instantiate . Можно задать type и beanName , и опустить атрибут class .
      8.4 Действие jsp:setProperty

      Вы можете использовать jsp:setProperty для присвоения значений свойствам ранее описанных beans. Вы можете делать это двумя способами. Во-первых, вы можете использовать jsp:setProperty после, но вне элемента jsp:useBean , так как это показано в примере:

      ...

      В этом случае jsp:setProperty выполняется независимо от того, был ли найден существующий bean или был создан новый экземпляр. Другим вариантом заключается в размещении jsp:setProperty в теле элемента jsp:useBean , как это показано в другом примере:

      ...

      При этом jsp:setProperty выполняется лишь в том случае, если был создан новый экземпляр объекта, а не тогда, когда находится уже существующий.

      Действие jsp:setProperty допускает применение следующих четырех атрибутов:

      Атрибут Применение
      name Этот обязательный атрибут служит для задания bean, свойства которого будут устанавливаться. Элемент jsp:useBean должен предшествовать использованию элемента jsp:setProperty .
      property Этот обязательный атрибут устанавливает свойство, которое вы хотите установить. Однако существует частный случай: значение "*" означает что все параметры запроса, чьи имена совпадают с именами свойств bean будут переданы соответствующему методу установки свойств.
      value Этот необязательный атрибут устанавливает значение свойства. Строковые значения автоматически преобразуются в числовые, boolean , Boolean , byte , Byte , char и Character с использованием стандартного метода valueOf соответствующего класса. Например, значение "true" для свойства boolean или Boolean будет конвертированно при помощи метода Boolean.valueOf , а значение "42" для свойства int или Integer будет конвертированно при помощи метода Integer.valueOf . Вы не можете одновременно использовать атрибуты value и param , но можете вообще их не использовать. Ознакомьтесь с описанием атрибута param , которое представлено ниже.
      param Этот необязательный атрибут устанавливает параметр запроса, используемый для получения свойства. Если в текущем запросе этот параметр отсутствует, никаких действий не происходит: система не передает значение null методу устанавливающему свойства. Таким образом, допустимо использование в bean свойств по умолчанию, переопределяя их лишь в том случае если этого требуют параметры запроса. Например, следующий фрагмент означает следующее: "установить свойство numberOfItems в соответствии со значением параметра запроса numItems , а если такой параметр в запросе отсутствует - никакие действия не выполняются." Если вы не используете ни value, ни param , это приравнивается к тому, как если бы вы задали имя param совпадающее с именем property . Вы можете применить этот принцип автоматического использования свойств запроса, чьи имена совпадают с именами свойств и пойти далее, задав в качестве имени свойства "*" и опустив параметры value и param . В этом случае сервер обработает допустимые свойства и параметры запроса, на предмет совпадения их с идентичными именами.
      Далее приведен пример в котором используется bean для создания таблицы простых чисел. Если существует параметр numDigits в данных запроса, он передается в свойство bean numDigits . Аналогично для numPrimes . JspPrimes.jsp

      Для того чтобы скачать исходник JSP, щелкните правой кнопкой мыши на ссылке на исходный код . Вы можете также скачать исходный код для NumberedPrimes bean на который ссылается элемент jsp:useBean . Просмотрите каталог исходных кодов для других классов Java используемых в NumberedPrimes . Лучший способ опробовать это в сети - начать с HTML страницы, которая является внешним интерфейсом .

      Многократное использование JavaBeans в JSP

      Многократное использование JavaBeans в JSP

      Несколько символьных простых чисел:

      8.5 Действие jsp:getProperty

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

      ...

      • Количество предметов:
      • Цена за штуку:

      8.6 Действие jsp:forward

      Это действие позволяет вам передать запрос другой странице. Оно использует один атрибут, page , который должен содержать относительный URL. Ей может быть как статическое значение, так и вычисляемое в процессе запроса, что и показано на следующих двух примерах:

      8.7 Действие jsp:plugin

      Это действие позволяет вам вставить элемент OBJECT или EMBED (в зависимости от типа используемого броузера), необходимый для запуска апплетов, использующих plugin Java.

      9. Комментарии и символы цитирования

      Ниже приведены несколько конструкций, которые вы можете использовать в тех случаях, когда требуется вставить комментарий или использовать символы, зарезервированные для данного тэга:

      Синтаксис Назначение

      Страницы JSP имеют комбинированный синтаксис: объединение стандартного синтаксиса, соответствующего спецификации HTML, и синтаксиса JSP, определенного спецификацией Java Server Pages. Синтаксис JSP определяет правила записи страниц JSP, состоящих из стандартных тегов HTML и тегов JSP.

      Страницы JSP, кроме HTML-тегов, содержат теги JSP следующих категорий:

      JSP директивы

      JSP директивы обеспечивают глобальную информацию, касающихся конкретных запросов, направляемых в сервер, и предоставляют информацию, необходимую на стадии трансляции. Директивы всегда помещаются в начале JSP-страницы до всех остальных тегов, чтобы parser (анализатор) JSP при разборе текста в самом начале выделил глобальные инструкции. Таким, образом, JSP Engine (среда исполнения JSP), анализируя код, создает из JSP сервлет. Директивы представляют собой сообщения контейнеру JSP.

      Синтаксис JSP директив выглядит следующим образом:

      Синтаксис задания директив на XML:

      JSP директива может иметь несколько атрибутов. В этом случае директива может быть повторена для каждого из атрибутов. В то же время пары "имяАтрибута=значение" могут располагаться под одной директивой с пробелом в качестве разделителя.

      Существует три типа директив:

      • page (страница)
      • taglib (библиотека тегов)
      • include (включить)
      JSP директива page

      JSP директива page определяет свойства страницы JSP, которые воздействуют на транслятор. Порядок следования атрибутов в директиве page не имеет значения. Нарушение синтаксиса или наличие нераспознанных атрибутов приводит к ошибке трансляции. Примером директивы page может служить следующий код:

      Директива page объявляет, что данная страница JSP не использует буферизацию, что возможно одновременное обращение к данной странице JSP многих пользователей, и что поддерживается страница ошибок с именем error.jsp .

      JSP директива page может содержать информацию о странице:

      Список возможных атрибутов директивы page представлен в таблице.

      Наименование атрибута Значение Описание
      language Строка Определяет язык, используемый в скриптлетах файла JSP, выражениях или любых включаемых файлах, в том числе, в теле оттранслированного кода. По умолчанию принимается значение "java"
      extends Строка Задает суперкласс для генерируемого сервлета. Этот атрибут следует использовать с большой осторожностью, поскольку возможно что сервер уже использует какой-нибудь суперкласс
      import Строка Определение импортируемых пакетов., например:


      Мы можем оповещать вас о новых статьях,
      чтобы вы всегда были в курсе самого интересного.