Montrer JDBC ResultSet en HTML dans la page JSP en utilisant MVC et DAO schéma
Je suis la mise en œuvre de MVC à l'aide de JSP, JDBC. J'ai importé une base de données de fichier de classe de mon fichier JSP et je voudrais afficher les données d'une table DB. Je ne sais pas comment je dois retourner le ResultSet
de la classe Java à la page JSP et de l'intégrer en HTML.
Comment puis-je y parvenir?
Vous devez vous connecter pour publier un commentaire.
Dans un système bien conçu MVC approche, les JSP de fichier ne doit pas contenir de ligne de code Java et la classe de servlet ne doit pas contenir de ligne de code JDBC.
En supposant que vous souhaitez afficher une liste de produits dans une boutique en ligne, le code suivant doit être créé.
Un
Product
classe représentant une entité du monde réel d'un produit, il doit être juste un Javabean.Un DAO classe qui fait tout le méchant JDBC travail et renvoie une belle
List<Product>
.Un servlet classe qui obtient la liste et la met dans la demande portée.
Enfin un JSP fichier dans
/WEB-INF/products.jsp
qui utilise JSTL<c:forEach>
pour itérer surList<Product>
qui est disponible dans EL par${products}
, et utilise JSTL<c:out>
pour échapper propriétés de la chaîne afin d'éviter XSS trous quand il s'agit de l'utilisateur entrée contrôlée.À le faire fonctionner, il suffit d'appeler la servlet par son URL. À condition que la servlet est annoté
@WebServlet("/products")
ou mappé dansweb.xml
avec<url-pattern>/products</url-pattern>
, alors vous pouvez l'appeler parhttp://example.com/contextname/products
Voir aussi:
@Stateless
EJB comme@EJB private ProductDAO productDAO;
, de sorte que les transactions sont entièrement géré de façon transparente. Mais vous pouvez ce particulier base JDBC exemple bien sûr aussi instancier quelque façon que vous aimez dans la servletinit()
méthode si votre environnement ne prend pas en charge les Ejb (ex: Tomcat).init()
ou dansServletContextListener
'scontextInitialized()
.<context-param>
valeurs deweb.xml
.ProductDAO
dans leinit()
méthode de la Servlet oucontextInitialized()
deServletContextListener
partagés à travers toutes les demandes?@Stateless
(ou@Stateful
) ... et pour remplacer tout ce qui JDBC gâchis par une JPA oneliner, après tout (sauf si vous êtes de jouer avec les vieux de dix ans les technologies et les approches pour le pur des fins d'apprentissage 😉 )product
venir à partir d'une base de données et il est très probable que ceux qui sont entrées par l'utilisateur. Comme je l'ai appris, et la sécurité ne doit pas être une réflexion après coup. Même lorsqu'il n'est pas à penser à la sécurité, l'utilisation de<
et&
va donner des problèmes. Cependant, ma question est: où pour mettre en œuvre le codage? En ce moment j'utilise${Encode.forHtml(var)}
dans la page JSP, mais je pense que ce n'est pas la meilleure solution, comme c'est le code Java dans les pages JSP. Lors de l'obtention des valeurs de la base de données est également pas le meilleur point, comme l'encodage doit être utilisé sur la production, et non pas lors de la lecture d'une BD.MVC, dans un contexte d'application web, ne consiste pas dans l'aide d'une classe à partir d'une JSP. Il consiste à utiliser le modèle suivant :
Depuis la JSP utilise habituellement des balises JSP (la JSTL, par exemple) et l'expression JSP le langage, et depuis balises JSP et EL sont conçues pour obtenir des informations à partir de JavaBeans, vous feriez mieux d'avoir vos données dans le formulaire de JavaBeans ou des collections de JavaBeans.
Le rôle du contrôleur (la classe de l'action) est donc de récupérer les données, créer des JavaBean instances contenant les données dans un format approprié pour les JSP, les mettre dans les attributs de la requête, puis à l'expédition de la JSP. La JSP va alors parcourir le JavaBean instances et d'afficher ce qu'ils contiennent.
Vous ne devez pas mettre en œuvre le framework MVC vous-même. Existants (Rayures, des jambes, etc.)
Je ne sais pas comment dois-je retourner le jeu de résultats à partir du fichier de la classe à la page JSP
Bien, vous n'avez pas.
Le point de MVC est de séparer votre modèle ( le M DB d'info dans ce cas ) à partir de votre point de vue ( V une jsp, dans ce cas ) de cette manière, vous pouvez modifier l'affichage sans freinage d'application.
Pour ce faire, vous pouvez utiliser un objet intermédiaire pour représenter vos données ( généralement appelé DTO - après l'Objet de Transfert de Données -, je ne sais pas comment ils appellent ça de nos jours ), et d'autres objets à récupérer ( généralement un DAO ).
Donc, fondamentalement, vous avez votre fichier JSP, obtenir les paramètres de la requête, puis d'appeler une méthode de la DAO. Le dao, l'interne a les moyens de se connecter à la base de données et extraire les données et crée des collections de DTO qui sont retournés à la JSP pour le rendu.
Quelque chose comme cela simplifiée à l'extrême ( et l'insécurité ) code:
Employee.java
EmployeeDAO.java
employé.jsp
J'espère que cela vous donnera une meilleure idée.
Vous pouvez utiliser le
<c:forEach >
tagvous pouvez trouver un exemple détaillé dans le lien suivant exemple d'utilisation
Je pense que ce sera mieux pour vous de contenir les données de la table dans une collection comme la liste et retourne la liste de la classe Java et la réutilisation de cette collection dans la page JSP.
ResultSet
(etStatement
etConnection
) en dehors de la portée de la méthode où elle a été acquise est une mauvaise pratique. Vous seriez incapable de le fermer dans le droit de la portée et donc vous perdez de la DB ressources. Sur le long terme, l'application plante parce que DB a court de ressources.