Тарифы Услуги Сим-карты

Что такое jsp. Java Server Page. Введение

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 (