[JAVA] Web-Systemaufbau (super einfach) ④: Web-Systemaufbau

Zweck

Web-Systemaufbau (Super Basic) ②: AP-Serveraufbau und Grundbetrieb und [Web-Systemaufbau (Super Basic) ③: DB-Serveraufbau und Grundbetrieb] Erstellen Sie ein Websystem mit dem Web- / AP-Server und dem DB-Server unter (https://qiita.com/MARTOON/items/b037ba8161790c874e94).

Umweltbedingung

--AP-Server - EC2:t2.micro - OS:Red Hat Enterprise Linux 8 (HVM), SSD Volume Type --Disk: Allzweck-SSD (GP2) 10 GB - Tomcat:Apache Tomcat 9 - Java:JDK 1.8

Die Sicherheitsgruppeneinstellungen sind nett.

Bauverfahren

Befolgen Sie die nachstehenden Anweisungen.

  1. Ermöglichen Sie die Verbindung zu MySQL auf dem DB-Server vom Web / AP-Server-Betriebssystem.
  2. Ermöglichen Sie die Verbindung zu MySQL auf dem DB-Server vom Web / AP-Server.
  3. Datenregistrierung in der Datenbank
  4. Vorbereitung der Bewerbung
  5. Funktionsprüfung

1. Ermöglichen Sie die Verbindung zu MySQL auf dem DB-Server vom Web / AP-Server-Betriebssystem.

Ec2 auf DB-Server-Melden Sie sich als Benutzer an

Wechseln Sie zum Root-Benutzer
$ sudo su - 

Melden Sie sich bei MySQL an
#mysql -uroot -ppassword

Bestätigung autorisierter Benutzer
> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

Verbindungsbenutzer erstellen
> CREATE USER 'appuser'@'%' IDENTIFIED BY 'appuser';

Ändern Sie die Berechtigungen des Benutzers
> GRANT ALL ON *.* TO 'appuser'@'%';

Stellen Sie sicher, dass der Appuser von überall aus für die Verbindung bereit ist
> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| appuser          | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

2. Ermöglichen Sie die Verbindung zu MySQL auf dem DB-Server vom Web / AP-Server.

Treiber herunterladen
# curl -O https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.12/mysql-connector-java-8.0.12.jar

Platzieren Sie den Treiber im lib-Verzeichnis von Tomcat
# mv mysql-connector-java-8.0.12.jar /opt/apache-tomcat-9.0.30/lib/

Setzen Sie einen symbolischen Link auf den Treiber
# cd /opt/apache-tomcat-9.0.30/lib/
# ln -s mysql-connector-java-8.0.12.jar mysql-connector-java.jar

3. Datenregistrierung in der Datenbank

Abrufen von SQL-Informationen zum Registrieren von Beispieldaten in der Datenbank
# curl -O https://downloads.mysql.com/docs/world.sql.zip

Installation entpacken
# yum install -y unzip

SQL-Datei entpacken
# unzip world.sql.zip 

Geben Sie Beispieldaten in die DB ein
# mysql -uappuser -pappuser  < world.sql

Melden Sie sich bei MySQL an
# mysql -uappuser -pappuser

Stellen Sie sicher, dass die Weltdatenbank hinzugefügt wurde
> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| world              |
+--------------------+

Überprüfen Sie die in der Weltdatenbank enthaltenen Tabellen
> use world;
> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+

Die Definition jeder Tabelle ist wie folgt.


> 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. Vorbereitung der Bewerbung

Erstellen Sie eine einfache Webanwendung mit JSP- und Java-Programmen und führen Sie sie auf dem AP-Server aus. Wenn Sie den Ländernamen auf dem Webbildschirm eingeben und suchen, können Sie die 5 großen Städte und ihre Bevölkerung sowie die Amtssprache und deren Nutzungsverhältnis finden. Es ist ein Programm, das während einer DB-Suche angezeigt wird.

world.jsp


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

<!DOCTYPE html>
<html>
    <head>
        <title>requestForm</title>
    </head>
    <body>
        <p>Suchen Sie nach Großstädten und Amtssprachen in jedem Land</p>

        <%--Senden Sie Text mit der GET-Methode--%>
        <form action="./WorldServlet">
            <p>
Bitte geben Sie den Ländernamen ein (auf Englisch):<input type="text" name="text1"><br>
Beispiel) Geben Sie Japan für Japan ein
            </p>
            <input type="submit" value="Suchausführung">
        </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;
	
    /**
     *Konstrukteur.
     */
    public WorldServlet() {
        super();
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    	String inputText = "";	//Speichervariable für Text 1
    	
    	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;
	        
	        //Generieren Sie eine NumberFormat-Instanz
	        NumberFormat nfNum = NumberFormat.getNumberInstance();    //Kommerziell getrenntes Format
	        NumberFormat nfPer = NumberFormat.getPercentInstance();   //Prozentformat
	        
    		//Festlegen des Inhalts, der auf dem Bildschirm ausgegeben werden soll
            //Stellen Sie ein, dass der Ausgabeinhalt HTML ist
            response.setContentType("text/html");
            //UTF den Zeichencode des Ausgabebildschirms-Auf 8 setzen
            response.setCharacterEncoding("UTF-8");

            //Holen Sie sich eine Writer-Klasseninstanz, die auf dem Bildschirm ausgegeben werden soll
            PrintWriter pw = response.getWriter();

            //HTML ausgeben
            pw.println("<html>");
            pw.println("<head>");
            pw.println("<title>Ergebnis eingeben</title>");
            pw.println("</head>");
            pw.println("<body>");
            pw.println("<h1>Suchergebnisse</h1>");
	        pw.println("<h2>" + inputText + "Großstädte und ihre Bevölkerung sind:</h2>");
	        pw.println("<table border='1'>");
	        pw.println("<tr>");
	        pw.println("<th>Name einer Stadt</th>");
	        pw.println("<th>Population</th>");
	        pw.println("</tr>");
			while( resultset1.next() )
	        {
	            /*getString()Die Methode ist der im Argument angegebene Feldname(Säule)Holen Sie sich den Wert als String*/
				city_name = resultset1.getString("city.name");
				city_population = resultset1.getInt("city.population");
	        	System.out.print("Name einer Stadt:" + city_name);
	        	System.out.print("Städtische Bevölkerung:" + city_population);
		        pw.println("<tr>");
		        pw.println("<th>"+ city_name +"</th>");
		        pw.println("<th>"+ nfNum.format(city_population) +"Mann</th>");
		        pw.println("</tr>");
	        	
	        }
			pw.println("</table>");
			resultset1.close();
			
	        ResultSet resultset2 = stat.executeQuery( sqlStr2 );
            
	        pw.println("<h2>" + inputText + "Die offizielle Sprache und ihre Nutzungsrate sind wie folgt</h2>");
	        pw.println("<table border='1'>");
	        pw.println("<tr>");
	        pw.println("<th>Offizielle Terminologie</th>");
	        pw.println("<th>Nutzungsverhältnis</th>");
	        pw.println("</tr>");
	        while( resultset2.next() )
	        {
	            /*getString()Die Methode ist der im Argument angegebene Feldname(Säule)Holen Sie sich den Wert als String*/
	        	countrylanguage_language = resultset2.getString("countrylanguage.language");
	        	countrylanguage_percentage = resultset2.getDouble("countrylanguage.percentage");
	        	System.out.print("Offizielle Terminologie:" + countrylanguage_language);
	        	System.out.print("Nutzungsverhältnis:" + 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 ){

            /*Ausgabe der Fehlermeldung*/
            System.out.println( "Connection Failed. : " + e.toString() );

            /*Ich werde eine Ausnahme werfen*/
            try {
				throw new Exception();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

        }catch (ClassNotFoundException e){

            /*Ausgabe der Fehlermeldung*/
            System.out.println("Der Treiber konnte nicht geladen werden" + 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){

                /*Ausgabe der Fehlermeldung*/
                System.out.println( "Exception2! :" + e.toString() );

                /*Ich werde eine Ausnahme werfen*/
                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>

Platzieren Sie die Anwendung wie folgt.

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

5. Funktionsprüfung

Starten Sie den Tomcat-Dienst neu
# service tomcat restart
Redirecting to /bin/systemctl start tomcat.service

Vom Browser zum Webserver "Public DNS:8080/world/world.Verbindung zu "jsp"
Stellen Sie sicher, dass die erstellte Webseite angezeigt wird und die Verarbeitung korrekt ausgeführt wird.

Recommended Posts

Web-Systemaufbau (super einfach) ④: Web-Systemaufbau
schnelle CollectionView Super grundlegende Verwendung
Super grundlegende Verwendung von Eclipse
[Super einfach] Ruby-Umgebungskonstruktion