Pour plus d'informations sur la configuration de l'environnement de développement, reportez-vous à Eclipse Super Basic Usage --Qiita.
Tout d'abord, vérifions le fonctionnement de Servlet et JSP. (Cet article) Après cela, j'expliquerai les bases du développement d'applications Web par JSP & Servlet à travers le développement de l'application TODO. (La prochaine fois)
Package Explorer et sélectionnez Nouveau->Projet ...Web-> Projet Web dynamique et cliquez sur Suivant>TerminerTodoServletTomcat8 (Java8)| 1 | 2 | 3 |
|---|---|---|
![]() |
![]() |
![]() |
Tout d'abord, créez un servlet très simple pour vérifier le fonctionnement.
src dans l'Explorateur de packages et sélectionnez Nouveau-> Autre ...Web-> Servlet et cliquez sur Suivant>Terminertodo.controller
--Nom de classe: HelloServletTodoServlet dans l'Explorateur de packages et cliquez sur Exécuter-> Exécuter sur le serveurTomcat v8.0 Server et cliquez sur TerminéTomcat est sorti sur la console, et après un certain temps, le navigateur intégré d'Eclipse s'affiche.
--La page `HTTP Status 404- / TodoServlet / 's'affiche.http: // localhost: 8080 / TodoServlet / HelloServlet et appuyez sur Entrée.
--Si la page Servé à: / TodoServlet est affichée, Servlet peut être exécuté normalement.| 1 | 2 | 3 |
|---|---|---|
![]() |
![]() |
![]() |
Ensuite, vérifiez le fonctionnement de JSP.
Web-> Fichier JSP et cliquez sur Suivant>Terminer
--Nom du fichier: index.jsp<title> `index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello, World!</title>
</head>
<body>
<%= new java.util.Date() %>
</body>
</html>
Accédez à http: // localhost: 8080 / TodoServlet / avec le navigateur intégré d'Eclipse ou le navigateur que vous utilisez normalement.

Code source jusqu'à présent: Kazunori-Kimura / todo-servlet at v1.0.0
Nous avons confirmé la méthode de création et le fonctionnement de Servlet et JSP. Eclipse crée des modèles pour les classes et les fichiers, il semble donc que vous puissiez créer une application Web simplement en la complétant.
JSP est converti en Servlet par Tomcat et exécuté. Par conséquent, ce que vous pouvez faire avec Servlet devrait essentiellement être possible avec JSP.
Cependant, si vous insérez la logique détaillée dans la JSP qui intègre le code en HTML, le code source deviendra bientôt flou.
En divisant les rôles, les perspectives s'amélioreront et le développement se déroulera sans heurts.
Je vais vous expliquer comment lier Servlet et JSP à l'aide d'un exemple simple.
Tout d'abord, implémentez-le pour que le servlet reçoive simplement la demande et renvoie le contenu de la JSP.
Déplacez ʻindex.jsp sous WEB-INFpour que le JSP ne soit pas accessible directement. À l'avenir, nous créerons un dossierWEB-INF / view` et placerons les fichiers JSP sous celui-ci afin qu'il soit plus facile à gérer lorsqu'il y a plusieurs fichiers JSP.
Package Explorer, cliquez avec le bouton droit sur WebContent / WEB-INF et sélectionnez Nouveau-> DossierTerminer
--Nom du dossier: viewWebContent / index.jsp dans Package Explorer et sélectionnez Refactoring-> MoveWebContent / WEB-INF / view et cliquez sur ʻOK`Lorsqu'un client (navigateur) fait une requête à «HelloServlet», la méthode «doGet» est exécutée.
Vous pouvez utiliser la méthode RequestDispatcher # forward pour transférer le traitement vers un autre servlet ou JSP.
Cette fois, lorsqu'une requête arrive à / HelloServlet, elle est transmise à WEB-INF / view / index.jsp.
HelloServlet.java
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String view = "/WEB-INF/view/index.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(view);
dispatcher.forward(request, response);
}
Fenêtre-> Afficher la vue-> ʻAutre`Serveur et cliquez sur ʻOK`Serveur s'affiche. Cliquez sur (▶).Tomcat sera redémarré pour que les modifications du servlet prennent effet.
Accédez à http: // localhost: 8080 / TodoServlet / HelloServlet dans votre navigateur et vérifiez que vous pouvez voir le contenu de ʻindex.jsp`.
Code source jusqu'à présent: Kazunori-Kimura / todo-servlet at v2.0.0
Utilisez la méthode HttpServletRequest # setAttribute pour transmettre les valeurs du servlet à la JSP.
Définissez la clé dans le premier argument et la valeur dans le deuxième argument.
HelloServlet.java
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Passez une chaîne appropriée à JSP
request.setAttribute("foo", "bar");
//Transférer vers JSP
String view = "/WEB-INF/view/index.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(view);
dispatcher.forward(request, response);
}
La valeur setAttribute dans le servlet peut être obtenue avec la méthode request.getAttribute dans la JSP.
L'objet request est disponible dans la JSP sans aucune déclaration spéciale.
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello, World!</title>
</head>
<body>
<%= request.getAttribute("foo") %>
</body>
</html>
Code source jusqu'à présent: Kazunori-Kimura / todo-servlet at v2.1.0
Abréviation de * Expression Language *. L'expression est évaluée et sortie en écrivant «$ {...}».
Cliquez ici pour une explication détaillée> [Pour les débutants] Formule EL - Qiita
Dans l'expression EL, vous pouvez obtenir la valeur en omettant la description de request.getAttribute.
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello, World!</title>
</head>
<body>
${foo}
</body>
</html>
Placez une zone de texte sur le JSP et laissez le servlet recevoir la valeur saisie.
Utilisez les balises form et ʻinput` pour accepter certaines entrées de l'utilisateur dans JSP.
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello, World!</title>
</head>
<body>
<%= request.getAttribute("foo") %>
<form method="post" action="./HelloServlet">
Entrez quelque chose: <input type="text" name="hoge">
<button type="submit">Envoyer</button>
</form>
</body>
</html>
Spécifie la méthode HTTP à utiliser lorsque le bouton submit est enfoncé dans l'attribut method de la balise form.
Vous utiliserez get ou post.
L'attribut ʻaction` spécifie l'URL de destination. Il est préférable de spécifier le chemin par rapport à l'URL actuellement affichée sur le navigateur. Si vous spécifiez un chemin absolu, il sera difficile de gérer les cas où l'URL diffère entre l'environnement de production et l'environnement de développement.
Puisque la méthode get est utilisée lorsqu'il y a une requête du navigateur, utilisez la méthode post pour recevoir des données du formulaire.
Affichez une zone de texte en utilisant la balise ʻinput`.
Si l'attribut type de la balise button est submit, la balise form est utilisée dans la méthode HTTP spécifiée par l'attribut method pour l'URL spécifiée dans l'attribut action du form lorsque le bouton est cliqué. Envoie la valeur de chaque élément dans.
HelloServlet.java
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Obtenez de la valeur grâce à la forme
String value = request.getParameter("hoge");
System.out.println(value);
doGet(request, response);
}
Lorsque l'utilisateur clique sur le bouton, le processus passe à la méthode doPost.
La valeur saisie dans form peut être obtenue avec la méthode HttpServletRequest # getParameter.
Pour l'argument, spécifiez l'attribut name de la balise ʻinput`.
Cette fois, j'obtiens la valeur de name =" hoge ", je la sortie sur la console, puis j'exécute la méthode doGet.
Code source jusqu'à présent: Kazunori-Kimura / todo-servlet at v2.2.0
JSP -> Servlet -> JSP
Implémentons un comportement de type application Web en combinant la coopération de JSP à Servlet et la coopération de Servlet à JSP.
Préparez d'abord le message et le formulaire de saisie du nom "Hello".
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello, World!</title>
</head>
<body>
Bonjour,<%= request.getAttribute("userName") %>San!
<form method="post" action="./Hello">
S'il vous plaît entrez votre nom: <input type="text" name="name">
<button type="submit">Envoyer</button>
</form>
</body>
</html>
Puisque nous voulons afficher "Invité" lors de l'accès avec GET pour la première fois, définissez "Invité" sur ʻuserName`.
HelloServlet.java
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("userName", "Guest");
String view = "/WEB-INF/view/index.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(view);
dispatcher.forward(request, response);
}
Reçoit le nom saisi dans le formulaire et met à jour ʻuserName`.
Lorsqu'il s'agit de langues telles que le japonais, le chinois et le coréen (appelé CJK de l'acronyme chinois, japonais, coréen ou CJKV en ajoutant le vietnamien), les caractères seront déformés si le code de caractère n'est pas spécifié correctement. Veuillez noter que cela se produira.
HelloServlet.java
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Spécification du code de caractère
request.setCharacterEncoding("utf-8");
//Obtenez de la valeur grâce à la forme
String name = request.getParameter("name");
request.setAttribute("userName", name);
doGet(request, response);
}
a été initialisé sans aucune question. Si rien n'est fait, la valeur définie dansdoPost` sera écrasée par" Guest ", donc corrigeons-le.ʻDéfinir "Invité" uniquement si userName est null` ou vide.
HelloServlet.java
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = (String) request.getAttribute("userName");
if (name == null || "".equals(name)) {
request.setAttribute("userName", "Guest");
}
String view = "/WEB-INF/view/index.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(view);
dispatcher.forward(request, response);
}
Une fois que vous avez entré votre nom, vous n'avez pas besoin d'un formulaire de saisie et le masquez. ʻLe formulaire de saisie est affiché uniquement lorsque userName` est "Invité".
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello, World!</title>
</head>
<body>
<% String userName = (String) request.getAttribute("userName"); %>
Bonjour,<%= userName %>San!
<% if ("Guest".equals(userName)) { %>
<form method="post" action="./HelloServlet">
S'il vous plaît entrez votre nom: <input type="text" name="name">
<button type="submit">Envoyer</button>
</form>
<% } %>
</body>
</html>
| 1 | 2 |
|---|---|
![]() |
![]() |
Code source jusqu'à présent: Kazunori-Kimura / todo-servlet at v2.3.0
En fait, l'application Web que nous venons de créer est vulnérable aux scripts intersites (XSS). XSS * intègre un script malveillant dans le site Web de quelqu'un d'autre *.
En fait, entrez <script> alert (" stupid "); </ script> sous la forme du nom.
Pour Google Chrome, l'écran d'erreur «ERR_BLOCKED_BY_XSS_AUDITOR» s'affiche comme illustré ci-dessous.

En fonction de votre navigateur, le script ne sera pas bloqué et vous verrez une boîte de dialogue appelée «stupide».
La cause de XSS est que les données saisies par l'utilisateur sont sorties au format HTML telles quelles. Une mesure efficace contre XSS est d'empêcher les caractères tels que «<» et «>» d'être reconnus comme des balises. Ce processus s'appelle * escape *.
Les fonctions de traitement d'échappement sont fournies en standard en PHP et JavaScript, mais pas Java (JSP). Vous pouvez créer le vôtre, mais il est possible que des bogues soient mélangés, il est donc préférable d'introduire une bibliothèque éprouvée.
En outre, certaines personnes peuvent envisager une méthode de vérification de l'entrée et de ne pas saisir de caractères tels que «<» et «>», mais ce n'est pas une bonne méthode pour les contre-mesures XSS. La vérification des entrées est facile avec un formulaire simple comme celui-ci, mais il est difficile d'implémenter et de tester pour effectuer une vérification d'entrée sans omission dans une application Web compliquée. Il serait également difficile de s'assurer qu'il n'y a absolument aucun moyen de contourner la vérification d'entrée. Après tout, en tant que contre-mesure XSS, il est facile et fiable de s'échapper au moment de la sortie.
JSP a un mécanisme appelé «bibliothèque de balises». En encapsulant le traitement de JSP, vous pouvez améliorer la visibilité de JSP et améliorer la réutilisabilité des fonctions.
| procédure | image |
|---|---|
| Apache Tomcat® - Apache Taglibs DownloadsTéléchargezlesquatrefichiersjaràpartirde. | ![]() |
Éclipse/WebContent/WEB-INF/libFaites glisser les 4 bocaux que vous avez téléchargés&Laissez tomber Un message de confirmation s'affiche.Copier un fichierSélectionnerOKCliquez sur. |
![]() |
libAssurez-vous que le fichier existe dans le dossier. |
![]() |
JSTL est lu avec la directive <% @ taglib%>.
La partie de sortie est passée de «<% =%>» à la balise «<c: out>». La balise <c: out> s'échappe par défaut.
Référence: Référence JSTL: <c: out>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello, World!</title>
</head>
<body>
<% String userName = (String) request.getAttribute("userName"); %>
Bonjour,<c:out value="${userName}" />San!
<% if ("Guest".equals(userName)) { %>
<form method="post" action="./HelloServlet">
S'il vous plaît entrez votre nom: <input type="text" name="name">
<button type="submit">Envoyer</button>
</form>
<% } %>
</body>
</html>
| 1 | 2 |
|---|---|
![]() |
![]() |
Code source jusqu'à présent: Kazunori-Kimura / todo-servlet at v2.4.0
Nous avons vérifié le fonctionnement de Servlet et JSP, et expliqué comment lier Servlet <-> JSP avec une application Web très simple. De plus, les contre-mesures XSS introduites à la fin sont très importantes, soyez donc toujours prudent lors de la création d'une application Web.
Recommended Posts