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>
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 (); }} public static Synchronized Connection getConnection () {// Dapatkan dari T pertama, jika ada, keluarkan. Jika tidak, ambil di kolam renang dan masukkan objek di T koneksi 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 untuk memindahkan satu}}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
Objek nilai
Stud.java
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; }}Book.java
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}}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; impor cn.hncu.domain.book; impor cn.hncu.domain.stud; import cn.hncu.stud.service.istudservice; cloplevy cneryvy. ISTUDService Service = 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 {list <peta <string, string >> studs = 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 Parameter Kumpulkan 2 Parameter Atur (bidang ID dibiarkan di DAO untuk menambah) nama string [] = request.getParAmeterRerUes ("name"); System.out.println (nama [0]); Stud s = stud baru (); s.setname (nama [0]); // buku buku string book [] = request.getParameterValues ("buku"); // Lindungi --- Perlindungan harga juga harus ditulis, di sini kita malas 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 hubungan "satu-ke-banyak" dari dua objek nilai s.getBooks (). Add (b); // satu partai B.Sets (s); // Multiple-Party} // 3Call Service Layer Coba {service.save (s); } catch (exception e) {// arahan halaman gagal}}}Antarmuka lapisan layanan dari lapisan stud:
Paket cn.hncu.stud.service; import java.util.list; impor java.util.map; impor cn.hncu.domain.stud; antarmuka publik IStudService {daftar publik <peta <string, string >> query (); public void save (stud stud);}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 cn.hncu.utils.connut3;/*Di masa depan, kami biasanya menggunakan tabel untuk mengoperasikan. 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) {connection con = null; coba {con = connutils3.getConnection (); System.out.println ("Dapatkan tautan:"+con); con.setautocommit (false); dao_stud.save (stud); dao_book.save (stud.getBooks ()); System.out.println ("Komit 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 (); }}}} Lapisan dao lapisan Stu
Antarmuka stud
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", yaitu, buku ini bisa mendapatkan id "satu pihak", 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; import 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}}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:
Untuk informasi lebih lanjut tentang sistem manajemen, silakan klik "Sistem Manajemen Topik Khusus" untuk dipelajari
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.