Даний матеріал присвячений JSP в Java. В матеріалі про Servlet, ми вже бачили роботу простого JSP файлу. Сьогодні спробуємо розібратися з технологією більш детально.
JSP (Java server pages) – це технологія, яка дозволяє впроваджувати Java-код, а також EL (expression language) у статичний вміст сторінки і дозволяє веб-розробникам динамічно генерувати HTML, XML та інші веб-сторінки. JSP є складовою єдиної технології створення бізнес-додатків J2EE.
JSP – може виконуватися практично на будь-якому веб-сервері, так як ця технологія заснована на мові програмування Java, яка не залежить від платформи. Java server pages підтримує теги HTML, Javascript, а також власний набір тегів.
JSP – дозволяє відокремити динамічну частину сторінки від статичної. Ця технологія передбачає вставку Java коду у сторінку. Однак ми не будемо розглядати такий варіант використання JSP, оскільки ця технологія вважається застарілою і недосконалою.
Причина проста: розробники дизайнери, які розробляють зовнішній вигляд сторінки не завжди можуть бути знайомі з Java і це може викликати додаткові труднощі при редагуванні або підтримці веб-додатків.
Замість вставки Java коду зараз використовується EL, бібліотека тегів jstl або Javascript. Ми розглянемо приклад з Expression Language (EL) і jstl тегами. Це дуже зручна бібліотека, яка має майже весь функціонал, який необхідний для створення динамічних сторінок. Якщо потрібно щось специфічне, завжди можна написати власний тег і вставити його вміст на сторінку.
Директиви JSP
Основна частина JSP сторінки це HTML, до якого додаються теги з динамічним вмістом.
Директива JSP – це повідомлення, яке сторінка може надіслати відповідному контейнеру із зазначенням дій. Синтаксис директиви:
<%@ директива атрибут=“значення” %>
Є три основні типи директив:
- page (може використовуватись для імпорту класів);
- include (дає вам можливість вставити файл до класу сервлета при трансляції JSP файлу в сервлет);
- taglib (дозволяє підключити бібліотеку тегів).
Так як код в сторінку ми не вставлятимемо, розглянемо останні дві директиви.
Include використовується коли наприклад у нас є сторінки, які будуть мати однакову верхню та нижню частину. Дуже поширений шаблон, у якому футер і хедер однакові для всіх сторінок.
Для того, щоб не писати код цих сторінок у кожному JSP файлі, можна винести їх в окремі файли і потім підключити в потрібному нам місці за допомогою директиви include.
За допомогою taglib ми можемо підключати сторонні бібліотеки. Наприклад бібліотеку jstl тегів. Або власні теги.
За допомогою цієї директиви можна підключити бібліотеку власних тегів:
<%@taglib uri=”/WEB-INF/mylib.tld” prefix=”test” %>.
Зауважте, що важливим атрибутом taglib є prefix. Це обов’язковий для використання атрибут. За допомогою prefix можна викликати бібліотеку в коді JSP. Ім’я prefix можна вибирати будь-яке.
Приклад JSP
Щоб довго не втомлювати вас теорією, я пропоную розглянути приклади всього що ми вивчили вище.
В прикладі я використовую бібліотеку JSTL. Тому перш за все потрібно додати її до наших залежностей в pom.xml.
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
Далі нам потрібно буде використовувати Expression Language (EL) для відображення інформації на JSP. Нам також буде потрібно підключати статичні ресурси до дашого додатку. Такі як стилі CSS, картинки і т.д. Тому нам необхідно додати до нашого проекту web.xml файл.
В ньому буде міститися перенаправлення запитів статичних ресурсів на default servlet. Це такий сервлет за замовчуванням від Apache Tomcat, який обслуговує статичні ресурси.
Розмістити файл web.xml потрібно в директорії WEB-INF:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Archetype Created Web Application</display-name>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/resources/*</url-pattern>
<!--папка де будуть розміщені статичні ресурси: картинки, css стилі і тд-->
</servlet-mapping>
</web-app>
Тепер, коли ми маємо всі налаштування, можемо створити наші JSP сторінки і написати логіку для відображення цих сторінок через Java Servlet.
Для того, щоб побачити як можна виводити на JSP колекцію обʼєктів Java, я створив простий клас BookModel. В ньому будуть знаходитись поля з типом рядок і ціле число.
package org.example.model;
public class BookModel {
private Integer number;
private String title;
private String author;
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "BookModel{" +
"number=" + number +
", title='" + title + '\'' +
", author='" + author + '\'' +
'}';
}
}
Тепер в моємо сервлеті я пишу логіку для того, щоб створювати книги і передавати книги на JSP.
package org.example.controller;
import org.example.model.BookModel;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/") //анотація яка вказує який шлях буде слухати сервлет
public class HomeServlet extends HttpServlet {
static List<BookModel> books = new ArrayList<>();
static {
books.add(createBook());
books.add(createBook());
books.add(createBook());
books.add(createBook());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//logic for get method
String path = req.getRequestURI();//дістаю шлях урл через даний метод
System.out.println(path);
if (path.equals("/")) {
req.getRequestDispatcher("/hi.jsp").forward(req, resp);//перенаправлення запиту на hi.jsp сторінку
} else if (path.equals("/info")) {
String username = req.getParameter("username");//отримання параметру з запиту
req.setAttribute("username", username);//використовую setAttribute щоб передати атрибут на jsp
req.setAttribute("books", books);//передавати можна колекцію
req.getRequestDispatcher("/info.jsp").forward(req, resp);//перенаправлення запиту на info.jsp сторінку
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//logic for post method
String path = req.getRequestURI();
if (path.equals("/createBook")) {
BookModel bookModel = new BookModel();
bookModel.setNumber(Integer.valueOf(req.getParameter("number")));
bookModel.setTitle(req.getParameter("title"));//використовую метод getParameter
// щоб діставати поля форм з JSP
bookModel.setAuthor(req.getParameter("author"));
books.add(bookModel);
resp.sendRedirect("/info");//використовую sendRedirect щоб перенаправити запит на /info сторінку
}
}
private static BookModel createBook() {
BookModel bookModel = new BookModel();
bookModel.setTitle("MyBook" + Math.random());
bookModel.setAuthor("BookAuthor" + Math.random());
bookModel.setNumber((int) (Math.random() * 100));
return bookModel;
}
}
Тепер, коли я написав логіку отримання і передачі даних на JSP сторінку, я можу використати EL для відображення простого атрибуту. Також я можу використати jstl для відображення списку.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<link type="text/css" href="resources/styles.css" rel="stylesheet">
<title>My first app</title>
</head>
<body>
<h2>Hi: ${username}</h2>
<a href="/">Navigate main</a>
<table>
<tr>
<th>Number</th>
<th>Title</th>
<th>Author</th>
</tr>
<c:forEach items="${books}" var="book">
<tr>
<td>${book.number}</td>
<td>${book.title}</td>
<td>${book.author}</td>
</tr>
</c:forEach>
</table>
<p>Create new book</p>
<form method="post" action="createBook">
<input name="number" placeholder="Please enter book number">
<input name="title" placeholder="Please enter book title">
<input name="number" placeholder="Please enter book number">
<input type="submit" value = "Create book">
</form>
<jsp:include page="components/footer.jsp"/>
</body>
</html>
Код до домашньої сторінки наступний:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
<h2>Hi there</h2>
<p>Please enter your username below</p>
<form method="get" action="info">
<input name="username" placeholder="username">
<input type="submit" value="Navigate to info page">
</form>
<jsp:include page="components/footer.jsp" />
</body>
</html>
Зверніть увагу, я використовую jsp:include щоб включити футер сторінку. Її код виглядає наступним чином:
<div>
<p>Powered by Antitutor</p>
</div>
Щоб мої дані можна було красиво відобразити, я створив файл стилів і помістив його в директорію recourses яку попередньо перед цим створив.
Вся структура мого проєкту виглядає наступним чином.

Після запуску можна подивитись що з цього вийшло:


Це все, що стосується теми jsp java. Як бачите, використовуючи Java Server Pages, можна створювати повноцінні веб додатки на Java навіть без сторонніх фреймворків.

Залишити відповідь