La información del estudiante en este ejemplo agrega transacciones a la base de datos (la transacción se puede enviar, las transacciones se pueden retroceder y mejorar con los hilos locales)
Página principal índice.jsp
<%@ page lenguaje = "java" import = "java.util.*" PageEncoding = "Utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <html> <shead> <bitle> estudiante de gestión de la información </title> </head> <body> <body> <Art) <Arly <coder> <Art <Art <Art <Arly <Art <Art <Art <Art <Arly <Art <A HEHLY <A HEMLY <A HREFEMF. value = "/QUERY"/>? CMD = QUIERY '> Ver información del estudiante </a> <br> <br> <!-<a href = "<c: url value ='/studservlet? cmd = save '/>"> información del estudiante agregar </a>-> <h2> Información del estudiante ADD </h2> <Action de formulario =' <c: Value url = "/query"/>>? Nombre: <input type = "text" name = "name"/> <br> <br> <br> <Fieldset style = "border: sólido; border-color: rojo; ancho: 250px;"> <legend> book1 </legend> title: <input type = "text" name = "libro"/> <br> <br> precio: <input type = "text" name = "precio" style = "Border: Solid; Border-Color: Green; Width: 250px;"> <legend> Libro 2 </legend> Título: <input type = "text" name = "book"/> <br> <br> Price: <input type = "text" name = "precio"/> </fieldset> <br> <br> <input type = "Subting" Subt = "Subsit"/> <<r> <br> <br> <br> <br> <br> <br> <br> </body> </html>
Kit de herramientas
Herramienta para obtener conectilos de conexión de base de datos 5.Java
paquete 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.sql.Squister; java.util.properties; public class Connutils5 {// Objeto de gestión de subprocesos local, utilizada para implementar: la conexión obtenida por el mismo hilo es el mismo shifhlocal estático privado <Conexión> t = new ThreadLocal <Enection> (); Lista estática final privada <Enection> Pool = New ArrayList <Enection> (); Tamaño de intstatat intivate privado; // Leer connutils private5 () {} static {Propiedades p = new Properties (); Pruebe {// El siguiente método puede leer el archivo de recursos en classpath en un proyecto Java puro, pero el proyecto Javaee no se puede leer. Porque Tomcat cambió el cargador de clase predeterminado del sistema //p.load (classloader.getSystemClassLoader (). // P.Load (classLoader.getSystemResourceASStream ("JDBC.Properties")); // Lea el archivo de recursos en el ClassPath del proyecto web, use esto en P.Load (connutils3.class.getClassLoader (). GetResourceASStream ("JDBC.Properties")); Controlador de cadena = p.getProperty ("controlador"); String url = p.getProperty ("url"); Name de cadena = p.getProperty ("nombre de usuario"); Cadena pwd = p.getProperty ("contraseña"); Cadena ssize = p.getProperty ("tamaño"); Size = Integer.ParseInt (ssize); Class.forname (controlador); for (int i = 0; i <size; i ++) {Conexión final con = drivermanager.getConnection (url, nombre, pwd); System.out.println ("con =="+con); // Cambie el método conn.close () // use el modo proxy para generar una versión mejorada del objeto conn, intercepte y cambie su método Cerrar () a objeto ncon = proxy.newproxyInstance (connutils3.class.getClassLoader (), // conn.getClass (). GetInterfaces (), // Este método no funciona, es que el controlador de la implementación en el controlador está en el mismo espacio en el controlador en el mismo espacio en el controlador en el mismo espacio en el controlador en el mismo espacio en el mismo espacio en el controlador en el mismo espacio en el mismo espacio en el controlador en el mismo espacio en el control de la misma manera que está en el mismo espacio en el que está en el mismo espacio en el mismo espacio en el que no funciona en el que no funciona en el que no funciona, lo que no funciona en el que no funciona, lo que no funciona, lo que debe ser el que está en el mismo espacio. programa (el cargador de clases es diferente) nueva clase [] {Connection.Class}, New InvocationHandler () {@Override Public Object Invoke (Object Proxy, Method Method, Object [] Args) lanza showable {if (método.getName (). Equals ("Close") {System.Println ("Devuelve un enlace:"+(Conexión); nulo; Pool.add ((conexión) ncon); }} catch (Exception e) {E.PrintStackTrace (); }} Public static sincronizada conexión getConnection () {// Get de t primero, si hay una, tómelo. Si no, agarrarlo en la piscina y colocar el objeto en t conexión con = t.get (); if (con == null) {if (prool.size () <= 0) {system.out.println ("La conexión en el grupo se ha ido ..."); intente {Thread.sleep (1000); } catch (InterruptedException e) {E.PrintStackTrace (); } return getConnection (); } Con = Pool.remove (0); t.set (con); // Ponlo en t} return con; // consigue uno para mover uno}}interino
paquete 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.sqlException; public classproxy Implements invocationHandler {privado ObjectsCoBj = NULL = NULL = NULLT = NULL; privado txproxy (objeto srcobj) {this.srcobj = srcobj; } Public Static Object getProxy (objeto srcobj) {system.out.println ("srcobj:"+srcobj); Objeto newobj = proxy.newproxyInstance (txproxy.class.getClassLoader (), srcobj.getclass (). GetInterfaces (), nuevo txproxy (srcobj)); System.out.println ("Newobj:"+newobj); devolver newobj; } @Override public Object Invoke (Object proxy, método método, objeto [] args) lanza lando {conexión con = null; Objeto returnobj = null; intente {con = connutils5.getConnection (); System.out.println ("Invoke Get a Get a Link:"+Con); con.setAutOcommit (falso); returnObj = Method.Invoke (srcobj, args); System.out.println ("Enviar una transacción ..."); con.commit (); } catch (Exception e) {try {System.out.println ("rodando una transacción ..."); con.rollback (); } catch (sqlexception e1) {e1.printstackTrace (); }} finalmente {try {con.setAutOcommit (true); con.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }} return returnObj; }}Agente 2: No hay necesidad de forzar la transferencia, pero todo
paquete 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.sqlexception; public class txproxy2 invocatementhler {privado objetos; privado txproxy2 (objeto srcobj) {this.srcobj = srcobj; } public static <t> t getProxy (clase <t> c) {object obj = null; intente {obj = c.newinstance (); } catch (Exception e) {E.PrintStackTrace (); } Objeto newobj = proxy.newproxyInstance (txproxy2.class.getclassloader (), c.getInterfaces (), nuevo txproxy2 (obj)); return (t) newobj; } @Override public Object Invoke (Object proxy, método método, objeto [] args) lanza lando {conexión con = null; Objeto returnobj = null; intente {con = connutils5.getConnection (); System.out.println ("Invoke Get a Get a Link:"+Con); con.setAutOcommit (falso); returnObj = Method.Invoke (srcobj, args); System.out.println ("Enviar una transacción ..."); con.commit (); } catch (excepción e) {try {System.out.println ("Rolle hacia atrás una transacción ..."); con.rollback (); } catch (sqlexception e1) {e1.printstackTrace (); }} finalmente {try {con.setAutOcommit (true); con.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }} return returnObj; }}anotación
paquete cn.hncu.utils; import java.lang.annotation.ElementType; import java.lang.annotation.retention; import java.lang.annotation.retentionPolicy; import java.lang.annotation.target; @Target (valor = elementType.method) @retention {}Agente 3: Use anotaciones para implementar transacciones cuando sea necesario
paquete 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.sqlexception; public class txproxy3 invocationhandler {privado objetos; privado txproxy3 (objeto srcobj) {this.srcobj = srcobj; } public static <t> t getProxy (t srcobj) {object newobj = proxy.newproxyInstance (txProxy3.class.getClassLoader (), srcobj.getClass (). getInterfaces (), nuevo txproxy3 (srcobj)); return (t) newobj; } @Override public Object Invoke (Proxy de objeto, método Método, objeto [] args) lanza lanzable { /* de esta manera para implementar solo interceptando el método especificado if (método.getName (). Equals ("Close")) {... Intercept} else {return Method.invoke (srcobj, args); } */ if (método.IsannotationPresent (transaccion.class)) {Connection con = null; Objeto returnobj = null; intente {con = connutils5.getConnection (); System.out.println ("Invoke Get a Get a Link:"+Con); con.setAutOcommit (falso); // código comercial real, versión returnobj = método.invoke (srcobj, args); System.out.println ("Enviar una transacción ..."); con.commit (); } catch (excepción e) {try {System.out.println ("Rolle hacia atrás una transacción ..."); con.rollback (); } catch (sqlexception e1) {e1.printstackTrace (); }} finalmente {try {con.setAutOcommit (true); con.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }} return returnObj; } else {System.out.println ("No hay anotación de transacciones, ¡simplemente suelte!"); return Method.invoke (srcobj, args); }}}Archivo de recursos JDBC.Properties
## mysqlDriver = com.mysql.jdbc.driverurl = jdbc: mysql: //127.0.0.1: 3306/hncu? UseUnicode = true & caracteringoding = utf-8Username = rootpasswor d = 1234Size = 3 ## Oracle#Driver = oracle.jdbc.driver.oracledriver#url = jdbc: oracle: delgado:@127.0.0.1: 1521: orcl#username = scott#contraseña = tiger
QueryServlet.java Servlet capa de capa de perno
paquete cn.hncu.stud.servlet; import java.io.ioexception; import java.util.list; import java.util.map; import javax.servlet.servletexception; import javax.servlet.http.htttttttpServlet; import javax.servlet.http.httpservletRequest; importar; 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.studserviceImpl; import cn.hncu.utilils.txy3; QueryServlet extiende httpservlet {//inject//1.// istudservice servicio = (istudservice) txproxy.getProxy (new studserviceImpl ()); //2.// Istudservice Service = txproxy2.getProxy (studserviceImpl.class); // 3. Istudservice servicio = txproxy3.getProxy (new studServiceImpl ()); Public void doget (httpservletRequest, respuesta, respuesta httpservletResponse) lanza ServletException, ioexception {dopost (solicitud, respuesta); } public void dopost (httpservletRequest solicitud, respuesta httpServletResponse) lanza ServletException, ioException {String cmd = request.getParameter ("cmd"); System.out.println ("cmd:"+cmd); if ("consulta" .equals (cmd)) {consulta (solicitud, respuesta); } else if ("agregar" .equals (cmd)) {add (request, respuesta); }} Public void Query (HttpServletRequest Solicitud, respuesta httpservletResponse) lanza ServletException, ioexception {System.out.println ("Servicio:"+Servicio); List <map <string, string >> studs = servicio.query (); request.setAttribute ("Studs", Studs); request.getRequestDIsPatcher ("/jsps/show.jsp"). Forward (solicitud, respuesta); } public void add (httpservletRequest solicitud, httpservletResponse respuesta) arroja servletException, ioexception {// 1 recopilar parámetros 2 organizar parámetros (deje el campo de identificación en DAO a suplemento) nombre de cadena [] = request.getParametervalues ("nombre"); Stud S = New Stud (); s.setName (nombre [0]); // Book Information String Books [] = request.getParametervalues ("libro"); // Proteger --- La protección de precios también debe escribirse. Somos perezosos aquí si (books == null || books.length <= 0) {return; } Precios de cadena [] = request.getParametervalues ("precio"); para (int i = 0; i <books.length; i ++) {libro b = nuevo libro (); B.SetName (libros [i]); B.SetPrice (doble. PARSEDOBLE (precios [i])); // ※ Complete la encapsulación de datos de la relación "One to-Many" entre dos objetos de valor s.getBooks (). ADD (B); // Única B.Sets (s); // Party múltiple} // 3 Llame a la capa de servicio Pruebe {Service.save (s); } catch (excepción e) {// Página fallida de dirección}}} La capa de servicio de la capa de perno
interfaz:
paquete cn.hncu.stud.service; import java.util.list; import java.util.map; import cn.hncu.domain.stud; import cn.hncu.utils.transaction; interfaz pública istudservice {lista pública <map <string, string >> quyer (); // Tenga en cuenta que las anotaciones solo son útiles en la interfaz, el método escrito en la clase de implementación no es válida (no decidirá iniciar la transacción) @Transaction public void save (Stud Stud) arroja una excepción;}Clase de implementación
paquete cn.hncu.stud.service; import java.sql.connection; import java.sql.sqlexception; import java.util.list; import java.util.map; import cn.hncu.domain.stud; import cn.hncu.stud.dao.bookdao; importar; import cn.hncu.stud.dao.bookdao; import cn.hncu.stud.dao.bookjdbcdao; import cn.hncu.stud.dao.studdao; import cn.hncu.utils.connutils5;/*Por lo general, usamos una tabla para operar independientemente durante el desarrollo futuro. Si hay varias tablas de entidad en el sistema, escriba algunas DAO. * En el futuro, el marco hará esto, y debemos hacer esto, ¡porque la arquitectura es buena! * * En el caso de usar transacciones: * 1. Si solo hay un DAO, pero se deben ejecutar múltiples declaraciones SQL y agregar, eliminar y modificar, la transacción debe abrirse. 2. Si un servicio llama a múltiples DAO, la transacción también debe abrirse. */public class StudServiceImpl implementa Istudservice {// inyect studdao dao_stud = new studjdbcdao (); Bookdao dao_book = nuevo bookJdbcdao (); @Override Public List <Map <String, String >> Query () {return dao_stud.query (); } @Override public void save (Stud Stud) lanza la excepción {dao_stud.save (stud); dao_book.save (stud.getBooks ()); }} La capa Dao de la capa STU
Práctica de separación de la interfaz de semental, una tabla corresponde a un DAO, prepárese para el marco
paquete cn.hncu.stud.dao; import java.util.list; import java.util.map; import cn.hncu.domain.stud; interfaz pública studdao {lista pública <map <string, string >> query (); Public void save (stud stand) lanza la excepción;}Clase de implementación de sementales
paquete cn.hncu.stud.dao; import java.sql.connection; import java.sql.preparedStatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.Statement; import java.util.arraylist; import java.util.util.util.util. java.util.list; import 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 implementa studdao {@override <map <string> byer (studjdbcdao implementa studdao {@override <map <string> Sing {>>>>) List <map <string, string >> list = new ArrayList <map <string, string >> (); // Un mapa es una fila de datos, la lista <s map> es la conexión de tabla de datos completa con = null; intente {con = connutils3.getConnection (); Declaración st = con.createStatement (); Cadena sql = "seleccionar * de 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 ("nombre", (cadena) rs.getObject (2)); list.add (m); } rs.close (); St.Close (); } Catch (Sqlexception e) {E.PrintStackTrace (); } finalmente {try {con.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }} lista de retorno; } @Override public void save (stud stud) lanza la excepción {Connection con = connutils3.getConnection (); System.out.println ("Obtener un enlace:"+Con); Cadena sql = "insertar en los valores del perno (?,?)"; Cadena uuid = uuid.randomuuid (). ToString (). Reemplazar ("-", ""); Preparado PST = Con.PrepareStatement (SQL); stud.setId (uuid); // Para "múltiples partes", es decir, el libro puede obtener la identificación de "una parte", se complementa especialmente con pst.setstring (1, uuid); pst.setString (2, stud.getName ()); System.out.println ("1:"+uuid+", 2:"+stud.getName ()); pst.executeUpdate (); // con.close (); // Obtenga la misma estafa, no hay necesidad de cerrarlo aquí}}Interfaz de libros
paquete cn.hncu.stud.dao; import java.util.list; import cn.hncu.domain.book; interfaz pública bookdao {public void save (list <book> books) arroja excepción;}Clase de implementación de libros
package cn.hncu.stud.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.util.List;import cn.hncu.domain.Book;import cn.hncu.utils.ConnUtils3;public class BookJdbcDao implements BookDAO { @Override public void save(List<Book> libros) lanza la excepción {Connection Con = Connutils3.getConnection (); System.out.println ("Obtener un enlace:"+Con); Cadena sql = "insertar en el libro (nombre, precio, estudios) valores (?,?,?)"; Preparado PST = Con.PrepareStatement (SQL); para (libro B: libros) {Pst.setString (1, b.getName ()); pst.setDouble (2, b.getPrice ()); pst.setObject (3, "12132312"); // Excepción (Deliberadamente, proporcione un campo de clave extranjera inexistente para probar la reversión de la transacción) -La de transacción de la prueba Rollback // Pst.SetObject (3, B.gets (). getId ()); System.out.println ("1:"+B.getName ()+", 2:"+B.getPrice ()+", 3:"+B.gets (). GetId ()); pst.addbatch (); // Agregar al lote} pst.executeBatch (); // ejecutar lotes // con.close (); // Obtenga la misma estafa aquí, no es necesario cerrar aquí}} Value Objeto
Objeto
paquete cn.hncu.domain; import java.util.arrayList; import java.util.list;/** método para crear un objeto de valor cuadrado "un" en uno a Many*/public class Stud {private String id; nombre de cadena privada; // ※ Agregue una colección específicamente para cuadrados "multi", reflejando la "relación de uno a muchos" en una lista privada de la mesa <book> books = new ArrayList <Book> (); // Tenga en cuenta que la colección debe ser nueva en o antes de la construcción. public String getId () {return id; } public void setid (ID de cadena) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } Lista pública <Book> getBooks () {return books; } public void setbooks (List <Book> Books) {this.books = books; } @Override public string toString () {return "id =" + id + "," + nombre + "," + libros; }}Objeto de libro
paquete cn.hncu.domain;/** Método para crear objetos de valor cuadrado "multi" en uno a grany*/public class Book {private entero ID; // Los tipos de datos básicos son declarados por la clase de empaque para prepararse para el uso futuro de los marcos --- la clase de empaque es compatible con los marcos (porque generalmente los marcos usan la reflexión de la clase) Nombre de cadena privada; precio doble privado; // ※ Agregue una variable de tipo de objeto específicamente para "un" cuadrado (nota, no use StudyD) --- refleje la "relación de uno a muchos" en múltiples tablas privadas de stud s; // establecer el maestro // string privado studingd; // ★★ No configure el entero público getId () {return Id; } public void setid (ID de entero) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public Double GetPrice () {Return Price; } public void setPrice (doble precio) {this.price = precio; } Public Stud gets () {return s; } sets public void (stud s) {this.s = s; } / * * Cuando la asociación múltiple, debe prestar atención a una trampa, es decir, una parte emite a la otra parte, y la otra parte a su vez genera la parte anterior, formando una recursión infinita. */@Override public String toString () {return "id =" + id + "," + nombre + "," + precio; // El objeto de perno no se puede obtener aquí, de lo contrario, infinita recursión}}Mostrar la página de información del estudiante JSPS/show.jsp
<%@ page lenguaje = "java" import = "java.util.*" pageEncoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <html> <shead> <bitle> Gestión de la información del estudiante </title> </head> </head> <HEAD> <c: foreach elementos = "$ {studs}" var = "x"> $ {x.id}, $ {x.name} <br/> </c: foreach> </body> </html>Imagen de reproducción:
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.