cherry.png

Пишем сайт на чистых сервлетах

10.08.2018
checkmark3

Java, Servlet, HTML

Известные технологии Java - JSP, JSF базируются на обычных сервлетах, и в конечном итоге при загрузке на сервер приложений компилируются в класс-потомокHttpServlet,а затем компилируются в байткод. Это можно увидеть, если заглянуть на сервер приложений, но такой код, мягко говоря, сложно читать - в нем во-первых далеко не все очевидно, во-вторых каждая строчка исходящего*.htmlкода формируется отдельным вызовом методаwrite(...)из контекста страницы, а в-третьих кода становится в 10 раз больше.
Напишем простое приложение на чистых сервлетах с аннотациями. Для примера возьмем один сервлет, который будет строить исходящий*.htmlкод на основе шаблона и подставлять туда необходимые параметры. Пишем Hello World на чистых сервлетах.
1. Cтруктура проекта:
site-on-simple-servlets
│
├── src
│   └── main
│       ├── java
│       │   └── servlets
│       │       ├── . . .
│       │       ├── . . .
│       │       ├── AbstractServlet.java
│       │       └── Index.java
│       └── resources
│           └── templates
│               ├── . . .
│               ├── . . .
│               └── Index.html
│
└── pom.xml
2. Необходимые зависимости Maven:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>site-on-simple-servlets</groupId>
    <artifactId>site-on-simple-servlets</artifactId>
    <name>site-on-simple-servlets</name>
    <version>1.0</version>
    <packaging>war</packaging>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.plugin.vercion>3.8.0</maven.compiler.plugin.vercion>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <build>
        <finalName>site-on-simple-servlets</finalName>
        <defaultGoal>package</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.plugin.vercion}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
3. И вот он - тот самый сервлет:Index.java
package servlets;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;

@WebServlet(name = "index", urlPatterns = {"/index.html"})
public class Index extends AbstractServlet {

    protected static String page;

    public static long lastModified = System.currentTimeMillis();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doResponse(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doResponse(request, response);
    }

    @Override
    protected void preparePage(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
        InputStream is = Index.class.getResourceAsStream("/templates/pages/index.html");
        InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);

        StringWriter sw = new StringWriter();

        int read;
        while ((read = isr.read()) != -1) {
            sw.write(read);
        }

        setPage(sw.toString().replace("<--say_hello-->", "Hello World!!"));
    }

    @Override
    protected long getLastModified(HttpServletRequest request) {
        return lastModified;
    }
}
Вернее сказать два сервлета - будем использовать наследование.
4.AbstractServlet.java
package servlets;

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;

public abstract class AbstractServlet extends HttpServlet {

    protected String getPage() throws ServletException, IOException {
        return (String) this.getClass().getField("page").get(this.getClass());
    }

    protected void setPage(char[] page) {
        this.getClass().getField("page").set(this.getClass(), page);
    }

    protected void doResponse(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        PrintWriter pw = response.getWriter();

        if (this.getPage() == null) {
            this.preparePage(request, response);
        }

        pw.write(this.getPage());
    }

    protected abstract void preparePage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
5. В завершении добавим шаблон:index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><--say_hello--></title>
</head>
<body>
    <h1><--say_hello--></h1>
</body>
</html>
Сайтdrakonoved.orgпостроен именно по такому принципу, только немного сложнее. Здесь есть не только страницы со статичным содержанием, но и динамические страницы. Это достигается связкойJava - JavaScript.При этом никакие фреймворки не используются - все написано на чистых сервлетах. После формирования самой страницы в дело включаются минифайер и обфускатор, также написанные наJava.

facebookvkontaktetwitterodnoklassnikimailrulivejournal

Комментарии

O0O0O0O0
Комментатор
01.01.1970 03:00 (MSK)
Комментариев пока нет.. Вы можете стать первым..