TD n°1 Java EE, éléments de correction
Exercice 1
Corrigé dans l'énoncé
Exercice 2
Exemple d'énumération des variables passées dans l'url :
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Récupération GET</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>Nom</th>
<th>Valeur</th>
</tr>
</thead>
<%
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = request.getParameter(name);
out.print("<tr>" + name + "<td></td><td>" + value + "</td></tr>");
}
%>
</table>
</body>
</html>
Exercice 3
Récupération des variables d'un formulaire posté dans une servlet
@WebServlet(name="Submit", urlPatterns = { "/submit.do" })
public class Submit extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Retourne le flux de sortie
* @param response
* @return
* @throws IOException
*/
private PrintWriter getOut(HttpServletResponse response) throws IOException{
response.setCharacterEncoding("UTF8");
response.setContentType("text/html");
PrintWriter out=response.getWriter();
return out;
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=getOut(response);
out.print("Méthode GET interdite sur cette page");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=getOut(response);
if(request.getParameter("name")!=null){
out.print("Informations saisies :<br>");
out.print("<div>Nom : "+request.getParameter("name")+"</div>");
if(request.getParameter("password")!=null)
out.print("<div>Mot de passe : "+request.getParameter("password")+"</div>");
}
}
}
Exercice 4
Gestion des informations temporaires, sessions et cookies
JSP et servlets, mise en place d’un contrôleur
| Package | Classe/fichier | Description |
|---|---|---|
net.td.metier | Link | Représente un lien Internet |
net.td.utils | Gateway | Classe passerelle entre métier et la Session |
Gui | Classe technique destinée à l'affichage | |
net.td.controller | SLink | Contrôleur de l'application |
WEB-INF/ | *.jsp | Vues de l'application |
Documentation :
Vues à implémenter :
- listLinks.jsp : Affichage de la liste des liens
- error.jsp : Affichage d'un message d'erreur récupéré dans l'attribut errorMessage de la requête
- Implémenter ensuite la suite du TD2 : gestion des cookies
Classe métier :Link
package net.td.metier;
public class Link {
private String nom;
private String adresse;
public Link() {
this("","http://");
}
public Link(String nom, String adresse) {
super();
this.nom = nom;
this.adresse = adresse;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getAdresse() {
return adresse;
}
public void setAdresse(String adresse) {
this.adresse = adresse;
}
public boolean isValid(){
if(adresse==null ||"".equals(adresse))
return false;
Pattern p=Pattern.compile("^(http|https|ftp){1}(://){1}.+?$");
Matcher m=p.matcher(adresse);
return m.matches();
}
@Override
public String toString() {
return "Link [nom=" + nom + ", adresse=" + adresse + "]";
}
public void copyFrom(Link aLink){
nom=aLink.getNom();
adresse=aLink.getAdresse();
}
}
Classes techniques
Gateway : Passerelle persistance/métier
package net.td.utils;
public class Gateway {
/**
* Retourne la liste des liens contenue dans la session
* Si la liste n'existe pas encore en Session, celle-ci est créée
* @param request Requête Http
* @return Liste des liens
*/
public static ArrayList<Link> getLinks(HttpServletRequest request){
ArrayList<Link> result;
if(request.getSession().getAttribute("links")!=null){
result=(ArrayList<Link>) request.getSession().getAttribute("links");
}else
{
result=new ArrayList<Link>();
request.getSession().setAttribute("links", result);
}
return result;
}
/**
* Retourne un lien à partir du paramètre id passé dans la requête
* @param request
* @return
*/
public static Link getLink(HttpServletRequest request){
Link result=null;
if(request.getParameter("id")!=null){
try{
int id=Integer.valueOf(request.getParameter("id"));
result=getLinks(request).get(id);
}catch(Exception e){
result=null;
}
}
return result;
}
/**
* Mise à jour ou ajout à partir des paramètres de request du lien aLink
* @param aLink
* @param request
*/
public static void updateLink(Link aLink,HttpServletRequest request){
ArrayList<Link> links=getLinks(request);
Link theLink=getLink(request);
if(theLink!=null){
theLink.copyFrom(aLink);
}else{
links.add(aLink);
}
}
}
Gui : Interfaces
package net.td.utils;
public class Gui {
/**
* Retourne un lien au format HTML
* @param aLink
* @param index
* @return
*/
public static String showLink(Link aLink,int index){
String result="<div><a href='"+aLink.getAdresse()+"' target='openLink'>"+aLink.getNom()+"</a> <a href='update.do?id="+index+"'>...</a></div>";
return result;
}
/**
* Retourne une liste de lien au format HTML
* @param links
* @return
*/
public static String ShowLinks(ArrayList<Link> links){
String result="";
for(int i=0;i<links.size();i++){
result+=showLink(links.get(i),i);
}
return result;
}
}
Vues
<%@page import="net.td.utils.Gateway"%>
<%@page import="net.td.metier.Link"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String ck="";
String id=request.getParameter("id");
Link link=Gateway.getLink(request);
if(link!=null){
ck="<input type='checkbox' name='delete' id='delete'>";
ck+="<label for='delete'>Supprimer le lien</label>";
}else
link=new Link();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajout/modification de lien</title>
</head>
<body>
<form action="update.do" method="post">
<input type="hidden" id="id" name="id" value="<%=id%>">
<div>
<label for="nom">Nom :</label>
<input type="text" name="nom" id="nom" value="<%=link.getNom()%>">
</div>
<div>
<label for="adresse">Adresse :</label>
<input type="text" name="adresse" id="adresse" value="<%=link.getAdresse()%>">
</div>
<div><%=ck %></div>
<input type="submit" value="Continuer >>">
</form>
</body>
</html>
Contrôleur
Le contrôleur gère :
- La logique applicative (réponses aux requêtes, redirections, chargement des vues)
- Le contrôle des données
package net.td.controller;
/**
* Servlet implementation class SLink
*/
@WebServlet({ "/SLink", "*.do" })
public class SLink extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Retourne l'action sollicitée par la requête
* @param request
* @return
*/
private String getAction(HttpServletRequest request){
String result="";
String[] parts=request.getRequestURI().split("/");
if(parts.length>0)
result=parts[parts.length-1];
return result;
}
/**
* Charge une vue (jsp située dans le dossier protégé WEB-INF)
* @param viewName
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void loadView(String viewName,HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
request.getRequestDispatcher("WEB-INF/"+viewName+".jsp").forward(request, response);
System.out.println("redirection vers WEB-INF/"+viewName+".jsp");
}
/**
* @see HttpServlet#HttpServlet()
*/
public SLink() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
String action=getAction(request);
switch (action) {
case "list.do":
loadView("listLinks", request, response);
break;
case "update.do":
loadView("frmLink", request, response);
break;
default:
System.out.println("Aucune action du nom de "+action+"(GET) à effectuer");
break;
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action=getAction(request);
switch (action) {
case "delete.do":
break;
case "update.do":
updateLink(request, response);
break;
default:
System.out.println("Aucune action du nom de "+action+"(POST) à effectuer");
break;
}
}
/**
* Procédure de contrôle de la mise à jour/ajout d'un lien
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void updateLink(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
Link aLink=new Link();
if(request.getParameter("nom")!=null && request.getParameter("adresse")!=null){
aLink.setNom(request.getParameter("nom"));
aLink.setAdresse(request.getParameter("adresse"));
if(aLink.isValid()){
Gateway.updateLink(aLink, request);
loadView("listLinks", request, response);
}else{
request.setAttribute("errorMessage", "Impossible de mettre à jour "+aLink);
loadView("error", request, response);
}
}
}
}