Информация о студенте в этом примере добавляет транзакции в базу данных (транзакция может быть представлена, транзакции могут быть переданы обратно и улучшены с помощью локальных потоков)
Главная страница index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html> <head> <title>Student Information Management</title> </head> <body> <a href='<c:url value = "/Query"/>? cmd = Query '> Просмотреть информацию о студенте </a> <br> <br> <!-<a href = "<C: url value ='/studservlet? cmd = save '/>"> Информация о студенте Add </a>-> <H2> Информация о студенте add </h2> <com =' <c: url value = "/>? Имя: <input type = "text" name = "name"/> <br> <br> <fieldset style = "граница: твердое; style="border: solid;border-color:green;width: 250px;"> <legend>Book 2</legend> Title:<input type="text" name="book"/><br><br> Price:<input type="text" name="price"/> </fieldset> <br><br> <input type="submit" value="submit"/><br><br> </form> </body> </html>
Инструментарий
Инструмент для получения Connutils Connutils5.java5.java.
Пакет cn.hncu.utils; импорт java.lang.reflect.invocationHandler; импорт java.lang.reflect.method; импорт java.lang.reflect.proxy; импорт java.sql.concection; импорт java.sql.drivermanager; импорт Java.Util.ArrayList; java.util.properties; открытый класс Connutils5 {// локальный объект управления потоком, используемый для реализации: подключение, полученное одним и тем же потоком, является тем же частным статическим потоком <nectedcal> t = new Threadlocal <nected> (); Частный окончательный статический список <neplyse> pool = new ArrayList <nectation> (); private static int size; // читать private connutils5 () {} static {свойства p = new Properties (); Try {// Следующий метод может прочитать файл ресурса в разделе ClassPath в проекте Pure Java, но проект Javaee не может быть прочитал. Потому что Tomcat изменил загрузку класса системы по умолчанию //p.load (classloader.getSystemClassloader (). GetSystemresourceasStream ("jdbc.properties")); // p.load (classloader.getsystemresourceasstream ("jdbc.properties")); // Читать файл ресурса под классной дорожкой веб -проекта, используйте его для p.load (connutils3.class.getClassloader (). GetResourCeasStream ("jdbc.properties")); String Driver = P.GetProperty ("Driver"); String url = p.getproperty ("url"); String name = p.getproperty ("имя пользователя"); String pwd = p.getProperty ("пароль"); String ssize = p.getProperty ("size"); Size = integer.parseint (ssize); Class.forname (драйвер); for (int i = 0; i <size; i ++) {окончательное соединение con = drivermanager.getConnection (url, имя, pwd); System.out.println ("con =="+con); // изменить метод conn.close () // Использовать режим прокси для генерации улучшенной версии объекта Conn, Intercept и изменить свой метод Close () для объекта ncon = proxy.newproxyinstance (connutils3.class.getClassloader (), // conn.getClass (). Program (Class Loader отличается) Новый класс [] {connection.class}, New InvocationHandler () {@Override Public Object Invoke (Object Proxy, метод, объект [] args) бросает Throwable {if (method.getName () null; Pool.Add ((соединение) NCON); }} catch (Exception e) {e.printstackTrace (); }} public Static Synchronized Connection getConnection () {// Get From T Сначала, если есть, выберите его. Если нет, возьмите его в бассейн и поместите объект в T -соединение con = t.get (); if (con == null) {if (pool.size () <= 0) {System.out.println («Соединение в пуле исчезло ...»); try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } return getConnection (); } con = pool.remove (0); t.set (con); // Поместите его в t} return con; // Получить один, чтобы переместить один}}действующий
Пакет cn.hncu.utils; импорт java.lang.reflect.invocationHandler; импорт java.lang.reflect.method; импорт java.lang.reflect.proxy; импорт java.sql.connection; импорт java.sql.sqlexception; public class txproxy ifflementship {invocation java java.sql.sqlexception; private txproxy (Object srcobj) {this.srcobj = srcobj; } public Static Object getProxy (Object srcobj) {System.out.println ("srcobj:"+srcobj); Object newObj = proxy.newProxyInstance (txproxy.class.getClassloader (), srcobj.getClass (). GetInterfaces (), new txproxy (srcobj)); System.out.println ("newobj:"+newobj); вернуть Newobj; } @Override public Object invoke (объект прокси, метод метода, Object [] args) бросает Throwable {connection con = null; Объект returnObj = null; try {con = connutils5.getConnection (); System.out.println ("invoke получил ссылку:"+con); con.setautocommit (false); returnObj = method.invoke (srcobj, args); System.out.println («Отправить транзакцию ...»); con.commit (); } catch (Exception e) {try {System.out.println ("Отправление транзакции ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} наконец {try {con.setautocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return returnObj; }}Агент 2: Не нужно заставлять перенос, но все
Пакет cn.hncu.utils; импорт java.lang.reflect.invocationHandler; импорт java.lang.reflect.method; импорт java.lang.reflect.proxy; импорт java.sql.connection; импорт java.sql.sqlexception; public class txproxy2 inflmentshand {private java java.sql.sqlexception; public class txproxy2 influmshrables {private java.sql.sqlececept; private txproxy2 (Object srcobj) {this.srcobj = srcobj; } public static <t> t getProxy (class <t> c) {Object obj = null; try {obj = c.newinstance (); } catch (Exception e) {e.printstackTrace (); } Object newoBj = proxy.newProxyInstance (txproxy2.class.getClassloader (), c.getInterfaces (), new txproxy2 (obj)); вернуть (t) newobj; } @Override public Object invoke (Proxy Object, метод метода, объект [] args) бросает Throwable {connection con = null; Объект returnObj = null; try {con = connutils5.getConnection (); System.out.println ("invoke получил ссылку:"+con); con.setautocommit (false); returnObj = method.invoke (srcobj, args); System.out.println («Отправить транзакцию ...»); con.commit (); } catch (Exception e) {try {System.out.println ("Rolle обратно транзакции ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} наконец {try {con.setautocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return returnObj; }}аннотация
Пакет cn.hncu.utils; import java.lang.annotation.elementtype; импорт java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; импорт java.lang.annotation.target; @Target (value = elementTyPe.methodation) @retturetment. {}Агент 3: Используйте аннотации для реализации транзакций при необходимости
Пакет cn.hncu.utils; import java.lang.reflect.invocationHandler; импорт java.lang.reflect.method; импорт java.lang.reflect.proxy; импорт java.sql.connection; импорт java.sql.sqlexception; public class txproxy3 Implementshardles wobsh. private txproxy3 (Object srcobj) {this.srcobj = srcobj; } public static <t> t getProxy (t srcobj) {object newobj = proxy.newproxyinstance (txproxy3.class.getclassloader (), srcobj.getclass (). getInterfaces (), new txproxy3 (srcobj)); вернуть (t) newobj; } @Override public object invoke (Object Proxy, метод метода, объект [] args) бросает Throwable { /* Таким образом, чтобы реализовать только перехват указанного метода if (method.getName (). Equals ("close")) {... Intercept} else {return.invoke (srcobj, args); } */ if (method.isannotationpresent (transaction.class)) {connection con = null; Объект returnObj = null; try {con = connutils5.getConnection (); System.out.println ("invoke получил ссылку:"+con); con.setautocommit (false); // Реальный бизнес -код, выпуск relustObj = method.invoke (srcobj, args); System.out.println («Отправить транзакцию ...»); con.commit (); } catch (Exception e) {try {System.out.println ("Rolle обратно транзакции ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} наконец {try {con.setautocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return returnObj; } else {System.out.println ("Нет аннотации транзакции, просто отпустите!"); method return.invoke (srcobj, args); }}}Файл ресурсов JDBC.Properties
## mysqldriver = com.mysql.jdbc.driverurl = jdbc: mysql: //127.0.0.1: 3306/hncu? UseUnicode = true & haremencoding = utf-8username = rootpasswor d = 1234size = 3 ## oracle#Driver = oracle.jdbc.driver.oracledriver#url = jdbc: oracle: thin:@127.0.0.1: 1521: orcl#username = scott#password = tiger
QueryServlet.java Servlet слой слоя шпильки
Пакет cn.hncu.stud.servlet; import java.io.ioexception; import java.util.list; импорт java.util.map; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.http.http.httpservlet; import javax.servlet.http.http.httpservlet; import javax.servlet.htt javax.servlet.http.httpservletresponse; import cn.hncu.domain.book; import cn.hncu.domain.stud; импорт cn.hncu.stud.service.istudservice; import cn.hncu.stud.service.studsersiMpl; importclcu.stud.service.SviceMplieMplemplice; Import.hncu.stud.Service.ServiceImplie; Класс QueryServlet Extends httpservlet {//inject//1.// istudservice service = (istudservice) txproxy.getproxy (new studserviceimpl ()); //2.// istudservice service = txproxy2.getproxy (studserviceimpl.class); // 3. Istudservice service = txproxy3.getproxy (new studserviceimpl ()); public void Doget (httpservletrequest, httpservletresponse response) бросает Servletexception, ioException {DoPost (запрос, ответ); } public void dopost (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {string cmd = request.getParameter ("cmd"); System.out.println ("cmd:"+cmd); if ("Query" .equals (cmd)) {Query (запрос, ответ); } else if ("add" .equals (cmd)) {add (request, response); }} public void Query (httpservlectrequest, httpservletresponse response) throws servletexception, ioexception {System.out.println ("Service:"+Service); Список <map <string, string >> studs = service.query (); request.setattribute ("Studs", Studs); request.getRequestDispatcher ("/jsps/show.jsp"). } public void add (httpservletrequest, httpservletresponse response) бросает Servletexception, ioException {// 1 Соберите параметры 2 Организации параметров (оставьте поле идентификатор в DAO в дополнение) name [] = request.getParametervalues ("name"); Стад S = новый stud (); S.SetName (имя [0]); // информация книги String Books [] = request.getParametervalues ("book"); // Защита --- Также должна быть написана защита цен. Мы ленивы здесь, если (books == null || books.length <= 0) {return; } Строковые цены [] = request.getParametervalues ("цена"); for (int i = 0; i <books.length; i ++) {book b = new book (); b.setname (книги [i]); B.SetPrice (Double.Parsedouble (цены [i])); // ※ Заполните инкапсуляцию данных о взаимосвязи «один коврик» между двумя объектами значения s.getbooks (). Добавить (b); // однопартийные B.sets (ы); // Многопартийные} // 3 Вызовите уровень службы try {service.save (s); } catch (Exception e) {// Неудача направления}}} Сервисный слой слоя шпильки
интерфейс:
Пакет cn.hncu.stud.service; import java.util.list; import java.util.map; import cn.hncu.domain.stud; импорт cn.hncu.utils.transaction; public interface istudservice {public list <string, string >> Query (); // Обратите внимание, что аннотации полезны только в интерфейсе ,,,, метод, записанный в классе реализации, является недействительным (он не решит запустить транзакцию) @Transaction Public void Said Said (Stud Stud) исключает исключение;}Класс реализации
Пакет cn.hncu.stud.service; import java.sql.connection; импорт java.sql.sqlexception; import java.util.list; import java.util.map; import cn.hncu.domain.stud; импорт cn.hncu.stud.dao.boop; cn.hncu.stud.dao.bookdao; импорт cn.hncu.stud.dao.bookjdbcdao; импорт cn.hncu.stud.dao.studdao; импорт cn.hncu.utils.connutils5;/*Мы обычно используем таблицу для работы независимо во время будущего развития. Если в системе есть несколько объектов, напишите несколько DAO. * В будущем структура сделает это, и мы должны сделать это, потому что архитектура хороша! * * В случае использования транзакций: * 1. Если есть только один DAO, но необходимо выполнить несколько операторов SQL, удалить и изменить, транзакция должна быть открыта. 2. Если служба вызывает несколько DAO, транзакция также должна быть открыта. */public class studserviceimpl реализует 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 Said Said (Stud Stud) Throws Exception {dao_stud.save (stud); dao_book.save (stud.getbooks ()); }} Слой DAO слоя STU
Практика разделения интерфейса интерфейса, одна таблица соответствует одному DAO, готовитесь к структуре
пакет cn.hncu.stud.dao; import java.util.list; import java.util.map; import cn.hncu.domain.stud; публичный интерфейс studdao {public list <map <string, string >> Query (); Public void Said (Stud Stud) бросает исключение;}Класс реализации стада
Пакет cn.hncu.stud.dao; импорт java.sql.connection; импорт java.sql.preparedStatement; импорт java.sql.resultset; импорт java.sql.sqlexception; импорт java.sql.statement; импорт; импорт; 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.contils3; public class studjdbcdao imptuments studdao { @ @wisoverride publicle <string >> Qustery <tring >> Qustery <tring >> qupery <tring >> Qustery (QUSTERIP <TriseRide >> Список <map <string, string >> list = new ArrayList <map <string, string >> (); // Карта - это строка данных, список <Map> - это полная таблица данных connection con = null; try {con = connutils3.getConnection (); Утверждение 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 (); S.Close (); } catch (sqlexception e) {e.printstacktrace (); } наконец {try {con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return List; } @Override public void Said Said (Stud Stud) Throws Exception {connection con = connutils3.getConnection (); System.out.println («Получите ссылку:»+con); String sql = "вставьте значения шпильки (?,?)"; String uuid = uuid.randomuuid (). Подготовленное Statatement PST = con.PreArestatement (SQL); stud.setId (uuid); // Чтобы «несколько сторон», то есть книга может получить идентификатор «одна сторона», она специально дополняется pst.setstring (1, uuid); PST.SetString (2, stud.getName ()); System.out.println ("1:"+uuid+", 2:"+stud.getName ()); pst.executeupdate (); // con.close (); // Получить тот же Con, здесь нет необходимости закрывать его здесь}}}}}}Книжный интерфейс
Пакет cn.hncu.stud.dao; import java.util.list; import cn.hncu.domain.book;
Класс реализации книги
Пакет cn.hncu.stud.dao; import java.sql.connection; импорт java.sql.preparedStatement; import java.util.list; импорт cn.hncu.domain.book; импорт cn.hncu.utils.contils3; Сохранить (список <book> книги) бросает исключение {connection con = connutils3.getConnection (); System.out.println («Получите ссылку:»+con); String sql = "вставьте в книгу (имя, цена, studid) значения (?,?,?)"; Подготовленное Statatement PST = con.PreArestatement (SQL); Для (Книга B: книги) {pst.setString (1, b.getName ()); PST.SetDouble (2, B.GetPrice ()); PST.SetObject (3, "12132312"); // Исключение (намеренно дает несуществующее поле иностранного ключа для тестирования отката транзакции) -test Откат // pst.setObject (3, b.gets (). getId ()); System.out.println ("1:"+b.getName ()+", 2:"+b.getPrice ()+", 3:"+b.gets (). GetId ()); pst.addbatch (); // Добавить в партию} pst.executebatch (); // Выполнить пакет // con.close (); // Получить здесь тот же Con, нет необходимости закрывать здесь}}}}}}}}}}} Значение объекта
Стад объект
пакет cn.hncu.domain; импортировать java.util.arraylist; import java.util.list;/** Метод создания объекта «одно» в квадратном значении в одном к человеку*/public class stud {private String id; Приватное название строки; // ※ Добавить коллекцию специально для «много» квадратов --- Отражая «Относительные отношения» в многотоком частного списка <book> books = new Arraylist <book> (); // Обратите внимание, что коллекция должна быть новой на или до строительства. public String getId () {return id; } public void setId (String id) {this.id = id; } public String getName () {return name; } 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; }}Книжный объект
Пакет Cn.hncu.domain;/** Метод создания объектов «мульти» квадратного значения в книге «Одно до»*/Public Class Book {Private Integer ID; // Все основные типы данных объявляются классом упаковки для подготовки к будущему использованию фреймворков. Класс упаковки совместим с Frameworks (потому что, как правило, фреймворки используют Class Reflection) Private String Имя; частная двойная цена; // ※ Добавить переменную типа объекта, специально для «одного», квадрат (примечание, не используйте исследование) --- Отражите «Относительные отношения» в нескольких таблицах. } public void setId (Integer id) {this.id = id; } public String getName () {return name; } public void setName (string name) {this.name = name; } public Double GetPrice () {return Price; } public void setPrice (двойная цена) {this.price = цена; } public Stud Gets () {return s; } public void sets (Stud S) {this.s = s; } / * * Когда многоточная ассоциация, вы должны обратить внимание на ловушку, то есть одну сторону выводит другую сторону, а другая сторона, в свою очередь, выводит предыдущую сторону, образуя бесконечную рекурсию! */@Override public String toString () {return "id =" + id + "," + name + "," + price; // объект Stud не может быть выведен здесь, в противном случае Infinite Recursion}}Показать страницу информации о студентах jsps/show.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html> <head> <title>Student Information Management</title> </head> <body> <h2>Student Information</h2> <C: foreach emits = "$ {studs}" var = "x"> $ {x.id}, $ {x.name} <br/> </c: foreach> </body> </html>Изображение воспроизведения:
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.