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).
Les paramètres du groupe de sécurité sont agréables.
Suivez la procédure ci-dessous.
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 |
+------------------+-----------+
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
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 | |
+-------------+---------------+------+-----+---------+-------+
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
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.