Работа с JSP Standard Tag Library (JSTL)

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

Нужен за тем же, зачем используются usebean, ELчтобы легче страницу было разрабатывать дизайнеру.


Подключение JSTL

Для начала нужно подключить JSTL библиотеку. Для этого нужно скачать файл jstl-1.2.jar. Его довольно легко найти в интернете.

И после этого нужно поместить его в папку lib в папке WEB-INF.

Теперь нужно подключить библиотеку в самом jsp файлике с помощью <%@%> тега.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> EL JSP

Простейшие теги JSTL

Для примера приведем тег цикла c:forEach. Аналог Java циклов for, while. foreach.

Пример программы:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> JSTL JSP ${listelement} ${i}

Как видим, JSTL теги используются в паре с EL выражениями.

Вывод:

Как видим, первый цикл вывел все элементы списка в аттрибуте, а второй цикл вывел числа от 1 до 5.          

Search Icon

Другие простейшие теги типа c:if(условие), c:choose, c:when, c:otherwise (аналог if else или switch), c:catch (перехват ошибок) рассматривать не будем они очень просты и легко гугляться.

Далее рассмотрим лишь самые интересные.


Тег c:out

Тег c:out используется для вывода информации на страницу.

Он выполняет ту же функцию, что и ранее изученные способы:

  • <%=”<h2>Hello!!</h2>”%>,
  • resp.getWriter().write(“<h2>Hello!!</h2>”)
  • или \${<h2>Hello!!</h2>}.

Но в случае c c:out тег h2 не воспримется (выведет на странице <h2>Hello!!</h2>). c:out более безопасен и перед выводом на страницу интерпретирует html теги в специальные символы. Поэтому можно без страха через него выводить данные введенные пользователем, не боясь, что он ввел какой-то html код, что может сломать страницу.

Пример программы:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> EL JSP <%="

Hello!!

“%> <% response.getWriter().write("

Hello!!

“); %> ${‘

Hello!!

‘}

Видим, что при выводе с помощью c:out теги h2 воспринялись как часть строки. То есть html, при выводе с помощью c:out, не работает.


Тег c:import

Подобен include в сервлетах, но он также может добавлять на страницу не только данные на нашем сервере, а и вставить в нашу jsp сторонний url.

Пример программы:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> JSTL JSP before import after import

То есть сначала выведется всё, что было выше строки с import потом главная страница twitch, потом код после этой строки.

Видим, что сначала вывелось before import, потом страница twitch, потом after import.


Создание, удаление переменных.

С помощью JSTL можно создавать, удалять переменные.

Пример программы:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> JSTL JSP

Откроем страницу.

Видим, что результат выражения, который сохранился в переменную правильный.

После удаления же переменной, как видим, ничего не вывелось вторым c:out.


Аналог resp.encodeURL.

c:urlаналог resp.encodeURL, то есть преобразование адреса с добавлением JSESSIONID.

Также здесь можно увидеть добавление параметров с помощью c:param.

Пример программы:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> JSTL JSP ${fullURL}

Откроем страницу.

Видим, что при выключенных куках JSESSIONID успешно добавился и параметр со значением Carl тоже успешно добавился.


Тег c:forTokens.

С помощью c:forTokens можно разбить строку по какому-то символу и над каждым элементом разбитой строки выполнить какие-то действия. То есть очевидно, что это такой вид цикла.

Пример программы:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> JSTL JSP

Откроем страницу.


Тег c:redirect.

С помощью c:redirect можем перейти на сторонний ресурс, но при это можем еще вставить параметры в адресную строку.

Пример программы:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> JSTL JSP

Откроем страницу.

Видим в адресной строке вставленный в адрес параметр.

Expression Language (EL) в JSP

В прошлом уроке мы извлекали созданный в контроллере бин с помощью actioBean.

Чтобы для создания и получения бина не писать вот так:

<jsp:useBean id=”someuser” class=”com.someclasses.User” scope=”application”/>

<jsp:getProperty name=”someuser” property=”name”/>

извлекать атрибуты скоупов можно просто используя Expression language.

Изменим View из предыдущего урока вот таким образом:

EL JSP ${someuser.name}

Запускаем контроллер:

Он, опять таки, создает атрибут с именем someuser, в котором находиться объект класса User, извлеченный контроллером через модель.

Переходим на View и видим, что Expression Language сработал и вывелось имя из объекта в аттрибуте someuser:


Конкретный скоуп

По дефолту (как было выше) проверяются все атрибуты всех скоупов, пока не найдет someuser, но можно задать скоуп, в котором хотим искать. В нашем случае скоуп контекста (applicationScope)

Пример программы:

EL JSP ${applicationScope.someuser.name}

Вывод такой же:


Другие возможности EL

Также с помощью EL можно делать много чего другого. Смотри пример.

Изменим контроллер:

import com.someclasses.*; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.util.*; @WebServlet(“/MVC_Controller”) public class MVC_Controller extends HttpServlet { MVC_Model model = new MVC_Model(); protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //Создадим список List arrlist = new ArrayList<>(); //Добавим туда пару значений arrlist.add(“FirstStr”); arrlist.add(“

Hello!!

“); //Добавляем список в атрибут контекста //и он будет доступен на View. С этим списком //можно будет работать с помощью EL req.getServletContext().setAttribute(“arrlist”,arrlist); Cookie cokie = new Cookie(“name”,”Jonny”); //Этот cookie извлечен на view с помощью EL resp.addCookie(cokie); } }

Изменим View:

EL JSP ${arrlist[1]} ${((3+7) == 10) && ((8+1) == 10)} ${cookie.name.value}

Откроем страницу контроллера:

Откроем View:


Отключение EL на странице

С помощью <%@ page isELIgnored="false"%> можно отключить все EL выражения на странице.

Поставив перед конкретным EL выражением "\\" можно отключить какое либо конкретное EL выражение

Пример программы:

<%@ page isELIgnored="false"%> EL JSP \${arrlist[1]}

Ясное дело, если мы откроем эту страницу, на ней ничего не будет.

Example

Выводы:

После изучения MVC теперь можно лучше понять зачем нужны jsp.

Java код на jsp страницах использовать крайне не рекомендуется.

Java код лучше пусть используется в контроллере.

На View используются только экшн теги, EL и еще стандартная библиотека тегов jsp, о них позже. Эти инструменты лучше понятны html разработчику, который делает View, а java код разработчику контроллера

Паттерн MVC в веб-разработке на Java

MVCMODEL, VIEW, CONTROLLER. Популярная архитектура построения приложений. Нужно знать.

  • CONTROLLER – сервлет для взаимодействия между клиентом, MODEL и VIEW.
  • VIEW – страница, которая видна пользователю – jsp.
  • MODEL – класс для извлечения информации из ресурса (БД например) или добавления в него информации (иногда этот класс отождествляют с ресурсом)).

Клиент может передавать какие либо данные в CONTROLLER через VIEW, то есть через страницу, которую клиент видит.

Также клиент может получать данные на VIEW из CONTROLLER. То есть всё, что клиент видит на VIEW, получено из CONTROLLER.

Откуда же CONTROLLER берет данные, которые он отсылает на VIEW и куда CONTROLLER отсылает данные присланные в него клиентом?

CONTROLLER получает данные из ресурса c помощью MODEL и отправляет их клиенту на VIEW, а когда клиент отсылает данные в CONTROLLER, то CONTROLLER с помощью MODEL отправляет их в ресурс для сохранения их там.

Давайте создадим класс модели, класс контроллера и jsp страницу вью. В качестве ресурса для упрощения пусть будет простой объект User, а не БД или что либо еще.


Model

Для начала, создадим небольшой класс User, объект которого будет ресурсом:

package com.someclasses; public class User{ private String name; public void setName(String name){ this.name=name; } public String getName(){ return name; } }

Код класса модели, который извлекает данные из ресурса:

package com.someclasses; public class User{ private String name; public void setName(String name){ this.name=name; } public String getName(){ return name; } }

Видим, что Model возвращает user, то есть объект-ресурс.


Controller

Создадим контроллер, который будет через модель извлекать объект-ресурс user и отправлять его на View клиенту.

Пример программы:

import com.someclasses.*; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(“/MVC_Controller”) public class MVC_Controller extends HttpServlet { MVC_Model model = new MVC_Model(); protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getServletContext().setAttribute( “someuser”, model.getUser()); } //С помощью бина можем на View извлеч только //что созданный аттребут вот таким образом: // }

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


View

Теперь на View, то есть странице, которую видит клиент с помощью actionBean извлекаем данные ресурса положенные в контекст в контроллере:

MVC JSP

Проверка работы созданной MVC архитектуры.

Теперь запустим контроллер:

Он через модель извлечет данные ресурса и поместит их в аттрибут контекста, чтобы вью мог их отобразить

Откроем теперь вью:

Очевидно созданная архитектура работает корректно.

Что такое actionBeans в JSP?

Мы рассмотрели action теги invoke и forward.

Среди часто употребляемых еще есть useBean, setProprety, getProprety.

Бин – это объект обычного класса с конструктором, полями и геттерами, сеттерами для них.

  • useBean – создать экземпляр класса (бин).
  • setProprety – задать значение полю экземпляра.
  • getProprety – получить значение поля экземпляра

Для начала создадим простой класс в папке helloservlet/WEB-INF/classes/com/someclasses на основе которого будет создаваться бин:

package com.someclasses; public class User{ private String name; public void setName(String name){ this.name=name; } public String getName(){ return name; } }

Создадим бин, присвоим его полям значения и выведем содержимое полей этого бина:

ActionBeans JSP <% //User someuser1 = new User(); //someuser1.setName(John); //someuser1.getName(); %>

Откроем страницу:

Видим, что на странице с помощью getProperty было извлечено содержимое поля name объекта someuser1.


Зачем нужны actionBeans

Чем же useBean лучше чем просто создать экземпляр класса и задавать и получать значения через геттер сеттер?

Есть ряд преимуществ.

Основным моментом является то, что можно задавать область видимости бина.

Страница, на которой создается бин в области видимости контекста:

ActionBeans JSP