Pouvez-vous le faire? Java EE

Faisons quelque chose en utilisant Java Servlet ** pour les devoirs scolaires! Une histoire comme ** est arrivée, c'est donc l'histoire.

J'utilise beaucoup Laravel, et j'ai senti qu'il pouvait être utilisé comme ça, donc je vais le présenter tout en le rendant compatible.

Servlet se présente comme un contrôleur

package servlets;

import models.Room;

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.sql.SQLException;
import java.util.List;

@WebServlet("/")
public class RoomServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        List<Room> rooms;
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            rooms = Room.index();
        } catch (SQLException | ClassNotFoundException e) {
            request.setAttribute("error", e);
            request.getRequestDispatcher("/WEB-INF/jsp/views/rooms/room-list.jsp").forward(request, response);
            return;
        }

        request.setAttribute("rooms", rooms);
        request.getRequestDispatcher("/WEB-INF/jsp/views/rooms/room-list.jsp").forward(request, response);
    }
}

Vous pouvez acheminer avec l'annotation @ WebServlet. En outre, il n'est pas possible de réécrire web.xml et de le router, mais c'est gênant car la quantité d'écriture augmente un peu.

La méthode doGet est traitée en réponse à la requête HTTP GET. request contient les éléments nécessaires tels que les paramètres et les en-têtes de demande. Puisque response a getWriter (), vous pouvez également effectuer un rendu à partir de Servlet.

Ajoutez un paramètre en interne (?) Avec request.setAttribute (" attributeName ", value) et utilisez request.getRequestDispatcher (" /path/to/page.jsp ") etc. pour utiliser d'autres servlets Le traitement peut être transféré vers JSP. Vous pouvez l'obtenir en faisant request.getAttribute (" attributeName ") à la destination.

Vous pouvez transmettre n'importe quel request.setAttribute (String, obj). La valeur de retour de request.getAttribute (String) est de type Object, vous devez donc recevoir la valeur et la remonter.

Il y a aussi doPost (), doPut (), doDelete (), etc., donc vous pouvez facilement créer une API REST à la place.

JSP peut être utilisé comme un moteur de template

<%@ page import="models.Room" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<jsp:include page="/WEB-INF/jsp/views/base/head.jsp">
    <jsp:param name="title" value="Liste des fils"/>
</jsp:include>
<body class="bg-light">
<jsp:include page="/WEB-INF/jsp/views/base/navber.jsp"/>
<div class="container">
    <h1 class="font-weight-bold">Liste des fils</h1>

    <% if (request.getAttribute("error") != null) {
        Exception e = (Exception) request.getAttribute("error");
    %>
    <div class="text-danger">
        <%=e.getMessage()%>
    </div>
    <% } else {
        List<Room> rooms = (List<Room>) request.getAttribute("rooms");
    %>

    <div class="row">
        <%
            for (Room it : rooms) {
                request.setAttribute("room", it);
        %>
        <div class="col-12 mb-3">

            <jsp:include page="/WEB-INF/jsp/components/room-card.jsp"/>
        </div>
        <% } %>
    </div>

    <% } %>
</div>
</body>
</html>

Vous pouvez incorporer d'autres JSP à l'aide de <jsp: include page =" path / to / page.jsp "/>. Cette intégration ressemble à ajouter le JSP d'un autre fichier tel quel et à le rendre, vous pouvez donc l'utiliser comme un composant de fichier unique de Vue.js. Vous pouvez également passer des paramètres en utilisant la balise <jsp: param> comme élément enfant de la balise <jsp: include>. Ceci est synonyme de «request.setAttribute ()» de Servlet, et est lu à partir de la JSP intégrée à l'aide de «request.getAttribute ()».

Comme ` '' dans Vue.js, il semble difficile d'utiliser le contour de l'interface utilisateur comme une seule JSP et d'y placer View comme élément enfant.

De plus, la syntaxe du modèle (qui ne semble pas correcte) utilise la syntaxe Java telle quelle. Il ne nécessite aucun effort pour apprendre la nouvelle syntaxe de modèle, mais ce n'est pas aussi simple que Flask, et j'ai eu l'impression que c'était compliqué.

De plus, comme vous pouvez utiliser n'importe quelle syntaxe Java, vous pouvez écrire n'importe quoi dans JSP. Si vous ne vous pesez pas, cela ressemblera à PHP, vous devez donc faire attention.

... Je ne m'arrêterais pas si je faisais tout avec JSP.

De plus, le répertoire WEB-INF / est un répertoire inaccessible depuis un navigateur. Les JSP qui sont incorporées ou sont supposées être utilisées par les répartiteurs doivent être placées dans le répertoire WEB-INF /.

Le filtre ressemble à un middleware

Le filtre peut intervenir sur le traitement avant d'être transmis à la classe acheminée. Par exemple, si vous n'êtes pas connecté, vous pouvez rediriger vers la page de connexion ou corriger le codage des caractères.

package filters;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "CharacterEncodingFilter")
public class CharacterEncodingFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html; charset=UTF-8");

        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

La partie de filtrage importante est doFilter (). L'argument req peut également être converti dans la classe HttpServletRequest.

Je ne l'ai pas étudié en détail, donc je n'en sais plus, mais je pense que je peux en profiter de différentes manières.

Pour que Filter fonctionne, spécifiez <url-pattern> dans le fichier web.xml.

Faisons de notre mieux pour concevoir la couche de modèle

Java EE n'a pas de CLI comme l'artisan de Laravel, et aucun modèle de conception n'est pris en compte. Par conséquent, vous devez concevoir vous-même la partie dite «modèle» utilisée par Servlet, JSP et Filter.

Avec l'assaisonnement ici, vous pourrez créer l'ensemble de l'application avec votre architecture préférée. Puisque vous devez construire votre propre architecture préférée, cela prend du temps et des responsabilités pour le programmeur.

Impressions

L'effort de déploiement est similaire

Après tout, la plupart des applications Web sont exploitées en empruntant les fonctions du serveur Web. Flask of Python a un serveur pour le moment, mais lorsque vous le faites dans un environnement de production, il est principalement lié à un serveur Web avec uWSGI, et je pense qu'il est acceptable d'utiliser Tomcat, etc.

C'est beaucoup de travail

Si vous êtes habitué à quelque chose de pratique comme Laravel, vous le trouverez gênant avec tout simplement Java EE.

Si vous souhaitez améliorer le frontal, vous devez définir le pack Web et le nœud par vous-même, et comme il n'y a pas de fonction telle que le système d'authentification ou la protection CSRF, vous devez programmer vous-même. De plus, étant donné que JSP n'a pas de fonction d'échappement, il existe un danger de XSS.

Je ne pense pas que ce soit une comparaison car ils ont été faits à des époques différentes.

Cependant, comme la session était assez facile et facile à gérer, cela peut ne pas poser de problème dans les cas où vous n'avez pas besoin d'un système d'authentification, mais que vous souhaitez identifier l'utilisateur qui accède dans une certaine mesure.

Mais quand il s'agit de bouger longtemps ...

Je m'inquiète de la situation de maintenance

La dernière version de Java EE semble être le 21 septembre 2017. [^ 1]

Et Tomcat. Lorsque j'ai spécifié JDK 13 pour exécuter Tomcat 8.5.47, j'ai reçu une erreur indiquant qu'il n'est pas pris en charge. En spécifiant JRE 1.8, je fais avancer les choses, mais je suis inquiet.

Je n'ai pas essayé Tomcat 9 [^ 2], alors peut-être qu'il est pris en charge.

Résumé

Je pensais que ce serait inévitable de le faire dans la conférence, mais je pensais que Servlet était bien fait. Cependant, je souhaite utiliser Laravel car il a plus de fonctions et est plus facile à réaliser! Je n'ai pas réfléchi.

Recommended Posts

Pouvez-vous le faire? Java EE
Vous pouvez le faire avec une copie! Programmation orientée aspect (Android)
[Java] Pouvez-vous expliquer ce phénomène?
Utilisez-vous Stream en Java?
[Bonne nouvelle] Vous pouvez toujours utiliser Java 8 !!
Avez-vous besoin d'une implémentation de Java compatible avec la mémoire?
[Même les débutants peuvent le faire! ] Comment créer un environnement Java sous Windows 10 (JDK14.0.1)
[JavaScript] Programmeurs Java! Si c'est le cas, la fermeture JavaScript est super facile à comprendre!
[Même les débutants peuvent le faire! ] Comment écrire Javadoc
Connaissez-vous Decorator?
Vous pouvez le faire tout de suite avec Serverless Framework Serverless with AWS (API + Lambda [java] est facile à configurer)
[Même les débutants peuvent le faire! ] Comment installer Eclipse sur Windows 10 (construction de l'environnement Java)
Résumé des mots réservés Java inconnus de manière inattendue
C'est l'hiver mais tu veux des feux d'artifice? ?? Puis implémentez-le
Je peux le lire! RxJava
Activer Java EE avec NetBeans 9
[Java] Rendez-le constant
Java thread sans danger pour vous