Informasi siswa dalam contoh ini menambahkan transaksi ke database (transaksi dapat diserahkan, transaksi dapat digulung kembali, dan ditingkatkan dengan utas lokal)
Indeks halaman utama.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 = kueri '> Lihat informasi siswa </a> <br> <br> <!-<a href = "<c: nilai url ='/studServlet? cmd = save '/>"> Tambah Siswa </a>-> <h2> Informasi Siswa Tambah </h2> <bentuk action =' c: c: c: query = "coy/? Name:<input type="text" name="name"/><br><br> <fieldset style="border: solid;border-color: red;width: 250px;"> <legend>Book1</legend> Title:<input type="text" name="book"/><br><br> Price:<input type="text" name="price"/> </fieldset> <br> <fieldset style = "border: solid; border-color: green; width: 250px;"> <tegend> Buku 2 </tegend> judul: <input type = "text" name = "book"/> <br> <br> Harga: <input type = "Text" name = "Price"/</fieldset> <br> <br> <br> <input type = "kirim" </body> </html>
Toolkit
Alat untuk mendapatkan koneksi basis data Connutils5.java
Paket cn.hncu.utils; impor java.lang.reflect.invocationHandler; impor java.lang.reflect.method; impor java.lang.reflect.proxy; impor Java.sql.connection; impor java.sql.driverManager; leva.lorrut; impor java.lorlis; java.util.properties; kelas publik connutils5 {// objek manajemen utas lokal, digunakan untuk mengimplementasikan: Koneksi yang diperoleh oleh utas yang sama adalah threadlokal statis pribadi yang sama <nection> t = threadlocal baru <nection> (); Daftar statis akhir pribadi <nection> pool = new ArrayList <nection> (); Ukuran int statis privat; // Baca connutils5 pribadi () {} static {properties p = properti baru (); Coba {// Metode berikut dapat membaca file sumber daya di bawah ClassPath dalam proyek Java murni, tetapi proyek Javaee tidak dapat dibaca. Karena Tomcat mengubah kelas default sistem loader //p.load (classloader.getsystemClassLoader (). GetSystemResourceAsstream ("jdbc.properties")); // p.load (classloader.getsystemResourceAsstream ("jdbc.properties")); // Baca file sumber daya di bawah classpath proyek web, gunakan ini untuk p.load (connutils3.class.getClassLoader (). GetResourCeAsstream ("jdbc.properties")); String driver = p.getProperty ("driver"); String url = p.getProperty ("url"); String name = p.getProperty ("nama pengguna"); String pwd = p.getProperty ("kata sandi"); String ssize = p.getProperty ("size"); Size = integer.parseint (ssize); Class.forname (driver); untuk (int i = 0; i <size; i ++) {Koneksi akhir con = driverManager.getConnection (url, name, pwd); System.out.println ("con =="+con); // Ubah metode conn.close () // Gunakan mode proxy untuk menghasilkan versi yang ditingkatkan dari objek Conn, mencegat dan mengubah metode tutupnya () menjadi objek ncon = proxy.newproxyinstance (connutils3.class.getClass Metode (), conn.getClass (). Program (class loader berbeda) kelas baru [] {connection.class}, new InvocationHandler () {@Override Objek Invoke (Proxy Objek, Metode Metode, Object [] Args) Melempar Throwable {if (Method.getName (). ("Tutup") {System.out.println ("Return () null;} return Method.invoke (con, args); pool.add ((koneksi) ncon); }} catch (Exception e) {e.printstacktrace (); }} Koneksi sinkronisasi public static getConnection () {// Dapatkan dari T pertama, keluarkan jika ada, dan jika tidak ada, keluarkan. Jika tidak ada di kolam, masukkan objek di T koneksi t con = t.get (); if (con == null) {if (pool.size () <= 0) {System.out.println ("Koneksi di kumpulan hilang ..."); coba {thread.sleep (1000); } catch (InterruptedException e) {E.PrintStackTrace (); } return getConnection (); } con = pool.remove (0); t.set (con); // Masukkan t} return con; // dapatkan satu dan pindahkan satu}}akting
Paket cn.hncu.utils; impor java.lang.reflect.invocationHandler; impor java.lang.reflect.method; impor java.lang.reflect.proxy; impor java.sql.connection; impor java.sql.sqllexception; public -inclonse -invicion; srcobj = null; private txproxy (objek srcobj) {this.srcobj = srcobj; } public static Object getProxy (objek srcobj) {System.out.println ("srcobj:"+srcobj); Objek newoBj = proxy.newproxyInstance (txproxy.class.getClassLoader (), srcobj.getClass (). GetInterfaces (), txproxy baru (srcobj)); System.out.println ("newoBj:"+newoBj); mengembalikan newoBj; } @Override Public Object Invoke (objek proxy, metode metode, objek [] args) melempar lempar {koneksi con = null; Objek returnobj = null; coba {con = connutils5.getConnection (); System.out.println ("Invoke mendapat tautan:"+con); con.setautocommit (false); returnobj = Method.invoke (srcobj, args); System.out.println ("Kirim transaksi ..."); con.commit (); } catch (Exception e) {coba {System.out.println ("Rolling Back a Transaction ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} akhirnya {coba {con.setAutocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return returnobj; }}Agen 2: Tidak perlu memaksa transfer, tetapi semuanya
Paket cn.hncu.utils; impor java.lang.reflect.invocationHandler; impor java.lang.reflect.method; impor java.lang.reflect.proxy; impor java.sql.connection; impor java.sql.sqlexception; srcobj = null; private txproxy2 (objek srcobj) {this.srcobj = srcobj; } public static <T> t getProxy (class <T> c) {objek obj = null; coba {obj = c.newInstance (); } catch (Exception e) {E.PrintStackTrace (); } Objek newoBj = proxy.newproxyInstance (txproxy2.class.getClassLoader (), c.getInterfaces (), txproxy2 baru (obj)); return (t) newoBj; } @Override Public Object Invoke (objek proxy, metode metode, objek [] args) melempar lempar {koneksi con = null; Objek returnobj = null; coba {con = connutils5.getConnection (); System.out.println ("Invoke mendapat tautan:"+con); con.setautocommit (false); returnobj = Method.invoke (srcobj, args); System.out.println ("Kirim transaksi ..."); con.commit (); } catch (Exception e) {coba {System.out.println ("Rolle Back a Transaction ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} akhirnya {coba {con.setAutocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return returnobj; }}anotasi
Paket cn.hncu.utils; impor java.lang.annotation.elementType; impor java.lang.annotation.retention; impor java.lang.annotation.RetensionPolicy; import java.lang.notation) @target (value = elementtype.method)@rretation) @target;
Agen 3: Gunakan anotasi untuk mengimplementasikan transaksi saat dibutuhkan
Paket cn.hncu.utils; impor java.lang.reflect.invocationHandler; impor java.lang.reflect.method; impor java.lang.reflect.proxy; impor java.sql.connection; impor java.sql.sqlexception; srcobj = null; private txproxy3 (objek srcobj) {this.srcobj = srcobj; } public static <T> t getProxy (t srcoBj) {objek newoBj = proxy.newproxyInstance (txproxy3.class.getClassLoader (), srcobj.getClass (). getInterfaces (), new txproxy3 (srcobj)); return (t) newoBj; } @Override Public Object Invoke (Proxy Object, Metode Metode, Object [] args) melempar lempar { /* cara ini untuk mengimplementasikan hanya mencegat metode yang ditentukan jika (method.getName (). Equals ("tutup")) {... intersep} else {return method.invoke (srcobj, args); } */ if (method.isAnnotationPresent (transaction.class)) {connection con = null; Objek returnobj = null; coba {con = connutils5.getConnection (); System.out.println ("Invoke mendapat tautan:"+con); con.setautocommit (false); // kode bisnis nyata, rilis returnObj = Method.invoke (srcobj, args); System.out.println ("Kirim transaksi ..."); con.commit (); } catch (Exception e) {coba {System.out.println ("Rolle Back a Transaction ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} akhirnya {coba {con.setAutocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return returnobj; } else {System.out.println ("Tidak ada anotasi transaksi, lepaskan saja!"); return method.invoke (srcobj, args); }}}File Sumber Daya JDBC.Properties
## mysqldriver = com.mysql.jdbc.driverUrl = jdbc: mysql: //127.0.0.1: 3306/hncu? UseUnicode = true & characterencoding = UTF-8Username = rootpasswor D = 1234Size = 3 ## oracle#driver = oracle.jdbc.driver.oracledRiver#url = jdbc: oracle: tipis:@127.0.0.1: 1521: orcl#username = scott#password = harimau
Queryservlet.java Servlet Layer lapisan stud
Paket cn.hncu.stud.servlet; import java.io.ioexception; import java.util.list; import java.util.map; import javax.servlet.servletException; import javax.servlet.htp.httpservlet; impor javax.servlet.htp.httpservlet; impor javax.servlet 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.studsudserviceImpl; silservice.stud.stud.service.studServiceImpl; QueryServlet memperluas httpservlet {//inject//1.// iStudService service = (IstudService) txproxy.getproxy (StudServiceImpl ()); //2.// IStudService Service = txproxy2.getproxy (studserviceImpl.class); // 3. ISTUDService Service = txproxy3.getproxy (studserviceImpl baru ()); public void doGet (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {dopost (permintaan, respons); } public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {string cmd = request.getParameter ("cmd"); System.out.println ("CMD:"+CMD); if ("query" .equals (cmd)) {query (request, response); } lain jika ("add" .equals (cmd)) {add (request, response); }} permintaan public void (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {system.out.println ("Layanan:"+layanan); Daftar <peta <string, string >> stud = service.query (); request.setAttribute ("stud", studs); request.getRequestDispatcher ("/jsps/show.jsp"). Forward (Request, Response); } public void add (permintaan httpservletRequest, httpservletResponse response) melempar servletException, ioException {// 1 mengumpulkan parameter 2 mengatur parameter (tinggalkan bidang ID di DAO ke suplemen) nama string [] = request.getParAmeterRerUes ("name"); Stud s = stud baru (); s.setname (nama [0]); // buku buku string book [] = request.getParameterValues ("buku"); // Lindungi --- Perlindungan harga juga harus ditulis. Kami malas di sini jika (buku == null || books.length <= 0) {return; } Harga string [] = request.getParameterValues ("harga"); untuk (int i = 0; i <books.length; i ++) {Buku b = buku baru (); b.setname (buku [i]); b.setprice (double.parsedouble (harga [i])); // ※ Lengkapi enkapsulasi data dari hubungan "satu-ke-banyak" antara dua objek nilai s.getBooks (). Add (b); // One-Party B.Sets (s); // Multiple-Party} // 3 Panggil Lapisan Layanan Coba {service.save (s); } catch (exception e) {// arahan halaman gagal}}} Lapisan layanan lapisan stud
Antarmuka:
paket cn.hncu.stud.service; import java.util.list; import java.util.map; impor cn.hncu.domain.stud; // Perhatikan bahwa anotasi hanya berguna di antarmuka ,,,, metode yang ditulis dalam kelas implementasi tidak valid (tidak akan memutuskan untuk memulai transaksi) @transaction public void save (stud stud) melempar pengecualian;}
Kelas Implementasi
Paket cn.hncu.stud.service; impor java.sql.connection; impor java.sql.sqlexception; impor java.util.list; impor java.util.map; import cn.hncu.domain.stud; impor cn.hncu.stud.dao.dao.dao.domain; Impor; cn.hncu.stud.dao.bookdao; impor cn.hncu.stud.dao.bookjdbcdao; impor cn.hncu.stud.dao.studdao; impor pengembangan cn.hncu.utils.connut5;/*kami biasanya menggunakan tabel untuk operator secara independen. Jika ada beberapa tabel entitas dalam sistem, tulis beberapa DAO. * Di masa depan, kerangka kerja akan melakukan ini, dan kita harus melakukan ini, karena arsitekturnya bagus! * * Dalam hal menggunakan transaksi: * 1. Jika hanya ada satu DAO, tetapi beberapa pernyataan SQL perlu dieksekusi dan menambah, menghapus dan memodifikasi, transaksi harus dibuka. 2. Jika layanan menelepon beberapa DAO, transaksi juga harus dibuka. */Public Class StudServiceImpl mengimplementasikan IStudService {// inject studdao dao_stud = studjdbcdao baru (); Bookdao dao_book = bookjdbcdao baru (); Daftar publik @Override <peta <string, string >> query () {return dao_stud.query (); } @Override public void save (stud stud) melempar Exception {dao_stud.save (stud); dao_book.save (stud.getBooks ()); }} Lapisan dao lapisan Stu
Praktek pemisahan antarmuka stud, satu tabel sesuai dengan satu DAO, bersiap untuk kerangka kerja
Paket cn.hncu.stud.dao; import java.util.list; impor java.util.map; impor cn.hncu.domain.stud; antarmuka publik studdao {daftar publik <peta <string, string >> query (); public void save (stud stud) melempar pengecualian;}Kelas implementasi stud
Paket cn.hncu.stud.dao; impor java.sql.connection; impor java.sql.parparedstatement; impor java.sql.resultset; impor java.sql.sqlexception; impor java.sql.statement; impor java.ravap; java.util.list; impor java.util.map; impor java.util.uuid; import cn.hncu.domain.book; impor cn.hncu.domain.stud; impor cn.hncu.utils.connutils3; public class studjdbcdao menandatangani studdao {quonred {quons3; public studjdbcdao {quons3; Daftar <peta <string, string >> list = arraylist baru <peta <string, string >> (); // Peta adalah deretan data, daftar <peta> adalah seluruh koneksi tabel data con = null; coba {con = connutils3.getConnection (); Pernyataan st = con.createStatement (); String sql = "pilih * dari stud"; Hasil RS = St.ExecuteQuery (SQL); while (rs.next ()) {peta <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 (); } akhirnya {coba {con.close (); } catch (sqlexception e) {e.printstacktrace (); }} daftar pengembalian; } @Override public void save (stud stud) melempar Exception {connection con = connutils3.getConnection (); System.out.println ("Dapatkan tautan:"+con); String sql = "masukkan ke dalam nilai stud (?,?)"; String uuid = uuid.randomuuid (). Tostring (). Ganti ("-", ""); Disiapkan pst = con.preparestatement (sql); stud.setid (uuid); // Untuk "beberapa pihak", buku ini bisa mendapatkan id "satu pihak", itu secara khusus dilengkapi dengan pst.setstring (1, uuid); pst.setstring (2, stud.getname ()); System.out.println ("1:"+uuid+", 2:"+stud.getname ()); pst.executeUpdate (); // con.close (); // Dapatkan con yang sama, tidak perlu menutupnya di sini}}Antarmuka buku
Paket cn.hncu.stud.dao; impor java.util.list; import cn.hncu.domain.book; antarmuka publik bookdao {public void save (daftar <book> buku) Lempar pengecualian;}Kelas Implementasi Buku
Paket cn.hncu.stud.dao; impor java.sql.connection; impor java.sql.preparedstatement; impor java.util.list; cn.hncu.domain. buku) melempar pengecualian {koneksi con = connutils3.getConnection (); System.out.println ("Dapatkan tautan:"+con); String sql = "masukkan ke dalam buku (nama, harga, studid) nilai (?, ?,?)"; Disiapkan pst = con.preparestatement (sql); untuk (buku b: buku) {pst.setstring (1, b.getname ()); pst.setDouble (2, b.getprice ()); PST.SetObject (3, "12132312"); // Pengecualian (dengan sengaja memberikan bidang kunci asing yang tidak ada untuk menguji rollback transaksi) -test rollback transaksi // pst.setObject (3, b.gets (). getid ()); System.out.println ("1:"+b.getName ()+", 2:"+b.getprice ()+", 3:"+b.gets (). GetId ()); pst.addbatch (); // tambahkan ke batch} pst.executebatch (); // jalankan batch // con.close (); // dapatkan con yang sama di sini, tidak perlu menutup di sini}} Objek nilai
Objek stud
Paket cn.hncu.domain; import java.util.arraylist; import java.util.list;/** metode untuk membuat objek nilai "satu" dalam satu-ke-banyak*/kelas publik stud {private string id; nama string pribadi; // ※ Tambahkan koleksi khusus untuk kotak "multi" --- mencerminkan "hubungan satu-ke-banyak" dalam daftar pribadi multi-meja <Book> Books = new ArrayList <Book> (); // Perhatikan bahwa koleksi tersebut harus baru di atau sebelum konstruksi. string publik getId () {return id; } public void setId (string id) {this.id = id; } public string getName () {return name; } public void setName (name string) {this.name = name; } Daftar Publik <Book> getBooks () {Return Books; } public void setBooks (Daftar <Book> BUKU) {this.books = BUKU; } @Override public string toString () {return "id =" + id + "," + name + "," + books; }}Objek buku
Paket cn.hncu.domain;/** Metode untuk membuat objek nilai kuadrat "multi" dalam buku kelas satu-ke-banyak*/kelas publik {private integer id; // Semua tipe data dasar dinyatakan oleh kelas pengemasan untuk mempersiapkan penggunaan kerangka kerja di masa depan --- kelas pengemasan kompatibel dengan kerangka kerja (karena umumnya kerangka kerja menggunakan refleksi kelas) nama string pribadi; harga ganda pribadi; // ※ Tambahkan variabel tipe objek khusus untuk "satu" persegi (catatan, jangan gunakan StudyD) --- mencerminkan "hubungan satu-ke-banyak" dalam beberapa tabel private stud s; // atur master // private string studyd; // ★★ Jangan atur public integer getid () {return id; } public void setid (integer id) {this.id = id; } public string getName () {return name; } public void setName (name string) {this.name = name; } public double getPrice () {harga kembali; } public void setPrice (harga ganda) {this.price = harga; } stud publik gets () {return s; } public void set (stud s) {this.s = s; } / * * Ketika asosiasi multi-meja, Anda harus memperhatikan jebakan, yaitu satu pihak menghasilkan pihak lain, dan pihak lain secara bergantian menampilkan pihak sebelumnya, membentuk rekursi tak terbatas! */@Override Public String ToString () {return "ID =" + ID + "," + Name + "," + Price; // Objek Stud tidak dapat output di sini, jika tidak rekursi tak terbatas}}Tampilkan halaman informasi siswa 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 item = "$ {studs}" var = "x"> $ {x.id}, $ {x.name} <br/> </c: foreach> </body> </html>Gambar reproduksi:
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.