Синтаксис страницы JSP. Java Server Page. Введение

Example и JSTL Example . Отметим, что Tomcat – название программного сервера , варианта сервера apache , который автоматически конфигурируется и запускается при выполнении примеров, а example означает "пример". Большим достоинством среды NetBeans является то, что оригиналы всех примеров, открываемых в NetBeans, остаются в неприкосновенности – автоматически создаются копии примеров. Поэтому даже если вы внесете исправления в исходный код проекта с примером, это не повлечет изменений в новом проекте с таким же примером.

Для правильной работы серверных примеров требуется, чтобы на компьютере была установлена работа с Интернет . Реально выходить в Интернет не надо, идет соединение http://localhost:8084// . Но после запуска другого серверного приложения идет соединение по тому же адресу, поэтому документ берется из буфера – и показывается документ, созданный предыдущим приложением. Для показа правильного документа требуется нажать в браузере кнопку "обновить" , и в случае автономной работы в появившемся диалоге, предлагающем выбрать режим работы, выбрать "Подключиться" . Реального соединения с Интернет для адреса http://localhost:8084// не будет – все коммуникации станут проходить локально.

Первый из примеров иллюстрирует базовые конструкции JSP , его можно просмотреть, создав проект File/New Project…/ Samples/J2EE1.4/ Web /Tomcat JSP Example .

Второй пример – надстройка над JSP , специальный набор тегов JSP , разработанный группой экспертов для облегчения разработки серверных приложений . Пример можно просмотреть, создав проект File/New Project…/ Samples/J2EE1.4/Web / JSTL Example .

Порядок примеров в мастере создания приложений прямо противоположный рассматриваемому нами - сначала предлагается использовать JSTL как наиболее развитое средство, затем – JSP как средство более низкого уровня, и только затем Servlet – как средство еще более низкого уровня. Мы используем при рассмотрении обратный порядок, так как JSP использует сервлеты , а JSTL является надстройкой над JSP .

Рассмотрим подробнее первый пример.

Как и в предыдущем случае, при нажатии на гиперссылку "Execute" выполняется соответствующий пример – в данном случае запускается страница JSP . А при нажатии гиперссылки Source показывается HTML -страница с примерным видом исходного кода.

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

Например, выражение вида ${1 + 2} выдаст в соответствующее место документа символ 3. Последовательность \$ означает, что выражение ${…} не вычисляется, а рассматривается как строка.

Имеется ряд встроенных в JSP тегов (объектов Java ):

  • request – запрос. Тип объекта - класс, реализующий интерфейс javax. servlet .http.HttpServletRequest .
  • response – ответ на запрос. Тип объекта - класс, реализующий интерфейс javax. servlet .http.HttpServletResponce .
  • pageContext – контекст страницы JSP . Обеспечивает доступ к пространству имен и элементам страницы (тегам, атрибутам). Тип объекта - класс javax. servlet . jsp .PageContext .
  • session – сессия (сеанс связи клиента с сервером). Тип объекта - класс, реализующий интерфейс javax. servlet .http.HttpSession
  • application – приложение. Тип объекта - класс, реализующий интерфейс javax. servlet .ServletContext
  • out – выходной поток. Тип объекта - класс javax. servlet . jsp .JspWriter
  • config – объект конфигурации сервлета для текущей страницы. Тип объекта - класс, реализующий интерфейс javax. servlet .ServletConfig
  • page – объект, обрабатывающий запрос для данной страницы. Тип объекта - класс Object .

Данные объекты применяются в виде

Пример их использования:

Имеется возможность задания сценариев (интерпретируемого кода) с помощью специальных определений вида

Где код - сценарий Java для работы с документом или вычислений. Например,

Так делается в примере использования оператора out в JSTL Example . Используется пользовательский объект c (сокращение от customer - " покупатель "), задаваемый как prefix ="c", и оператор out , заданный в библиотеке taglib по адресу uri ="http://java.sun.com/jsp/jstl/core ":

Отметим, что соответствующие библиотеки уже добавлены в проект. Для примера out это пакет org. apache .taglibs.standard.tag.el.core .

После запуска данного приложения в появившемся документе в списке Examples это первый пример - General Purpose Tags. При переходе по данной гиперссылке мы получаем пример


Рис. 10.6.

При нажатии на "шестеренки" получаем результат работы программы:


Рис. 10.7.

Соответствующий фрагмент исходного кода этого JSP -документа выглядит так:

no cell phone specified

В этом примере используется объект customer – " покупатель ", заданный в файле Customer . java , расположенном в пакете org. apache .taglibs.standard.examples. beans . То есть самом первом в Source Packages пакете примера. А также объект customers – "покупатели", заданный в файле Customers. java , расположенном в том же пакете.

В классе customer заданы поля lastName , phoneHome, phoneCell и другие. А также ряд методов, которые также можно вызывать в сценарии. С помощью оператора forEach (заданного аналогично оператору out ) осуществляется перебор всех объектов customer , агрегированных в объект customers - список покупателей. А с помощью тега c:out осуществляется вывод необходимой информации в документ.

В JSP имеется огромное количество возможностей. Это тема для отдельной книги. В данном учебном пособии данная технология затронута совсем немного – просто в порядке информирования о ее существовании и некоторых возможностях.

Точно так же, для программирования в локальных и глобальных компьютерных сетях в пакете java . net имеется огромное количество средств разного уровня, описание которых требует отдельной книги. Это и Web -адресация (классы URL, HttpURLConnection, URI, JarURLConnection, URLClassLoader ), и IP-адресация (классы InetAddress, InetAddress4, InetAddress6, NetworkInterface), и управление соединениями через сокеты (классы Socket, SocketAddress, InetSocketAddress, ServerSocket, SocketPermission ). Классы NetPermission , Authentificator и PasswordAuthentification обеспечивают поддержку авторизации ( запрос и обработку имени и пароля).

Кроме упомянутых возможностей пакета java . net имеется

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 (

      < / body >

      < / html >

      Как видите наш HTML-файл представляет из себя смесь тэгов для HTML и кода на Java. По сути JSP при первом обращении преобразуется в сервлет и работает уже как сервлет. Это очень важно понять. JSP НЕ ЯВЛЯЕТСЯ страницей наподобие HTML-страницы — начинающему програмисту важно четко осознавать, что это еще один сервлет — просто его вывод не надо программировать. Его можно просто нарисовать. И в нужные места подставить данные. Но т.к. JSP-страница хоть как-то напоминает HTML, то дизайнеру явно будет проще. И я еще раз НАСТОЙЧИВО говорю начинающим — JSP является СЕРВЛЕТОМ. Ее подготовка со всеми данными происходит на сервере. Именно там подставляются все данные. А пользователю в броузер приходит уже готовая HTML-страница, на которой никаких признаков JAVA нет. Разве что апплет какой-нибудь — но это уже совсем другая технология. Просто JSP удобно использовать — вы делаете логику получения данных в одном сервлете (который не выглядит как JSP) и потом передаете данные другому сервлету (на этот раз в виде JSP), задача которого с помощью этих данных нарисовать HTML-страничку. Только рисовать надо не так много. К тому же вам не надо перекомпилировать классы JSP. Можно просто заменить JSP на более современную и она автоматичски будет скомпилирована заново. Что в общем-то достаточно удобно — просто скопировали нужную страничку на место старой. Как можно видеть код Java заключается в угловые скобки со знаком процента « WEB - INF

      classes

      students

      HelloWorldServlet . class

      Web . xml

      Hello . jsp < / strong >

      Уже известный файл web.xml будет выглядеть точно так же, как и в предыдущей части

      hello hello /hello

      < ! DOCTYPE web - app PUBLIC "-//Sun Microsystems, Inc.//DTD

      Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >

      < web - app >

      < servlet >

      < servlet - name > hello < / servlet - name >

      < servlet - class > students . web . HelloWorldServlet < / servlet - class >

      < / servlet >

      < servlet - mapping >

      < servlet - name > hello < / servlet - name >

      < url - pattern > / hello < / url - pattern >

      < / servlet - mapping >

      < / web - app >

      Запускаем Tomcat и потом попробуйте вызвать наше приложение по URL
      http://localhost:8080/studentsApp/hello

      Если же хотите увидеть мое имя используйте такой URL
      http://localhost:8080/studentsApp/hello?name=Anton
      Свое имя можно подставить потом 🙂

      Custom Tag

      Теперь мы можем окунуться немного глубже в JSP. Как вы уже наверняка заметили JSP представляет собой эдакую смесь Java-кода и тэгов HTML. При увеличении сложности логики представления (а JSP используется именно в качестве представления – но даже представление может иметь достаточно изощренную логику – цвета, шрифты и прочая) страница из более-менее понятного HTML превращается в «макароны по-флотски». И дизайнер уже не будет способен что-либо понять. Абсолютно избавиться от логики в JSP скорее всего не получится, но как-то «причесать» код и использовать более удобные средства – такое решение существует. И оно называется CustomTags. По сути это упрощение конструкций JSP, которого хотелось достичь.

      Давайте рассмотрим несложный пример того, как можно написать и задействовать свой собственный тэг. Для этого нам потребуется три шага:

    • Написать TLD-файл (Tag Library Definition) – файл описателя библиотеки тэгов.
    • Написать класс для реализации самого тэга
    • Исправить HTML-файл
    • Итак. Файл TLD имеет расширение.tld и обычно развертывается внутри каталога WEB-INF в каталоге вашего приложения. Хотя можно разместить и в другом. Если у вас много таких файлов, то для них можно предусмотреть отдельный каталог. Вот наш вариант hello.tld.

      1.0 1.2 Sample Tag Library /SimpleTagLibrary Example of tag for HelloWorld hello students.web.tag.HelloTag empty Hello World Tag example name false true

      < taglib xmlns = "http://java.sun.com/xml/ns/j2ee"

      xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance"

      xsi : schemaLocation = "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

      version = "2.0" >

      < tlib - version > 1.0 < / tlib - version >

      < jsp - version > 1.2 < / jsp - version >

      < short - name > Sample Tag Library < / short - name >

      < uri > / SimpleTagLibrary < / uri >

      < description >

      Example of tag for HelloWorld

      < / description >

      < tag >

      < name > hello < / name >

      < tag - class > students . web . tag . HelloTag < / tag - class >

      < body - content > empty < / body - content >

      < description >

      Hello World Tag example

      < / description >

      < attribute >

      < name > name < / name >

      < required > false < / required >

      < rtexprvalue > true < / rtexprvalue >

      < / attribute >

      < / tag >

      < / taglib >

      Как вы наверно заметили из описания тэг – это класс HelloTag. Именно он отвечает за отображение информации. Давайте напишем его.

      package students.web.tag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.tagext.TagSupport; public final class HelloTag extends TagSupport { private String name = null; public int doStartTag() throws JspException { try { if (name == null) { pageContext.getOut().write("Hello, world!"); } else { pageContext.getOut().write("Hello, world! I"m " + name); } } catch (IOException ioe) { throw new JspTagException(ioe.getMessage()); } return SKIP_BODY; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void release() { super.release(); name = null; } }

      package students . web . tag ;

      import java . io . IOException ;

      import javax . servlet . jsp . JspException ;

      import javax . servlet . jsp . JspTagException ;

      import javax . servlet . jsp . tagext . TagSupport ;

      public final class HelloTag extends TagSupport {

      private String name = null ;

      public int doStartTag () throws JspException {

      try {

      if (name == null ) {

      pageContext . getOut () . write ("Hello, world!" ) ;

      } else {

      pageContext . getOut () . write ("Hello, world! I"m " + name ) ;

      } catch (IOException ioe ) {

      throw new JspTagException (ioe . getMessage () ) ;

      return SKIP_BODY ;

      public String getName () {

      return name ;

      public void setName (String name ) {

      this . name = name ;

      public void release () {

      super . release () ;

      name = null ;

      }

      }

      Для сборки нашего сервлета и нового тэга нам потребуется более сложная строка

      javac –cp .;servlet-api.jar;jsp-api.jar students\web\*.java students\web\tag\*.java

      Новую библиотеку jsp-api.jar можно взять там же где и servlet_api.jar – в \common\lib. Теперь, чтобы подключить наш тэг к приложению, необходимо прописать нашу библиотеку в файле web.xml

      Welcome to Students personnel Welcome to Students personnel Hello students.web.HelloWorldServlet Hello /hello http://www.someurl.ru /WEB-INF/hello.tld

      < web - app >

      < display - name > Welcome to Students personnel < / display - name >



    Есть вопросы?

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам: