Руководство по Servlets. Работа с базой данных.

В данной статье мы рассмотрим пример работы с базой данных (далее – БД) с помощью сервлетов.

В качестве БД мы будем использовать PostgreSQL, а основу приложения возьмём из данной статьи.

Для начала, создадим БД. Открываем терминал (операционная система – Ubuntu 16.04 LTS – при использовании другой ОС – способ создания БД может отличаться) и выполняем следующую команду:


sudo -i -u postgres

После ввода пароля открываем консоль БД:


psql

И создаем саму базу данных:


postgres=# CREATE DATABASE servlets_tutorial;

Подключим нашу БД к Idea:

servletsTutorialConnectDatabase1

servletsTutorialConnectDatabase2.png

servletsTutorialConnectDatabase3

Внесем некоторые изменения, чтобы получилась следующая структура приложения:

servletsTutorialConnectDatabase4

Файл initDB.sql


CREATE TABLE IF NOT EXISTS developers (
  id         INT PRIMARY KEY,
  first_name VARCHAR(50)  NOT NULL,
  last_name  VARCHAR(100) NOT NULL,
  specialty  VARCHAR(100) NOT NULL,
  experience INT          NOT NULL,
  salary     DECIMAL      NOT NULL
);

Файл populateDB.sql


INSERT INTO developers VALUES (1, 'Eugene', 'Suleimanov', 'Software Engineer', 3, '3000.00');

Поочередно выполним оба эти файла.
В результате мы получим следующую таблицу:

servletsTutorialDevelopersTable

Добавим в наш pom.xml файл зависимости для postgres коннектора:

Файл pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.proselyte.tutorials</groupId>
    <artifactId>ServletsTutorial</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>Servlets Tutorial</name>
    <url>http://maven.apache.org</url>

    <properties>
        <javax.servlet.api.version>2.5</javax.servlet.api.version>
        <tomcat.plugin.version>2.2</tomcat.plugin.version>
        <postgres.connector.version>9.1-901.jdbc3</postgres.connector.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>${javax.servlet.api.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>${postgres.connector.version}</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>ServletsTutorial</finalName>

        <plugins>
            <!-- Tomcat plugin -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>${tomcat.plugin.version}</version>
                <configuration>
                    <path>/</path>
                    <port>8088</port>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Перейдём к созданию самого сервлета.
Класс DatabaseDemo.java


package net.proselyte.servletstutorial;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;

/**
 * Simple servlet that demonstrates work with database.
 *
 * @author Eugene Suleimanov
 */

public class DatabaseDemo extends HttpServlet {

    static final String JDBC_DRIVER = "org.postgresql.Driver";
    static final String DATABASE_URL = "jdbc:postgresql://localhost:5432/servlets_tutorial";
    static final String DATABASE_USER = "postgres";
    static final String DATABASE_PASSWORD = "postgres";
    static final String GET_ALL_DEVELOPERS_RECORDS = "SELECT * FROM developers";

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();

        String title = "Database Demo";
        String docType = "<!DOCTYPE html>";

        try {
            Class.forName(JDBC_DRIVER);
            Connection connection = DriverManager.getConnection(DATABASE_URL, DATABASE_USER, DATABASE_PASSWORD);

            Statement statement = connection.createStatement();

            ResultSet resultSet = statement.executeQuery(GET_ALL_DEVELOPERS_RECORDS);

            writer.println(docType + "<html><head><title>" + title + "</title></head><body>");
            writer.println("<h1>DEVELOPERS DATA</h1>");
            writer.println("<br/>");
            while (resultSet.next()) {
                int id = resultSet.getInt(1);
                String firstName = resultSet.getString(2);
                String lastName = resultSet.getString(3);
                String specialty = resultSet.getString(4);
                int experience = resultSet.getInt(5);
                int salary = resultSet.getInt(6);


                writer.println("ID: " + id);
                writer.println("First name: " + firstName + "<br/>");
                writer.println("Last name: " + lastName + "<br/>");
                writer.println("Specialty: " + specialty + "<br/>");
                writer.println("Experience: " + experience + " years<br/>");
                writer.println("Salary: $" + salary + "<br/>");
            }

            resultSet.close();
            statement.close();
            connection.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        writer.println("</body></html>");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Файл web.xml


<!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>
    <display-name>Servlets Tutorial</display-name>

    <servlet>
        <servlet-name>SimpleServlet</servlet-name>
        <servlet-class>net.proselyte.servletstutorial.SimpleServlet</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>DatabaseDemo</servlet-name>
        <servlet-class>net.proselyte.servletstutorial.DatabaseDemo</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>SimpleServlet</servlet-name>
        <url-pattern>/SimpleServlet</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>DatabaseDemo</servlet-name>
        <url-pattern>/DatabaseDemo</url-pattern>
    </servlet-mapping>

</web-app>

В терминале выполним команду:


mvn tomcat7:run

Откроем браузер и перейдём по ссылке:


http://localhost:8088/DatabaseDemo

В результате мы получим следующую страницу:

servletsTutorialsDatabaseDemoFinalPage

На этом мы заканчиваем изучение работы с БД с помощью сервлетов.

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