Home » Учебное руководство по JSP для начинающих
Учебное руководство по JSP для начинающих

Учебное руководство по JSP для начинающих

Представь, что ты системный администратор, который в очередной раз получил задачу настроить веб-приложение на Java. И снова всплывает эта аббревиатура — JSP. Кто-то скажет, что это уже устаревшая технология, но если ты работаешь с enterprise-средой или поддерживаешь legacy-системы, то JSP встречается постоянно. Сегодня разберём, как быстро поднять JSP-приложение на собственном сервере, не тратя время на изучение толстых мануалов. Покажу практические примеры, расскажу о подводных камнях и дам готовые решения для типовых задач.

Что такое JSP и почему это до сих пор актуально?

JSP (JavaServer Pages) — это технология для создания динамических веб-страниц на базе Java. По сути, это HTML с вкраплениями Java-кода, который выполняется на сервере. Главное преимущество — возможность встраивать логику прямо в разметку, что упрощает создание динамического контента.

В отличие от чистых сервлетов, где HTML генерируется программно, JSP позволяет писать разметку привычным способом, добавляя Java-код только там, где это необходимо. Это особенно удобно для быстрого прототипирования и создания админок.

Как работает JSP под капотом?

Когда пользователь запрашивает JSP-страницу, происходит следующее:

  • Сервер приложений (Tomcat, Jetty, etc.) транслирует JSP-файл в Java-сервлет
  • Компилирует получившийся код в байт-код
  • Выполняет скомпилированный сервлет
  • Отправляет результат в браузер как обычный HTML

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

Быстрая настройка JSP-окружения

Для работы с JSP потребуется веб-сервер с поддержкой Java. Проще всего использовать Apache Tomcat — он лёгкий, надёжный и отлично подходит для большинства задач. Если нужен более мощный сервер, можно взять VPS или выделенный сервер.

Установка и настройка Tomcat

На Ubuntu/Debian:

sudo apt update
sudo apt install openjdk-11-jdk
sudo apt install tomcat9 tomcat9-admin

# Запускаем Tomcat
sudo systemctl start tomcat9
sudo systemctl enable tomcat9

# Проверяем статус
sudo systemctl status tomcat9

На CentOS/RHEL:

sudo yum install java-11-openjdk-devel
sudo yum install tomcat tomcat-webapps tomcat-admin-webapps

sudo systemctl start tomcat
sudo systemctl enable tomcat

Создание первого JSP-приложения

Создадим простую структуру приложения:

mkdir -p /var/lib/tomcat9/webapps/myapp/WEB-INF
mkdir -p /var/lib/tomcat9/webapps/myapp/WEB-INF/classes
mkdir -p /var/lib/tomcat9/webapps/myapp/WEB-INF/lib

Создаём файл конфигурации web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    
    <display-name>My JSP App</display-name>
    
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    
</web-app>

И создаём первую JSP-страницу index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<!DOCTYPE html>
<html>
<head>
    <title>My First JSP</title>
</head>
<body>
    <h1>Hello JSP!</h1>
    <p>Текущее время: <%= new Date() %></p>
    
    <% 
        String userAgent = request.getHeader("User-Agent");
        if (userAgent.contains("Chrome")) {
            out.println("<p>Вы используете Chrome</p>");
        } else {
            out.println("<p>Ваш браузер: " + userAgent + "</p>");
        }
    %>
</body>
</html>

Синтаксис JSP: основные элементы

JSP использует специальную нотацию для встраивания Java-кода:

  • <% код %> — скриптлеты (обычный Java-код)
  • <%= выражение %> — выражения (выводят результат)
  • <%! декларация %> — декларации (методы и переменные класса)
  • <%-- комментарий --%> — комментарии JSP

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

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<html>
<body>
    <%! 
        private int counter = 0;
        
        public String formatNumber(int num) {
            return String.format("%03d", num);
        }
    %>
    
    <h1>Счётчик посещений</h1>
    <% counter++; %>
    <p>Вы посетитель номер: <%= formatNumber(counter) %></p>
</body>
</html>

Работа с формами и параметрами

Один из частых случаев — обработка форм. Создадим простую форму с валидацией:

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<html>
<body>
    <% 
        String name = request.getParameter("name");
        String email = request.getParameter("email");
        String message = "";
        
        if (name != null && email != null) {
            if (name.trim().isEmpty() || email.trim().isEmpty()) {
                message = "Все поля обязательны!";
            } else if (!email.contains("@")) {
                message = "Некорректный email!";
            } else {
                message = "Привет, " + name + "! Ваш email: " + email;
            }
        }
    %>
    
    <h1>Форма регистрации</h1>
    
    <% if (!message.isEmpty()) { %>
        <div style="color: red;"><%= message %></div>
    <% } %>
    
    <form method="post">
        <p>
            <label>Имя:</label>
            <input type="text" name="name" value="<%= name != null ? name : "" %>">
        </p>
        <p>
            <label>Email:</label>
            <input type="email" name="email" value="<%= email != null ? email : "" %>">
        </p>
        <p>
            <input type="submit" value="Отправить">
        </p>
    </form>
</body>
</html>

Использование JavaBeans и JSTL

Для более чистого кода лучше использовать JavaBeans и JSTL (JSP Standard Tag Library). Сначала создадим простой Bean:

// UserBean.java
package com.example.beans;

public class UserBean {
    private String name;
    private String email;
    private int age;
    
    public UserBean() {}
    
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    
    public boolean isAdult() {
        return age >= 18;
    }
}

И используем его в JSP:

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="user" class="com.example.beans.UserBean" scope="session"/>
<jsp:setProperty name="user" property="*"/>

<html>
<body>
    <h1>Пользователь</h1>
    
    <p>Имя: <jsp:getProperty name="user" property="name"/></p>
    <p>Email: <jsp:getProperty name="user" property="email"/></p>
    <p>Возраст: <jsp:getProperty name="user" property="age"/></p>
    
    <% if (user.isAdult()) { %>
        <p style="color: green;">Совершеннолетний</p>
    <% } else { %>
        <p style="color: red;">Несовершеннолетний</p>
    <% } %>
</body>
</html>

Практические примеры и кейсы

Пример 1: Простая админка для мониторинга сервера

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
    <title>Мониторинг сервера</title>
    <style>
        table { border-collapse: collapse; width: 100%; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
    </style>
</head>
<body>
    <h1>Системная информация</h1>
    
    <table>
        <tr><th>Параметр</th><th>Значение</th></tr>
        <tr><td>Время сервера</td><td><%= new Date() %></td></tr>
        <tr><td>Java версия</td><td><%= System.getProperty("java.version") %></td></tr>
        <tr><td>ОС</td><td><%= System.getProperty("os.name") %></td></tr>
        <tr><td>Всего памяти</td><td><%= Runtime.getRuntime().totalMemory() / 1024 / 1024 %> MB</td></tr>
        <tr><td>Свободно памяти</td><td><%= Runtime.getRuntime().freeMemory() / 1024 / 1024 %> MB</td></tr>
        <tr><td>Количество процессоров</td><td><%= Runtime.getRuntime().availableProcessors() %></td></tr>
    </table>
    
    <h2>Системные свойства</h2>
    <table>
        <tr><th>Свойство</th><th>Значение</th></tr>
        <%
            Properties props = System.getProperties();
            for (Object key : props.keySet()) {
                String keyStr = key.toString();
                String value = props.getProperty(keyStr);
        %>
        <tr><td><%= keyStr %></td><td><%= value %></td></tr>
        <% } %>
    </table>
</body>
</html>

Пример 2: Лог-вьювер

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
    <title>Просмотр логов</title>
    <style>
        .log-content { 
            background: #000; 
            color: #0f0; 
            padding: 10px; 
            font-family: monospace;
            white-space: pre-wrap;
            max-height: 500px;
            overflow-y: scroll;
        }
    </style>
</head>
<body>
    <h1>Просмотр логов</h1>
    
    <%
        String logFile = request.getParameter("file");
        if (logFile == null) logFile = "/var/log/tomcat9/catalina.out";
        
        int lines = 100;
        String linesParam = request.getParameter("lines");
        if (linesParam != null) {
            try {
                lines = Integer.parseInt(linesParam);
            } catch (NumberFormatException e) {
                lines = 100;
            }
        }
    %>
    
    <form method="get">
        <p>
            <label>Файл лога:</label>
            <input type="text" name="file" value="<%= logFile %>" size="50">
        </p>
        <p>
            <label>Количество строк:</label>
            <input type="number" name="lines" value="<%= lines %>" min="1" max="1000">
        </p>
        <p>
            <input type="submit" value="Показать">
        </p>
    </form>
    
    <div class="log-content">
    <%
        try {
            File file = new File(logFile);
            if (file.exists() && file.canRead()) {
                Process process = Runtime.getRuntime().exec("tail -n " + lines + " " + logFile);
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line;
                while ((line = reader.readLine()) != null) {
                    out.println(line);
                }
                reader.close();
            } else {
                out.println("Файл не найден или недоступен для чтения: " + logFile);
            }
        } catch (Exception e) {
            out.println("Ошибка при чтении файла: " + e.getMessage());
        }
    %>
    </div>
</body>
</html>

Типичные ошибки и как их избежать

Рассмотрим наиболее частые проблемы при работе с JSP:

Проблема Причина Решение
500 Internal Server Error Синтаксическая ошибка в JSP Проверить логи Tomcat в /var/log/tomcat9/
ClassNotFoundException Отсутствует необходимый JAR Добавить JAR в WEB-INF/lib
Кодировка текста Неправильная кодировка Добавить <%@ page pageEncoding=”UTF-8″%>
Сессии не работают Отключены cookies Использовать response.encodeURL()

Альтернативы JSP

Хотя JSP до сих пор используется, стоит знать и о современных альтернативах:

  • Thymeleaf — современный шаблонизатор для Spring Boot
  • Freemarker — мощный шаблонизатор с богатым функционалом
  • Velocity — лёгкий и быстрый шаблонизатор
  • Mustache — логикless шаблоны

Сравнение производительности:

Технология Скорость Память Сложность
JSP Высокая Средняя Низкая
Thymeleaf Средняя Высокая Средняя
Freemarker Высокая Низкая Средняя
Velocity Очень высокая Очень низкая Низкая

Оптимизация и производительность

Несколько советов для повышения производительности JSP-приложений:

  • Избегайте скриптлетов — используйте JSTL и Expression Language
  • Кэшируйте данные — используйте session или application scope
  • Оптимизируйте SQL-запросы — не выполняйте запросы в циклах
  • Используйте connection pooling — настройте JNDI DataSource
  • Сжимайте вывод — включите GZIP в Tomcat
  • Пример настройки сжатия в server.xml:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" 
               compression="on"
               compressionMinSize="2048"
               compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json"/>
    

    Интеграция с другими технологиями

    JSP отлично интегрируется с различными Java-фреймворками и библиотеками:

    • Spring MVC — для создания полноценных веб-приложений
    • Hibernate — для работы с базами данных
    • Apache Commons — полезные утилиты
    • Jackson — для работы с JSON

    Пример интеграции с базой данных через JNDI:

    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%@ page import="javax.sql.*,java.sql.*,javax.naming.*" %>
    <html>
    <body>
        <h1>Список пользователей</h1>
        
        <%
            try {
                Context ctx = new InitialContext();
                DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mydb");
                Connection conn = ds.getConnection();
                
                PreparedStatement stmt = conn.prepareStatement("SELECT id, name, email FROM users LIMIT 10");
                ResultSet rs = stmt.executeQuery();
        %>
        
        <table border="1">
            <tr><th>ID</th><th>Имя</th><th>Email</th></tr>
            <% while (rs.next()) { %>
            <tr>
                <td><%= rs.getInt("id") %></td>
                <td><%= rs.getString("name") %></td>
                <td><%= rs.getString("email") %></td>
            </tr>
            <% } %>
        </table>
        
        <%
                rs.close();
                stmt.close();
                conn.close();
            } catch (Exception e) {
                out.println("Ошибка: " + e.getMessage());
            }
        %>
    </body>
    </html>
    

    Автоматизация и скрипты

    JSP можно использовать не только для веб-интерфейсов, но и для автоматизации задач. Например, создание API для мониторинга:

    <%@ page language="java" contentType="application/json; charset=UTF-8"%>
    <%@ page import="java.util.*,java.lang.management.*" %>
    <%
        response.setHeader("Access-Control-Allow-Origin", "*");
        
        MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
        MemoryUsage heapMemoryUsage = memoryBean.getHeapMemoryUsage();
        
        OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
        
        RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
        
        out.println("{");
        out.println("  \"timestamp\": " + System.currentTimeMillis() + ",");
        out.println("  \"uptime\": " + runtimeBean.getUptime() + ",");
        out.println("  \"memory\": {");
        out.println("    \"used\": " + heapMemoryUsage.getUsed() + ",");
        out.println("    \"max\": " + heapMemoryUsage.getMax() + ",");
        out.println("    \"free\": " + (heapMemoryUsage.getMax() - heapMemoryUsage.getUsed()));
        out.println("  },");
        out.println("  \"cpu\": {");
        out.println("    \"processors\": " + osBean.getAvailableProcessors() + ",");
        out.println("    \"load\": " + osBean.getSystemLoadAverage());
        out.println("  }");
        out.println("}");
    %>
    

    Такой API можно использовать для мониторинга состояния сервера из внешних систем.

    Полезные ресурсы

    Заключение и рекомендации

    JSP — это проверенная временем технология, которая до сих пор актуальна для многих задач. Она особенно хороша для:

    • Быстрого создания административных интерфейсов
    • Интеграции с legacy Java-системами
    • Прототипирования веб-приложений
    • Создания простых API для мониторинга

    Основные преимущества JSP:

    • Простота изучения и использования
    • Прямая интеграция с Java-кодом
    • Хорошая производительность после компиляции
    • Богатая экосистема Java

    Недостатки:

    • Смешивание логики и представления
    • Менее читаемый код по сравнению с современными шаблонизаторами
    • Сложность тестирования

    Рекомендую использовать JSP для внутренних инструментов, админок и интеграции с существующими Java-системами. Для новых проектов лучше рассмотреть современные альтернативы вроде Thymeleaf или React с REST API.

    Если планируете развернуть JSP-приложение в продакшене, обязательно возьмите достаточно мощный VPS или выделенный сервер — Java-приложения требовательны к ресурсам, особенно к оперативной памяти.


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

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

Leave a reply

Your email address will not be published. Required fields are marked