Les informations sur les étudiants dans cet exemple ajoutent des transactions à la base de données (la transaction peut être soumise, les transactions peuvent être annulées et améliorées avec des threads locaux)
Index de page principale.jsp
<% @ Page Language = "Java" import = "java.util. *" Pageencoding = "utf-8"%> <% @ taglib uri = "http://java.sun.com/jsp/jstl/Core" Prefix = "C" %> <html> <a-head> <title> Student Management </Titre> </read> Value = "/ Query" />? Cmd = Query '> Afficher les informations de l'étudiant </a> <br> <br> <! - <a href = "<C: URL Value =' / StuderServlet? CMD = SAVE '/>"> Informations étudiantes Ajouter </a> -> <h2> Informations étudiantes Ajouter </h2> <formulaire Form =' <C: URL Value = "/ Query" />? Nom: <entrée type = "text" name = "name" /> <br> <br> <fieldset style = "border: solide; border-color: red; width: 250px;"> <gend> book1 </ légende> title: <input type = "text" name = "book" /> <br> <br> Price: <entrée = "text" name = "Price" /> </ fieldset> Style = "Border: Solid; Border-Color: Green; Width: 250px;"> <gend> livre 2 </gend> Titre: <Input Type = "Text" name = "book" /> <br> <br> Price: <Input Type = "Text" name = "Price" /> </ Fieldsset> <br> <br> <Entrée Type = "Soudre" Value = "Soumide" /> <br> <br> <br> <Form> </ body> </html>
Outil pour obtenir la connexion de la base de données Connutils5.java
Package cn.hncu.utils; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; import java.lang.reflect.proxy; import java.sql.connection; import java.sql.Drivermanager; import java.util.Arraylist; import java.util. java.util.properties; classe publique Connutils5 {// Objet de gestion de threads local, utilisé pour implémenter: La connexion obtenue par le même thread est le même threadlocal statique privé <Connexion> T = nouveau ThreadLocal <Connexion> (); Liste statique finale privée <Connexion> pool = new ArrayList <Connexion> (); Taille privée statique statique; // Lire private connutils5 () {} static {Properties p = new Properties (); Essayez {// La méthode suivante peut lire le fichier de ressources sous ClassPath dans un projet Java pur, mais le projet Javaee ne peut pas être lu. Parce que Tomcat a modifié le chargeur de classe par défaut du système //p.load (classloader.getSystemClassloader (). GetSystemResourceStream ("jdbc.properties")); // P.Load (classloader.getSystemResourceSstream ("jdbc.properties")); // Lire le fichier de ressources sous le chemin de classe du projet Web, utilisez-le pour p.load (connutils3.class.getClassLoader (). GetResourceSstream ("jdbc.properties")); String Driver = P.GetProperty ("Driver"); String url = p.getProperty ("URL"); String name = p.getProperty ("nom d'utilisateur"); String pwd = p.getProperty ("mot de passe"); String ssize = p.getProperty ("taille"); Size = Integer.ParseInt (SSIZE); Class.forname (pilote); for (int i = 0; i <size; i ++) {Final Connection con = driverManager.getConnection (URL, nom, pwd); System.out.println ("Con ==" + Con); // Modifier la méthode conn.close () // Utilisez le mode proxy pour générer une version améliorée de l'objet Conn, intercepter et modifier sa méthode close () en objet ncon = proxy.newproxyinstance (connutils3.class.getClassloader (), // Conn.getClass (). Programme actuel (Le chargeur de classe est différent) Nouvelle classe [] {connection.class}, new invocationhandler () {@Override public objet invoke (objet proxy, méthode de la méthode, objet [] args) lance throwable {if (method.getName (). retourner null;} return method.invoke (con, args); pool.add ((connexion) nCon); }} catch (exception e) {e.printStackTrace (); }} Connexion publique publique statique GetConnection () {// Profitez de T en premier, s'il y en a un, retirez-le. Sinon, saisissez-le dans le pool et mettez l'objet dans la connexion T Con = T.get (); if (con == null) {if (pool.size () <= 0) {System.out.println ("La connexion dans le pool est partie ..."); essayez {thread.sleep (1000); } catch (InterruptedException e) {e.printStackTrace (); } return getConnection (); } con = pool.remove (0); t.set (con); // mettez-le dans t} return con; // obtenez-en un pour en déplacer un}}Fichier de ressources JDBC.Properties
## mysqldriver = com.mysql.jdbc.DriverUrl = jdbc: mysql: //127.0.0.1: 3306 / hncu? Useunicode = true & worseencoding = utf-8userName = rootpasswor D = 1234Size = 3 ## Oracle # Driver = Oracle.jdbc.Driver.oracledriver # url = JDBC: Oracle: mince: @ 127.0.0.1: 1521: ORCL # Username = Scott # Password = Tiger
Valeur de la valeur
Étalon
package cn.hncu.domain; import java.util.arraylist; import java.util.list; / * * méthode pour créer un objet de valeur carré "une" dans un seul * / classe publique class Stud {private string id; nom de chaîne privé; // ※ Ajoutez une collection spécifiquement pour "multi" carrés --- reflétant la "relation un à plusieurs" dans une liste privée multi-table <Book> Books = New ArrayList <Book> (); // Notez que la collection doit être nouvelle à la construction ou avant. public String getID () {return id; } public void setid (String id) {this.id = id; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; } public List <Book> getBooks () {return books; } public void setbooks (list <book> books) {this.books = books; } @Override public String toString () {return "id =" + id + "," + name + "," + books; }}Livre.java
Package cn.hncu.domain; / * * Méthode de création d'objets de valeur carrée multi "dans un livre de classe un-à-plusieurs * / public {ID entier privé; // Tous les types de données de base sont déclarés par la classe d'emballage pour se préparer à une utilisation future des frameworks --- La classe d'emballage est compatible avec les frameworks (car généralement les frameworks utilisent la réflexion de classe) le nom de chaîne privé; double prix privé; // ※ Ajoutez une variable de type d'objet spécifiquement pour "un" carré (note, n'utilisez pas d'études) --- reflétez la "relation un à many" dans plusieurs tables Stud privé S; // définir le maître // String privé Studyd; // ★★ Ne définissez pas public Integer getID () {return id; } public void setid (INGER ID) {this.id = id; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; } public double getPrice () {prix de retour; } public void setPrice (double prix) {this.price = prix; } public stud get () {return s; } public void sets (stud s) {this.s = s; } / * * Lorsque l'association multi-table, vous devriez prêter attention à un piège, c'est-à-dire qu'une partie publie l'autre partie, et l'autre partie sort à son tour la partie précédente, formant une récursivité infinie! * / @Override public String toString () {return "id =" + id + "," + name + "," + prix; // L'objet Stud ne peut pas être sorti ici, sinon la récursivité infinie}}Couche de servoie de serviette queyservlet.java
Package cn.hncu.stud.servlet; import java.io.ioexception; importer java.util.list; import java.util.map; import javax.servlet.servletException; import javax.servlet.http.httpleservlet; import javax.servlet.http.https javax.servlet.http.httpservletResponse; import Cn.hncu.domain.book; import Cn.hncu.domain.stud; import Cn.hncu.stud.service.istudservice; import Cn.hncu.stud.service.studServiceIml ISTUDSERVICE Service = new StudServiceImpl (); public void doGet (demande httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {doPost (request, réponse); } public void doPost (request httpServLetRequest, httpsservletResponse réponse) lève Servlexception, ioException {String cmd = request.getParameter ("cmd"); System.out.println ("CMD:" + CMD); if ("query" .equals (cmd)) {query (request, réponse); } else if ("add" .equals (cmd)) {add (request, réponse); }} public void Query (HttpServletRequest Request, HttpServletResponse Response) lève ServletException, ioException {list <map <string, string >> studs = service.query (); request.setAttribute ("studs", studs); request.getRequestDispatcher ("/ jsps / show.jsp"). Forward (demande, réponse); } public void add (HttpServLetRequest Request, HttpServletResponse Response) lève ServletException, ioException {// 1 Collect Paramètres 2 Organize Paramètres (le champ ID est laissé dans DAO pour compléter) Nom de chaîne [] = request.getParameTervalues ("Name"); System.out.println (nom [0]); Stud S = new Stud (); S.SetName (nom [0]); // Book Information String Books [] = request.getParameTervalues ("Book"); // Protect --- La protection des prix doit également être écrite, ici nous sommes paresseux si (livres == null || books.length <= 0) {return; } Prix de chaînes [] = request.getParameTervalues ("Price"); for (int i = 0; i <books.length; i ++) {book b = new book (); B.SetName (livres [i]); B.SetPrice (double.Parsedouble (prix [i])); // ※ Complétez la relation "un à plusieurs" de deux objets de valeur s.getBooks (). Add (b); // B.Sets (s) à un parti; // plusieurs parties} // 3Call Service Layer Try {Service.Save (S); } catch (exception e) {// Page de mise en échec de la direction}}}L'interface de couche de service de la couche de goujon:
package cn.hncu.stud.service; import java.util.list; import java.util.map; import cn.hncu.domain.stud; interface publique iStudService {public list <map <string, string >> query (); public void Save (Stud Stud);}Classe d'implémentation
Package CN.HNCU.STUD.SERVICE; IMPORT JAVA.SQL.CONNECTION; IMPORT JAVA.SQL.SQLEXception; Import Java.util.List; Importer Java.util.map; Import Cn.hncu.Domain.Stud; cn.hncu.stud.dao.bookjdbcdao; Importer cn.hncu.stud.dao.studdao; import Cn.hncu.utils.connutils3; / * à l'avenir, nous utilisons généralement un tableau pour fonctionner de manière indépendante. S'il y a plusieurs tables entités dans le système, écrivez quelques DAO. * À l'avenir, le cadre le fera, et nous devons le faire, car l'architecture est bonne! * * En cas d'utilisation de transactions: * 1. S'il n'y a qu'un seul DAO, mais plusieurs instructions SQL doivent être exécutées et ajouter, supprimer et modifier, la transaction doit être ouverte. 2. Si un service appelle plusieurs DAO, la transaction doit également être ouverte. * / classe publique StudServiceIMPl implémente iStudService {// inject Studdao dao_stud = new StudJdbcdao (); Bookdao dao_book = new bookjdbcdao (); @Override public list <map <string, string >> query () {return dao_stud.query (); } @Override public void Save (stud stud) {connection con = null; essayez {con = connutils3.getConnection (); System.out.println ("Obtenez un lien:" + con); con.setAutoCommit (false); dao_stud.save (stud); dao_book.save (stud.getBooks ()); System.out.println ("Commit une transaction ..."); Con.Commit (); } catch (exception e) {try {System.out.println ("Rolle Back a Transaction ..."); con.rollback (); } catch (sqlexception e1) {e1.printStackTrace (); }} enfin {try {con.setautoCommit (true); con.close (); } catch (sqlexception e) {e.printStackTrace (); }}}} La couche Dao de la couche Stu
Interface de goujon
package cn.hncu.stud.dao; import java.util.list; import java.util.map; import cn.hncu.domain.stud; interface publique Studdao {public list <map <string, string >> query (); public void Save (Stud Stud) lève une exception;}Classe d'implémentation de goujon
package cn.hncu.stud.dao; import java.sql.connection; import java.sql.preparedstatement; import java.sql.resulttset; import java.sql.sqlexception; import java.sql.statement; import java.util.arraylist; import java.util.hashmap; java.util.list; importer java.util.map; import java.util.uuid; import Cn.hncu.domain.book; import Cn.hncu.domain.stud; import Cn.hncu.utils.connutils3; public class Studjdbcdao Implements Studdao {@Override Public List <map List <map <string, string >> list = new ArrayList <map <string, string >> (); // Une carte est une ligne de données, la liste <map> est la connexion entière de la table de données con = null; essayez {con = connutils3.getConnection (); Instruction st = con.createStatement (); String SQL = "SELECT * FROM Stud"; ResultSet rs = St.ExecuteQuery (SQL); while (Rs.Next ()) {map <string, string> m = new HashMap <String, String> (); m.put ("id", (String) Rs.GetObject (1)); m.put ("name", (String) Rs.GetObject (2)); list.add (m); } Rs.Close (); St.Close (); } catch (sqlexception e) {e.printStackTrace (); } enfin {try {con.close (); } catch (sqlexception e) {e.printStackTrace (); }} Retour List; } @Override public void Save (stud stud) lève une exception {connexion con = connutils3.getConnection (); System.out.println ("Obtenez un lien:" + con); String sql = "Insérer dans les valeurs de goujon (?,?)"; String UUID = uUid.randomuuid (). ToString (). Remplace ("-", ""); Préparé PST = CON.PrepareStatement (SQL); Stud.setid (UUID); // Pour "plusieurs parties", c'est-à-dire que le livre peut obtenir l'ID "One Party", il est spécialement complété par PST.SetString (1, UUID); PST.SETSTRING (2, Stud.GetName ()); System.out.println ("1:" + uuid + ", 2:" + stud.getName ()); pst.executeupdate (); // con.close (); // obtient le même con, il n'est pas nécessaire de le fermer ici}}Interface de livre
Le package cn.hncu.stud.dao; import java.util.list; import cn.hncu.domain.book; interface publique bookdao {public void Save (list <book> books) lève une exception;};Classe d'implémentation de livre
Package CN.hncu.stud.dao; Import Java.sql.Connection; Import Java.Sql.PreparedStation; Importer Java.util.list; Importer CN.HNCU.Domain.Book; Import Cn.hncu.utils.connuls3; Public Class Bookjdbcdao Implementation Bookdao {@override VOIC livres) lève une exception {connexion con = connutils3.getConnection (); System.out.println ("Obtenez un lien:" + con); String sql = "Insérer dans le livre (nom, prix, studid) valeurs (? ,?)"; Préparé PST = CON.PrepareStatement (SQL); pour (livre b: livres) {pst.setstring (1, b.getName ()); PST.SetDouble (2, B.GetPrice ()); PST.SetObject (3, "12132312"); // Exception (Donnez délibérément un champ de clé étrangère inexistante pour tester le rollback de transaction) -Test Rollback // PST.SetObject (3, b.gets (). getID ()); System.out.println ("1:" + b.getName () + ", 2:" + b.getprice () + ", 3:" + b.gets (). GetID ()); pst.addbatch (); // ajouter à Batch} PST.ExecuteBatch (); // Exécuter un lot // con.close (); // Obtenez le même con ici, pas besoin de fermer ici}}Afficher la page des informations de l'étudiant JSPS / show.jsp
<% @ Page Language = "Java" Import = "Java.util. *" Pageencoding = "UTF-8"%> <% @ Taglib uri = "http://java.sun.com/jsp/jstl/core" Prefix = "C"%> <html> <hadif> <t titre> Information Student Management </itle> </read> <c: foreach items = "$ {studs}" var = "x"> $ {x.id}, $ {x.name} <br/> </c: foreach> </odody> </html>Image de reproduction:
Pour plus d'informations sur le système de gestion, veuillez cliquer sur "Sujet spécial du système de gestion" pour apprendre
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.