[JAVA] Construction de système Web (super basique) ④: Construction de système Web

Objectif

Construction du système Web (super basique) ②: construction du serveur AP et fonctionnement de base et [Construction du système Web (super basique) ③: construction du serveur DB et fonctionnement de base] Créez un système Web à l'aide du serveur Web / AP et du serveur de base de données créés à l'adresse (https://qiita.com/MARTOON/items/b037ba8161790c874e94).

Condition environnementale

Les paramètres du groupe de sécurité sont agréables.

Procédure de construction

Suivez la procédure ci-dessous.

  1. Rendez possible la connexion à MySQL sur le serveur de base de données à partir du système d'exploitation du serveur Web / AP.
  2. Rendez possible la connexion à MySQL sur le serveur DB à partir du serveur Web / AP.
  3. Enregistrement des données dans la base de données
  4. Préparation de la demande
  5. Contrôle de fonctionnement

1. Rendez possible la connexion à MySQL sur le serveur de base de données à partir du système d'exploitation du serveur Web / AP.

Ec2 sur serveur DB-Connectez-vous en tant qu'utilisateur

Passer à l'utilisateur root
$ sudo su - 

Connectez-vous à MySQL
#mysql -uroot -ppassword

Confirmation des utilisateurs autorisés
> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

Créer un utilisateur de connexion
> CREATE USER 'appuser'@'%' IDENTIFIED BY 'appuser';

Modifier les autorisations de l'utilisateur de l'application
> GRANT ALL ON *.* TO 'appuser'@'%';

Assurez-vous que l'utilisateur de l'application est prêt à se connecter de partout
> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| appuser          | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

2. Rendez possible la connexion à MySQL sur le serveur DB à partir du serveur Web / AP.

Téléchargement du pilote
# curl -O https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.12/mysql-connector-java-8.0.12.jar

Placez le pilote dans le répertoire lib de Tomcat
# mv mysql-connector-java-8.0.12.jar /opt/apache-tomcat-9.0.30/lib/

Mettre un lien symbolique sur le pilote
# cd /opt/apache-tomcat-9.0.30/lib/
# ln -s mysql-connector-java-8.0.12.jar mysql-connector-java.jar

3. Enregistrement des données dans la base de données

Obtenir des informations SQL pour enregistrer des exemples de données dans la base de données
# curl -O https://downloads.mysql.com/docs/world.sql.zip

décompressez l'installation
# yum install -y unzip

Décompressez le fichier SQL
# unzip world.sql.zip 

Entrée d'échantillons de données dans DB
# mysql -uappuser -pappuser  < world.sql

Connectez-vous à MySQL
# mysql -uappuser -pappuser

Assurez-vous que la base de données mondiale a été ajoutée
> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| world              |
+--------------------+

Vérifiez les tables contenues dans la base de données mondiale
> use world;
> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+

La définition de chaque table est la suivante.


> desc city;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+

> desc country;
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field          | Type                                                                                  | Null | Key | Default | Extra |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Code           | char(3)                                                                               | NO   | PRI |         |       |
| Name           | char(52)                                                                              | NO   |     |         |       |
| Continent      | enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') | NO   |     | Asia    |       |
| Region         | char(26)                                                                              | NO   |     |         |       |
| SurfaceArea    | decimal(10,2)                                                                         | NO   |     | 0.00    |       |
| IndepYear      | smallint(6)                                                                           | YES  |     | NULL    |       |
| Population     | int(11)                                                                               | NO   |     | 0       |       |
| LifeExpectancy | decimal(3,1)                                                                          | YES  |     | NULL    |       |
| GNP            | decimal(10,2)                                                                         | YES  |     | NULL    |       |
| GNPOld         | decimal(10,2)                                                                         | YES  |     | NULL    |       |
| LocalName      | char(45)                                                                              | NO   |     |         |       |
| GovernmentForm | char(45)                                                                              | NO   |     |         |       |
| HeadOfState    | char(60)                                                                              | YES  |     | NULL    |       |
| Capital        | int(11)                                                                               | YES  |     | NULL    |       |
| Code2          | char(2)                                                                               | NO   |     |         |       |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+

> desc countrylanguage;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| CountryCode | char(3)       | NO   | PRI |         |       |
| Language    | char(30)      | NO   | PRI |         |       |
| IsOfficial  | enum('T','F') | NO   |     | F       |       |
| Percentage  | decimal(4,1)  | NO   |     | 0.0     |       |
+-------------+---------------+------+-----+---------+-------+

4. Préparation de la demande

Créez une application Web simple à l'aide des programmes JSP et Java et exécutez-la sur le serveur AP. Si vous entrez le nom du pays sur l'écran Web et effectuez une recherche, vous pouvez trouver les 5 grandes villes et leur population, ainsi que la langue officielle et son taux d'utilisation. C'est un programme qui s'affiche lors d'une recherche de base de données.

world.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8" %>

<!DOCTYPE html>
<html>
    <head>
        <title>requestForm</title>
    </head>
    <body>
        <p>Recherche des principales villes et langues officielles de chaque pays</p>

        <%--Envoyer du texte avec la méthode GET--%>
        <form action="./WorldServlet">
            <p>
Veuillez saisir le nom du pays (en anglais):<input type="text" name="text1"><br>
Exemple) Entrez le Japon pour le Japon
            </p>
            <input type="submit" value="Exécution de la recherche">
        </form>
</html>

WorldServlet.java


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.NumberFormat;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/WorldServlet")
public class WorldServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
    /**
     *constructeur.
     */
    public WorldServlet() {
        super();
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    	String inputText = "";	//Texte 1 variable de stockage
    	
    	inputText = request.getParameter("text1");
    	
        String servername     = "172.31.45.98";
        String databasename   = "world";
        String user = "appuser";
        String password = "appuser";
        String serverencoding = "UTF-8";
        String url =  "jdbc:mysql://" + servername + "/" + databasename + "?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B9:00&rewriteBatchedStatements=true";
    	
        Connection con = null;

        try {
	        Class.forName( "com.mysql.cj.jdbc.Driver" ).newInstance();
	        con = DriverManager.getConnection( url, user, password );
	        Statement stat = con.createStatement();
	        String sqlStr1 = "select country.name, city.name, city.population from city inner join country on city.countrycode=country.code  where country.name='" + inputText + "' order by city.population desc limit 5;";
	        String sqlStr2 = "select country.name, countrylanguage.language, countrylanguage.percentage from country inner join countrylanguage on country.code=countrylanguage.countrycode where country.name='" + inputText + "' order by countrylanguage.percentage desc limit 1;";
	        System.out.println("sqlStr1: " + sqlStr1);
	        System.out.println("sqlStr2: " + sqlStr2);
	        
	        ResultSet resultset1 = stat.executeQuery( sqlStr1 );
	     
	        String country_name = null;
	        String city_name = null;
	        Integer city_population = 0;
	        String countrylanguage_language = null;
	        Double countrylanguage_percentage = 0.0;
	        
	        //Générer une instance NumberFormat
	        NumberFormat nfNum = NumberFormat.getNumberInstance();    //Format séparé par virgule
	        NumberFormat nfPer = NumberFormat.getPercentInstance();   //Format de pourcentage
	        
    		//Réglage du contenu à afficher à l'écran
            //Définir que le contenu de sortie est HTML
            response.setContentType("text/html");
            //UTF le code de caractère de l'écran de sortie-Régler sur 8
            response.setCharacterEncoding("UTF-8");

            //Obtenir une instance de classe Writer à afficher à l'écran
            PrintWriter pw = response.getWriter();

            //HTML de sortie
            pw.println("<html>");
            pw.println("<head>");
            pw.println("<title>Résultat d'entrée</title>");
            pw.println("</head>");
            pw.println("<body>");
            pw.println("<h1>Résultats de recherche</h1>");
	        pw.println("<h2>" + inputText + "Les grandes villes et leurs populations sont:</h2>");
	        pw.println("<table border='1'>");
	        pw.println("<tr>");
	        pw.println("<th>Nom d'une ville</th>");
	        pw.println("<th>population</th>");
	        pw.println("</tr>");
			while( resultset1.next() )
	        {
	            /*getString()La méthode est le nom du champ spécifié dans l'argument(Colonne)Obtenir la valeur de en tant que chaîne*/
				city_name = resultset1.getString("city.name");
				city_population = resultset1.getInt("city.population");
	        	System.out.print("Nom d'une ville:" + city_name);
	        	System.out.print("Population urbaine:" + city_population);
		        pw.println("<tr>");
		        pw.println("<th>"+ city_name +"</th>");
		        pw.println("<th>"+ nfNum.format(city_population) +"Homme</th>");
		        pw.println("</tr>");
	        	
	        }
			pw.println("</table>");
			resultset1.close();
			
	        ResultSet resultset2 = stat.executeQuery( sqlStr2 );
            
	        pw.println("<h2>" + inputText + "La langue officielle et son taux d'utilisation sont les suivants</h2>");
	        pw.println("<table border='1'>");
	        pw.println("<tr>");
	        pw.println("<th>Terminologie officielle</th>");
	        pw.println("<th>Ratio d'utilisation</th>");
	        pw.println("</tr>");
	        while( resultset2.next() )
	        {
	            /*getString()La méthode est le nom du champ spécifié dans l'argument(Colonne)Obtenir la valeur de en tant que chaîne*/
	        	countrylanguage_language = resultset2.getString("countrylanguage.language");
	        	countrylanguage_percentage = resultset2.getDouble("countrylanguage.percentage");
	        	System.out.print("Terminologie officielle:" + countrylanguage_language);
	        	System.out.print("Ratio d'utilisation:" + countrylanguage_percentage);
		        pw.println("<tr>");
		        pw.println("<th>"+ countrylanguage_language +"</th>");
		        pw.println("<th>"+ nfPer.format(countrylanguage_percentage / 100) +"</th>");
		        pw.println("</tr>");
	        	
	        }
	        pw.println("</table>");
	        
			resultset2.close();
            stat.close();
            con.close();

            pw.println("</body>");
            pw.println("</html>");       
        } 
        catch( SQLException e ){

            /*Sortie de message d'erreur*/
            System.out.println( "Connection Failed. : " + e.toString() );

            /*Je vais lancer une exception*/
            try {
				throw new Exception();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

        }catch (ClassNotFoundException e){

            /*Sortie de message d'erreur*/
            System.out.println("Le pilote n'a pas pu être chargé" + e);
        } catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        finally{
            try{
                if( con != null ){ 
                    con.close();
                }
            }
            catch(Exception e){

                /*Sortie de message d'erreur*/
                System.out.println( "Exception2! :" + e.toString() );

                /*Je vais lancer une exception*/
                try {
					throw new Exception();
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
            }
        }

    }
}

web.xml


<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<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_3_1.xsd"
  version="3.1">

	<servlet>
		<servlet-name>WorldServlet</servlet-name>
    	    <servlet-class>WorldServlet.WorldServlet</servlet-class>
	</servlet>
 
	<servlet-mapping>
		<servlet-name>WorldServlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
 
</web-app>

Placez l'application comme suit.

/opt/apache-tomcat-9.0.30/webapps/world
world
├── WEB-INF
│   ├── lib
│   │   └── World.jar
│   └── web.xml
└── world.jsp

5. Contrôle de fonctionnement

Redémarrez le service Tomcat
# service tomcat restart
Redirecting to /bin/systemctl start tomcat.service

Du navigateur au serveur Web "DNS public:8080/world/world.Connectez-vous à "jsp"
Vérifiez que la page Web créée est affichée et que le traitement est effectué correctement.

Recommended Posts

Construction de système Web (super basique) ④: Construction de système Web
swift CollectionView Utilisation super basique
Utilisation super basique d'Eclipse
[Super facile] Construction de l'environnement Ruby