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>
Terminer
TodoServlet
Tomcat8 (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>
Terminer
todo.controller
--Nom de classe: HelloServlet
TodoServlet
dans l'Explorateur de packages
et cliquez sur Exécuter
-> Exécuter sur le serveur
Tomcat 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 dossier
WEB-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
-> Dossier
Terminer
--Nom du dossier: view
WebContent / index.jsp
dans Package Explorer
et sélectionnez Refactoring
-> Move
WebContent / 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 dans
doPost` 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/lib Faites glisser les 4 bocaux que vous avez téléchargés&Laissez tomber Un message de confirmation s'affiche.Copier un fichier SélectionnerOK Cliquez sur. |
|
lib Assurez-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