ข้อมูลนักเรียนในตัวอย่างนี้จะเพิ่มธุรกรรมลงในฐานข้อมูล (สามารถส่งธุรกรรมได้การทำธุรกรรมสามารถย้อนกลับและปรับปรุงด้วยเธรดท้องถิ่น)
หน้าหลัก index.jsp
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" head> <html> <html> value = "/query"/>? cmd = query '> ดูข้อมูลนักเรียน </a> <br> <br> <!-<a href = "<c: url value ='/studservlet? cmd = บันทึก '/>"> ข้อมูลนักเรียนเพิ่ม </a>-> <h2> ชื่อ: <อินพุต type = "text" name = "name"/> <br> <br> <fieldset style = "border: solid; สีชายแดน: สีแดง; ความกว้าง: 250px;"> <legend> book1 </legend> title: <อินพุตประเภท = "text" name = "book"/> <br> <br> Solid; Border-Color: Green; Width: 250px; "> <legend> หนังสือ 2 </Legend> ชื่อเรื่อง: <อินพุตประเภท =" text "name =" book "/> <br> <br> ราคา: <อินพุตประเภท =" text "name =" ราคา "/> </fieldset> <br> <br> <br>
ชุดเครื่องมือ
เครื่องมือสำหรับรับการเชื่อมต่อฐานข้อมูล connutils5.java
แพ็คเกจ cn.hncu.utils; นำเข้า java.lang.reflect.invocationhandler; นำเข้า java.lang.reflect.method; นำเข้า java.lang.reflect.proxy; นำเข้า java.sql.connection; java.util.properties; คลาสสาธารณะ connutils5 {// วัตถุการจัดการเธรดท้องถิ่นที่ใช้ในการใช้งาน: การเชื่อมต่อที่ได้จากเธรดเดียวกันนั้นเป็นเธรดแบบคงที่ส่วนตัวเดียวกัน <การเชื่อมต่อ> t = threadlocal ใหม่ <การเชื่อมต่อ> (); รายการคงที่ส่วนตัวสุดท้าย <การเชื่อมต่อ> pool = new ArrayList <การเชื่อมต่อ> (); ขนาด int คงที่ส่วนตัว; // อ่าน private connutils5 () {} คงที่ {คุณสมบัติ p = คุณสมบัติใหม่ (); ลอง {// วิธีการต่อไปนี้สามารถอ่านไฟล์ทรัพยากรภายใต้ ClassPath ในโครงการ Java บริสุทธิ์ แต่ไม่สามารถอ่านโครงการ Javaee ได้ เนื่องจาก Tomcat เปลี่ยน Loader คลาสเริ่มต้นของระบบ //p.load (classloader.getSystemClassLoader (). getSystemResourceasstream ("jdbc.properties")); // p.load (classloader.getSystemResourceasstream ("jdbc.properties")); // อ่านไฟล์ทรัพยากรภายใต้ classpath ของโครงการเว็บใช้สิ่งนี้เพื่อ p.load (connutils3.class.getclassloader (). getResourceasstream ("jdbc.properties")); สตริงไดรเวอร์ = P.GetProperty ("ไดรเวอร์"); string url = p.getProperty ("url"); ชื่อสตริง = P.GetProperty ("ชื่อผู้ใช้"); สตริง pwd = p.getProperty ("รหัสผ่าน"); String ssize = P.GetProperty ("ขนาด"); size = integer.parseint (ssize); class.forname (ไดรเวอร์); สำหรับ (int i = 0; i <size; i ++) {การเชื่อมต่อสุดท้าย con = drivermanager.getConnection (url, ชื่อ, pwd); System.out.println ("con =="+con); // เปลี่ยนเมธอด conn.close () // ใช้โหมดพร็อกซีเพื่อสร้างเวอร์ชันที่ปรับปรุงแล้วของวัตถุ Conn, การสกัดกั้นและเปลี่ยนวิธีการปิด () เป็นวัตถุ ncon = proxy.newproxyinstance (connutils3.class.getclassloader โปรแกรม (ตัวโหลดคลาสแตกต่างกัน) คลาสใหม่ [] {connection.class}, ใหม่ rechocationHandler () {@Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุ, วิธีการ, วัตถุ [] args) โยนลงไปได้ {ถ้า method.getName (); null;} วิธีการกลับมา (con, args); pool.add ((การเชื่อมต่อ) ncon); }} catch (exception e) {e.printstacktrace (); }} การเชื่อมต่อแบบซิงโครไนซ์แบบคงที่สาธารณะ getConnection () {// รับจาก t ก่อนถ้ามีหนึ่งให้นำออกมา ถ้าไม่คว้ามันไว้ในสระว่ายน้ำและใส่วัตถุในการเชื่อมต่อ t con = t.get (); if (con == null) {ถ้า (pool.size () <= 0) {system.out.println ("การเชื่อมต่อในพูลหายไป ... "); ลอง {thread.sleep (1,000); } catch (interruptedException 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; txproxy ส่วนตัว (Object srcobj) {this.srcobj = srcobj; } วัตถุสาธารณะคงที่ getProxy (Object srcobj) {system.out.println ("srcobj:"+srcobj); Object newObj = proxy.newproxyinstance (txproxy.class.getclassloader (), srcobj.getClass (). getInterfaces (), txproxy ใหม่ (srcobj)); System.out.println ("newobj:"+newobj); คืน Newobj; } @Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุ, วิธีการ, วัตถุ [] args) โยน throwable {connection con = null; Object returnobj = null; ลอง {con = connutils5.getConnection (); System.out.println ("เรียกใช้ลิงก์:"+con); Con.setAutocommit (เท็จ); returnobj = method.invoke (srcobj, args); System.out.println ("ส่งธุรกรรม ... "); Con.Commit (); } catch (exception e) {ลอง {system.out.println ("ย้อนกลับการทำธุรกรรม ... "); Con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} ในที่สุด {ลอง {con.setautocommit (จริง); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} returnObj; -ตัวแทนที่ 2: ไม่จำเป็นต้องบังคับการถ่ายโอน แต่ทั้งหมด
แพ็คเกจ cn.hncu.utils; นำเข้า java.lang.reflect.invocationhandler; นำเข้า java.lang.reflect.method; นำเข้า java.lang.reflect.proxy; นำเข้า java.sql.connection; นำเข้า Java.sql.sqlexception; ส่วนตัว txproxy2 (วัตถุ srcobj) {this.srcobj = srcobj; } สาธารณะคงที่ <t> t getProxy (คลาส <t> c) {object obj = null; ลอง {obj = c.newinstance (); } catch (exception e) {e.printstacktrace (); } Object newObj = proxy.newproxyinstance (txproxy2.class.getclassloader (), c.getInterfaces (), txproxy2 ใหม่ (obj)); return (t) newobj; } @Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุ, วิธีการ, วัตถุ [] args) โยน throwable {connection con = null; Object returnobj = null; ลอง {con = connutils5.getConnection (); System.out.println ("เรียกใช้ลิงก์:"+con); Con.setAutocommit (เท็จ); returnobj = method.invoke (srcobj, args); System.out.println ("ส่งธุรกรรม ... "); Con.Commit (); } catch (exception e) {ลอง {system.out.println ("Rolle ย้อนกลับการทำธุรกรรม ... "); Con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} ในที่สุด {ลอง {con.setautocommit (จริง); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} returnObj; -คำอธิบายประกอบ
แพ็คเกจ cn.hncu.utils; นำเข้า java.lang.annotation.elementtype; นำเข้า java.lang.annotation.retention; นำเข้า java.lang.annotation.retentionpolicy; นำเข้า java.lang.annotation.target; ธุรกรรม {}ตัวแทน 3: ใช้คำอธิบายประกอบเพื่อใช้ธุรกรรมเมื่อจำเป็น
แพ็คเกจ cn.hncu.utils; นำเข้า java.lang.reflect.invocationhandler; นำเข้า java.lang.reflect.method; นำเข้า java.lang.reflect.proxy; นำเข้า java.sql.connection; นำเข้า Java.sql.sqlexception; txproxy3 ส่วนตัว (Object srcobj) {this.srcobj = srcobj; } สาธารณะคงที่ <t> t getProxy (t srcobj) {object newObj = proxy.newproxyinstance (txproxy3.class.getClassloader (), srcobj.getClass () getInterfaces (), txproxy3 (srcobj)); return (t) newobj; } @Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีเมธอด, วัตถุ [] args) พ่น throwable { /* วิธีนี้จะใช้เฉพาะการสกัดกั้นวิธีการที่ระบุถ้า (method.getName (). เท่ากับ ("ปิด") {... สกัดกั้น} อื่น {วิธีการส่งคืน } */ if (method.isannotationpresent (transaction.class)) {การเชื่อมต่อ con = null; Object returnobj = null; ลอง {con = connutils5.getConnection (); System.out.println ("เรียกใช้ลิงก์:"+con); Con.setAutocommit (เท็จ); // รหัสธุรกิจจริง, returnobj = method.invoke (srcobj, args); System.out.println ("ส่งธุรกรรม ... "); Con.Commit (); } catch (exception e) {ลอง {system.out.println ("Rolle ย้อนกลับการทำธุรกรรม ... "); Con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} ในที่สุด {ลอง {con.setautocommit (จริง); con.close (); } catch (sqlexception e) {e.printstacktrace (); }} returnObj; } else {system.out.println ("ไม่มีคำอธิบายประกอบการทำธุรกรรมเพียงแค่ปล่อยมัน!"); return method.invoke (srcobj, args); -ไฟล์ทรัพยากร jdbc.properties
## mysqldriver = com.mysql.jdbc.driverurl = jdbc: mysql: //127.0.0.1: 3306/hncu? d = 1234Size = 3 ## Oracle#driver = oracle.jdbc.driver.oracledriver#url = jdbc: Oracle: Thin:@127.0.0.1: 1521: ORCL#username = Scott#รหัสผ่าน = Tiger
queryservlet.java servlet เลเยอร์ของ stud layer
แพ็คเกจ cn.hncu.stud.servlet; นำเข้า java.io.ioexception; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; javax.servlet.http.htttservletResponse; นำเข้า cn.hncu.domain.book; นำเข้า cn.hncu.domain.stud; นำเข้า cn.hncu.stud.service.istudservice; นำเข้า cn.hncu.stud.service.studserviceimpl; queryServlet ขยาย httpservlet {//inject//1.// istudservice service = (istudservice) txproxy.getProxy (studserviceimpl ใหม่ ()); //2.// iTudService Service = txproxy2.getProxy (studserviceimpl.class); // 3. istudservice service = txproxy3.getproxy (studserviceimpl ใหม่ ()); โมฆะสาธารณะ DOGET (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {dopost (คำขอ, การตอบสนอง); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {string cmd = request.getParameter ("cmd"); System.out.println ("CMD:"+CMD); if ("Query" .equals (CMD)) {Query (คำขอ, การตอบกลับ); } อื่นถ้า ("เพิ่ม" .equals (cmd)) {เพิ่ม (คำขอ, การตอบกลับ); }} แบบสอบถามโมฆะสาธารณะ (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {system.out.println ("บริการ:"+บริการ); รายการ <แผนที่ <สตริงสตริง >> studs = service.query (); request.setAttribute ("studs", studs); request.getRequestDispatcher ("/jsps/show.jsp"). forward (คำขอ, การตอบกลับ); } โมฆะสาธารณะเพิ่ม (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {// 1 รวบรวมพารามิเตอร์ 2 จัดพารามิเตอร์ (ออกจากฟิลด์ ID ใน DAO เพื่อเสริม) ชื่อสตริง [] = request.getParametervalues ("ชื่อ"); Stud S = New Stud (); S.SetName (ชื่อ [0]); // หนังสือข้อมูลสตริงหนังสือ [] = request.getParametervalues ("หนังสือ"); // Protect --- ควรเขียนการป้องกันราคาด้วย เราขี้เกียจที่นี่ถ้า (หนังสือ == null || books.length <= 0) {return; } ราคาสตริง [] = request.getParameterValues ("ราคา"); สำหรับ (int i = 0; i <books.length; i ++) {book b = หนังสือเล่มใหม่ (); B.SetName (หนังสือ [i]); b.setprice (double.parsedouble (ราคา [i])); // ※เสร็จสิ้นการห่อหุ้มข้อมูลของความสัมพันธ์ "แบบหนึ่งต่อหลาย ๆ " ระหว่างวัตถุสองค่า s.getBooks (). เพิ่ม (b); // หนึ่งฝ่าย B.Sets (s); // หลายฝ่าย} // 3 เรียกเลเยอร์บริการลอง {service.save (s); } catch (exception e) {// ทิศทางล้มเหลวหน้า}}} ชั้นบริการของชั้นสตั๊ด
อินเทอร์เฟซ:
แพ็คเกจ cn.hncu.stud.service; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า cn.hncu.domain.stud; นำเข้า cn.hncu.utils.transaction; // โปรดทราบว่าคำอธิบายประกอบมีประโยชน์เฉพาะในอินเทอร์เฟซ ,,,, วิธีการที่เขียนในคลาสการใช้งานไม่ถูกต้อง (จะไม่ตัดสินใจที่จะเริ่มการทำธุรกรรม) @Transaction void save (Stud stud) โยนข้อยกเว้น;}
คลาสการดำเนินการ
แพ็คเกจ cn.hncu.stud.service; นำเข้า java.sql.connection; นำเข้า java.sql.sqlexception; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า cn.hncu.domain.stud; 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 การทำธุรกรรมจะต้องเปิดด้วย */คลาสสาธารณะ studserviceimpl ใช้ iTudService {// inject studdao dao_stud = ใหม่ studjdbcdao (); bookdao dao_book = ใหม่ bookjdbcdao (); @Override รายการสาธารณะ <แผนที่ <string, string >> query () {return dao_stud.query (); } @Override โมฆะสาธารณะบันทึก (สตั๊ดสตั๊ด) โยนข้อยกเว้น {dao_stud.save (สตั๊ด); dao_book.save (stud.getbooks ()); - ชั้น Dao ของชั้น Stu
การแยกการแยกอินเทอร์เฟซสตั๊ดหนึ่งตารางสอดคล้องกับหนึ่ง DAO เตรียมสำหรับกรอบการทำงาน
แพ็คเกจ cn.hncu.stud.dao; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า cn.hncu.domain.stud; อินเตอร์เฟสสาธารณะ studdao {รายการสาธารณะ <แผนที่ <สตริง, สตริง >> query (); โมฆะสาธารณะบันทึก (สตั๊ดสตั๊ด) โยนข้อยกเว้น;}คลาสการใช้งานสตั๊ด
แพ็คเกจ cn.hncu.stud.dao; นำเข้า java.sql.connection; นำเข้า java.sql.preparedStatement; นำเข้า java.sql.resultset นำเข้า java.sql.sqlexception; นำเข้า Java.sql.statement; java.util.list; นำเข้า java.util.map; นำเข้า java.util.uuid; นำเข้า cn.hncu.domain.book; นำเข้า cn.hncu.domain.stud; นำเข้า cn.hncu.utils.connutils3; รายการ <แผนที่ <สตริง, สตริง >> list = arrayList ใหม่ <แผนที่ <สตริง, สตริง >> (); // แผนที่เป็นแถวของข้อมูลรายการ <ap> คือการเชื่อมต่อตารางข้อมูลทั้งหมด con = null; ลอง {con = connutils3.getConnection (); คำสั่ง st = con.createstatement (); String SQL = "SELECT * จาก Stud"; resultset rs = stexecuteQuery (SQL); ในขณะที่ (rs.next ()) {map <string, string> m = new hashmap <string, string> (); m.put ("id", (สตริง) rs.getObject (1)); m.put ("ชื่อ", (สตริง) rs.getObject (2)); list.add (m); } rs.close (); St.Close (); } catch (sqlexception e) {e.printstacktrace (); } ในที่สุด {ลอง {con.close (); } catch (sqlexception e) {e.printstacktrace (); }} รายการส่งคืน; } @Override โมฆะสาธารณะบันทึก (สตั๊ดสตั๊ด) โยนข้อยกเว้น {การเชื่อมต่อ con = connutils3.getConnection (); System.out.println ("รับลิงค์:"+con); String sql = "แทรกลงในค่าสตั๊ด (?,?)"; string uuid = uuid.randomuuid (). toString (). แทนที่ ("-", ""); PreparedStatement PST = con.prepareStatement (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; นำเข้า java.util.list; นำเข้า cn.hncu.domain.book; อินเตอร์เฟสสาธารณะ bookdao {โมฆะสาธารณะบันทึก (รายการ <book> หนังสือ) โยนข้อยกเว้น;}}ชั้นเรียนการใช้งานหนังสือ
แพ็คเกจ cn.hncu.stud.dao; นำเข้า java.sql.connection; นำเข้า java.sql.preparedStatement; นำเข้า java.util.list; นำเข้า cn.hncu.domain.book; นำเข้า cn.hncu.utils.connutils3; หนังสือ) โยนข้อยกเว้น {การเชื่อมต่อ con = connutils3.getConnection (); System.out.println ("รับลิงค์:"+con); String sql = "แทรกลงในหนังสือ (ชื่อราคา, studid) ค่า (?,?,?)"; PreparedStatement PST = con.prepareStatement (SQL); สำหรับ (หนังสือ B: หนังสือ) {pst.setstring (1, b.getName ()); pst.setDouble (2, b.getPrice ()); PST.SetObject (3, "12132312"); // ข้อยกเว้น (จงใจให้ฟิลด์คีย์ต่างประเทศที่ไม่มีอยู่เพื่อทดสอบการทำธุรกรรมย้อนกลับ)-การทดสอบการทำธุรกรรมการทำธุรกรรม // 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; นำเข้า java.util.list;/** เมธอดสำหรับการสร้างวัตถุค่า "หนึ่ง" ในหนึ่งถึงหนึ่งในหลาย ๆ ชื่อสตริงส่วนตัว; // ※เพิ่มคอลเลกชันโดยเฉพาะสำหรับสี่เหลี่ยม "หลาย" --- สะท้อนให้เห็นถึง "ความสัมพันธ์แบบหนึ่งต่อหลายคน" ในรายการส่วนตัวหลายตาราง <book> หนังสือ = New ArrayList <Book> (); // โปรดทราบว่าคอลเลกชันจะต้องใหม่ที่หรือก่อนการก่อสร้าง สตริงสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (รหัสสตริง) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } รายการสาธารณะ <book> getBooks () {ส่งคืนหนังสือ; } void setbooks สาธารณะ (รายการ <book> หนังสือ) {this.books = หนังสือ; } @Override สตริงสาธารณะ toString () {return "id =" + id + "," + name + "," + หนังสือ; -จองวัตถุ
แพ็คเกจ cn.hncu.domain;/** เมธอดสำหรับการสร้างวัตถุค่าสแควร์ "หลาย" ในหนังสือชั้นเรียนแบบหนึ่งต่อหลาย ๆ // ประเภทข้อมูลพื้นฐานทั้งหมดได้รับการประกาศโดยคลาสบรรจุภัณฑ์เพื่อเตรียมพร้อมสำหรับการใช้เฟรมเวิร์กในอนาคต --- คลาสบรรจุภัณฑ์เข้ากันได้กับเฟรมเวิร์ก (เพราะโดยทั่วไปเฟรมเวิร์กใช้การสะท้อนคลาส) ชื่อสตริงส่วนตัว; ราคาสองเท่าส่วนตัว // ※เพิ่มตัวแปรของประเภทวัตถุโดยเฉพาะสำหรับ "หนึ่ง" สแควร์ (หมายเหตุอย่าใช้การศึกษา) --- สะท้อนให้เห็นถึง "ความสัมพันธ์แบบหนึ่งต่อหลายครั้ง" ในหลายตารางสตั๊ดส่วนตัว s; // ตั้งค่าหลัก // การศึกษาสตริงส่วนตัว; // ★★ไม่ตั้งค่าจำนวนเต็มสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (ID จำนวนเต็ม) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } สาธารณะ double getPrice () {ราคาคืน; } โมฆะสาธารณะ setPrice (ราคาสองเท่า) {this.price = ราคา; } สตั๊ดสาธารณะได้รับ () {return s; } ชุดโมฆะสาธารณะ (Stud S) {this.s = s; } / * * เมื่อสมาคมหลายตารางคุณควรให้ความสนใจกับกับดักนั่นคือฝ่ายหนึ่งจะส่งออกฝ่ายอื่นและอีกฝ่ายหนึ่งจะส่งออกฝ่ายก่อนหน้า */@Override สตริงสาธารณะ toString () {return "id =" + id + "," + name + "," + price; // วัตถุสตั๊ดไม่สามารถส่งออกได้ที่นี่แสดงหน้าข้อมูลนักเรียน jsps/show.jsp
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" huadd> <html> <html> <c: foreach items = "$ {studs}" var = "x"> $ {x.id}, $ {x.name} <br/> </c: foreach> </body> </html>ภาพการทำซ้ำ:
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น