recuperer resultset d'une requete servlet dans une page jsp

recuperer resultset d'une requete servlet dans une page jsp - Java - Programmation

Marsh Posté le 31-05-2008 à 21:42:14    

bonjour tout le monde
j"essaye de faire separation du partie traitement servlet au partie jsp présentation a travers récupération résultat d'une requete selection qui se trouve au page servlet mais ca marche pas voici le code du page servlet et page jsp
page servlet
 
 
import java.io.*;
import java.net.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
/**
*
* @author Administrateur
* @version
*/
public class liste23 extends HttpServlet {
 
public Connection con;
private PrintWriter out;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8" );
PrintWriter out = response.getWriter();
 
 
 
}
 
 
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
 
 
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver" ).newInstance();
String url="jdbc:odbc:test5";
con=DriverManager.getConnection(url,"","" );
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM etud" );
HttpSession session = request.getSession(true);
session.setAttribute("resultset", rs);
response.sendRedirect("liste2.jsp" );}
catch(Exception e)
{
System.out.println(e);
}
 
}
 
 
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
et page jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
<%@ page import="java.sql.*" %>
 
<!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>JSP Page</title>
</head>
<body>
 
<h1>JSP Page</h1>
<form>
<form >
 
<table border="1">
 
<body>
<tr>
 
<td>Nom</td>
<td>Prenom</td>
</tr>
<% session.getAttribute("resultset" );
ResultSet rs = (ResultSet) request.getAttribute("resultset" ); %>
 
 
<% while(rs.next()){%>
<tr>
 
<td align="center"><%=rs.getString(2)%></td>
<td align="center"><%=rs.getString(3)%></td>
 
</tr>
<% } %>
</table>
 
</form>
 
</body>
</html>
et lorsque j'execute page servlet il s'affiche page blanche

Reply

Marsh Posté le 31-05-2008 à 21:42:14   

Reply

Marsh Posté le 31-05-2008 à 23:16:48    

Houla, c'est pas très J2EE-compliant, tout ça.
Alors il y a du boulot pour éviter de mélanger toutes les couches comme tu le fais.
Ce que je vais te dire, c'est bcp bcp de boulot supplémentaire, mais c'est l'architecture "canonique" d'une appli J2EE qu'il faut apprendre à respecter.
Pour la couche web, il vaut mieux éviter de coder directement des JSP mais apprendre à utiliser un framework de présentation existant qui aidera à séparer les couches Model/View/Controller. Il y en a bcp, tu peux essayer Stripes (google Stripes framework), par exemple.
 
Ensuite, pour l'accès à la base de données, le codage en JDBC, c'est fini (ou ça devrait l'être). Aujourd'hui on utilise une couche d'abstraction qui permet un "mapping" entre les tables et les objets métier. Bien souvent, si le modèle de données n'est pas complètement stupide, on peut avoir une correspondance table <--> objet métier. Les ORM comme Ibatis, Hibernate ou JDO génèrent automatiquement des classes avec les requêtes pour la création, l'accès, l'update et le delete des éléments dans toutes les tables mappées. Les classes générées sont des DAO "Data Access Objects". Comme c'est du code généré, on n'y touche pas, on se contente d'utiliser ces classes pour récupérer/updater les données en base.
 
Ensuite il faut réfléchir à tes objets "métiers" nommés Value Objects (VO), qui sont typiquement des JavaBeans, càd des objets avec des attributs privés et des getters/setters (qui peuvent être générés automatiquement par un IDE comme eclipse) et une méthode toString() pour afficher leur contenu à tout moment. Comme les DAO, les VO sont bien souvent à l'image des tables (par contre, clés et autres contraintes d'intégrités ne sont pas mappées).
Par exemple si tu fais un site commerçant avec un caddie et des références produits que tu peux ajouter/enlever de ton caddie, tu peux typiquement créer des value objets ClientVO, CaddieVO et ReferenceVO. Les value objects sont des objets retournés ou passés en paramètre des objets "métier" (Business objects, BO) qui font le coeur de l'application. Comme leur nom l'indique, les VO ne sont que des objets légers qui contiennent des valeurs et ne font rien d'autre.
Ex:

Code :
  1. public class CaddieVO {
  2.   List<ReferenceVO> refListe;
  3.   List<ReferenceVO> getRefListe() { return refListe; }
  4.   void setRefListe(List<ReferenceVO> refListe) { this.refListe = refListe; }
  5.   String toString(){
  6.     StringBuffer str = new StringBuffer();
  7.     for(ReferenceVO ref: refListe) if(ref != null) str.append("{" + ref.toString() + "} " );
  8.     return str;
  9.   }
  10. }


 
C'est dans les BO que l'on va écrire les méthodes qui définissent l'application.
Par ex:  

Code :
  1. public class GestionCaddieBO{
  2.   public void ajoute(CaddieVO caddie, ReferenceVO ref){...}
  3.   public void supprime(CaddieVO caddie, ReferenceVO ref){...}
  4. }


Tu peux aussi avec une classe Caddie que tu utiliseras éventuellement dans la classe GestionCaddieBO

Code :
  1. public class CaddieBO{
  2.   ClientVO getClient(){ CaddieDAOFactory.getClient(); }
  3.   public void ajoute(ReferenceVO ref){ ReferenceDAOFactory.getInstance(getClient()).add(ref); }
  4.   public void supprime(ReferenceVO ref){ ReferenceDAOFactory.getInstance(getClient()).delete(ref);}
  5.   public void vide(){ // vide le caddie}
  6. }


La classe GestionCaddieBO se chargera alors de gérer les transactions ou autres.
Les VO sont aussi transmis à la couche présentation. Leur usage permet de fluidifier le transport de données à travers toutes les couches de l'application.  
Ainsi, si tu utilises Stripes, tu peux définir CaddieActionBean extends CaddieBO implements ActionBean, et ton VO est immédiatement utilisables par la couche de présentation. On peut aussi ajouter des propriétés intéressantes aux VO, comme implements serializable, ou les utiliser pour les XML-sérialiser avec une librairie comme xstream, par ex.
 
Comme tu le vois, par rapport à ce que tu fais, c'est un peu une usine à gaz, mais sur une appli non triviale, un tel découpage est bénéfique, pour ne pas dire nécessaire. Ne serait-ce que parce que toute la partie métier est maintenant facilement débogable au debogueur (c'est du Java pur et non des JSP), et qu'avec un  framework comme Stripes, il n'y a plus de code dans les JSP. Je ne sais pas si j'ai été clair, mais avec les tutoriels de Stripes, tu apprendras à reconnaitre les différents types d'objets.
 
(edit: et à part ça, dans ton code JDBC, il faut fermer le statement et la connexion dans une clause finally, mais de toute façon, ce n'est pas la bonne façon de faire des JSP)


Message édité par el muchacho le 01-06-2008 à 22:01:04

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 01-06-2008 à 00:44:20    

merci el muchacho de votre reponse
 
oui effectivement je sais qui'l existe des methodes maintenant avances pour traiter ca exemple (le strut...)
mais le probleme pour moi que ca c'est un projet de fin de formation qu'il faut developper avec servlet et jsp seulement et je sais pas  ou moment d' utiliser jsp et moment d utiliser servlet. :??:  

Reply

Marsh Posté le 01-06-2008 à 08:15:42    

En fait, je m'en doutais un peu. Tu peux quand même reprendre l'architecture ci-dessus sans framework web. Ce sera juste un petit peu plus long.
Si on t'interdit d'utiliser une couche d'abstraction de base de données, je te conseille de te créer quelques classes utilitaires du style (codé à l'arrache):

Code :
  1. public interface DbService {
  2.   void setConnexionParams(String URL);
  3.   String getConnexionParams();
  4.   int connect() throws ConnexionFailureException ;
  5.   int disconnect();
  6.   boolean isConnected();
  7. }
  8. public ConnexionFailureException extends Exception{}
  9. public class DbServiceImpl implements DbService{
  10.    // implémentation de l'interface
  11. }
  12. public class JDBCService extends DbServiceImpl {
  13.    ResultSet query(String s) throws SQLException, ConnexionFailureException;
  14.    void update(String table, String val) throws SQLException, ConnexionFailureException;
  15.    void update(String table, int val) throws SQLException, ConnexionFailureException;
  16.    etc
  17. }


Tu appelles cette classe dans le code de tes BO, et tu appelles tes BO et tes VO dans le code de tes JSP. Le but est de mettre le moins de code possible dans tes JSP afin de garder la séparation des couches. Je peux t'assurer que si tu respectes cette architecture, tu auras une bonne note. :)


Message édité par el muchacho le 01-06-2008 à 16:54:59

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 01-06-2008 à 14:40:55    

merci encore une fois  el muchacho pour votre réponse
s j'ai compris c'estde faire une classe métier java et faire appler au page servlet et jsp stp si tu auras un exemple de ce classe n'hésiter pas a m'envoyer merci d'avance

Reply

Marsh Posté le 01-06-2008 à 17:20:18    

Pas sous la main, mais on en trouve plein le web, à commencer par les applis d'eexemple livrés avec les frameworks.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed