이 예제의 학생 정보는 데이터베이스에 트랜잭션을 추가합니다 (트랜잭션을 제출할 수 있고, 트랜잭션을 롤백하고 로컬 스레드로 개선 할 수 있음)
메인 페이지 index.jsp
<%@ page language = "java"import = "java.util.*"pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core"prefix = "c"%> <html> <head> <stull informal management </head> <in ur). value = "/query"/>? cmd = query '> 학생 정보보기 </a> <br> <br> <!-<a href = "<c : url value ='/studservlet? cmd = save '/>"> 학생 정보 추가 </a>-> <h2> 학생 정보 추가 </h2> <양식 행동 ='<c : url value = "/Query"/Query "/Query"/Query "/Query 이름 : <입력 유형 = "text"name = "name"/> <br> <br> <fieldset style = "border : border : solid; border-color : red; width : 250px;"> <gegend> book1 </범례> 제목 : <입력 유형 = "text"name = "book"/> <br> <br> price : <input type = "text ="prost "/filddet"/filddet " Style = "Border : Solid; Border-Color : Green; 너비 : 250px;"> <전설> 책 2 </Legend> 제목 : <입력 유형 = "텍스트"이름 = "book"/> <br> <br> price : <입력 유형 = "텍스트"이름 = "price"/> </fieldset> <br> <br> <value = "values"/> <br> <br> <br> <br> <br> <br> <br> <br>. </body> </html>
데이터베이스 연결을 얻기위한 도구 connutils5.java
패키지 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.util.ava.arraylist; java.util.properties; public class connutils5 {// 로컬 스레드 관리 객체, 구현에 사용됩니다 : 동일한 스레드에서 얻은 연결은 동일한 개인 stricklocal <connection> t = new ThreadLocal <connection> (); 개인 최종 정적 목록 <conn 비공개 정적 int 크기; // private connutils5 () {} static {properties p = new Properties (); {// 다음 방법은 순수한 Java 프로젝트에서 ClassPath에서 리소스 파일을 읽을 수 있지만 Javaee 프로젝트를 읽을 수는 없습니다. Tomcat이 시스템의 기본 클래스 로더 //p.load를 변경했기 때문에 (ClassLoader.getSystemClassLoader (). getSystemResourceasStream ( "jdbc.properties")); // p.load (classLoader.getSystemResourceasStream ( "jdbc.properties")); // 웹 프로젝트의 클래스 경로 아래에서 리소스 파일을 읽으면서 이것을 p.load (connutils3.class.getClassLoader (). getResourCeasStream ( "jdbc.properties")에 사용하십시오. 문자열 드라이버 = p.getProperty ( "드라이버"); 문자열 url = p.getProperty ( "url"); 문자열 이름 = p.getProperty ( "사용자 이름"); 문자열 pwd = p.getProperty ( "비밀번호"); 문자열 ssize = p.getProperty ( "size"); size = integer.parseint (ssize); class.forname (드라이버); for (int i = 0; i <size; i ++) {Final Connection con = driverManager.getConnection (url, name, pwd); System.out.println ( "con =="+con); // conn.close () 메소드를 변경하여 프록시 모드를 사용하여 Conn Object의 향상된 버전을 생성하고 Close () 메소드를 객체 NCON = proxy.newProxyInstance (Connutils3.class.getClassLoader (), // conngetcasces (), // getterfaces (), // 똑같이 작동하지 않아야합니다. 프로그램 (클래스 로더는 다릅니다) 새 클래스 [] {connection.class}, new invocationHandler () {@Override public 객체, 대상 [] args)은 던질 수있는 {if (method.getName () null;} return.invoke (con, args); pool.add ((Connection) NCON); }} catch (예외 e) {e.printstacktrace (); }} public static synchronized connection getConnection () {// t에서 먼저 가져 오십시오. 그렇지 않은 경우 수영장에서 가져 와서 객체를 t 연결 con = t.get ()에 넣으십시오. if (con == null) {if (pool.size () <= 0) {System.out.println ( "풀의 연결이 사라졌습니다 ..."); try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } return getConnection (); } con = pool.remove (0); t.set (con); // 그것을 t} return con; // 하나를 움직일 수 있습니다}}}리소스 파일 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 : thin :@127.0.0.1 : 1521 : orcl#username = scott#password = tiger
가치 객체
Stud.java
패키지 cn.hncu.domain; import java.util.arraylist; import java.util.list;/** "One"Square value 객체를 생성하는 방법*/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 (문자열 이름) {this.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; }}BOOK.java
패키지 cn.hncu.domain;/** "Multi"Square Value Objects를 일대일*/공개 클래스 책 {Private Integer ID; // 모든 기본 데이터 유형은 포장 클래스에 의해 미래의 프레임 워크 사용을 준비하기 위해 선언합니다. 개인 이중 가격; // ※ "One"Square (참고, 연구하지 마십시오)에 대해 특별히 객체 유형의 변수를 추가하십시오. } public void setId (정수 ID) {this.id = id; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public double getPrice () {반환 가격; } public void setPrice (이중 가격) {this.price = 가격; } public stud gets () {return s; } public void sets (스터드 s) {this.s = s; } / * * 멀티 테이블 연관이있을 때 트랩에주의를 기울여야합니다. 즉, 한 당사자는 다른 당사자를 출력하고 다른 당사자는 이전 당사자를 출력하여 무한 재귀를 형성합니다! */@override public String toString () {return "id =" + id + "," + name + "," + price; // 스터드 객체는 여기서 출력 할 수 없으며, 그렇지 않으면 무한 재귀}}QueryServlet.java 스터드 레이어의 서블릿 레이어
패키지 cn.hncu.stud.servlet; import java.io.ioexception; import java.util.list; import java.util.map; import javax.servlet.servletexception; import javax.servlet.http.httpervlet; import javax.servlet.httpper.httpper.httppect. javax.servlet.http.http.httpervletresponse; import cn.hncu.domain.book; import cn.hncu.domain.stud; import cn.hncu.stud.service.istudservice; import cn.hncu.stud.service.service.service.service.istudservice; public classe queryservlet extend extend httpervlet extends httpervlet extends httpervlet extende istudservice service = new Studserviceimpl (); public void doget (httpservletrequest request, httpservletresponse 응답)은 servletexception, ioexception {dopost (요청, 응답); } public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {string cmd = request.getParameter ( "cmd"); System.out.println ( "CMD :"+CMD); if ( "query".equals (cmd)) {query (요청, 응답); } else if ( "add".equals (cmd)) {add (요청, 응답); }} public void query (httpservletrequest 요청, httpservletreponse 응답) servletexception, ioexception {list <map <string, String >> studs = service.query (); request.setAttribute ( "스터드", 스터드); request.getRequestDispatcher ( "/jsps/show.jsp"). FORMPER (요청, 응답); } public void add (httpservletrequest 요청, httpservletreponse response)는 servletexception, ioexception {// 1 수집 매개 변수를 구성합니다. System.out.println (이름 [0]); 스터드 S = 새로운 스터드 (); S.SetName (이름 [0]); // 책 정보 문자열 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 (). add (b); // One-Party B.Sets (S); // Multiple-Party} // 3call 서비스 계층 try {service.save (s); } catch (예외 e) {// Direction Failed Page}}}스터드 레이어의 서비스 계층 인터페이스 :
패키지 cn.hncu.stud.service; import java.util.list; import java.util.map; import cn.hncu.domain.stud; public interface istudservice {public list <string, string >> query (); 공개 무효 저장 (스터드 스터드);}구현 클래스
패키지 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; 수입 cn.hncu.stud.dao.bookdao; import cn.hncu.stud.dao.bookjdbcdao; import cn.hncu.stud.dao.studdao; import cn.hncu.utils.connutils3;/*import cn.hncu.utils.connutils3;/*우리는 일반적으로 독립적으로 운영하기 위해 테이블을 사용합니다. 시스템에 여러 엔티티 테이블이있는 경우 몇 가지 DAO를 작성하십시오. * 미래에 프레임 워크가이를 수행 할 것이며, 아키텍처가 좋기 때문에이 작업을 수행해야합니다! * * 트랜잭션을 사용하는 경우 : * 1. DAO가 하나만 있지만 여러 SQL 문을 실행하고 추가, 삭제 및 수정 해야하는 경우 트랜잭션을 열어야합니다. 2. 서비스가 여러 DAO를 호출하는 경우 거래도 열어야합니다. */public class studserviceimpl implements istudservice {// studdao dao_stud = new Studjdbcdao (); Bookdao dao_book = 새로운 Bookjdbcdao (); @override public list <map <string, string >> query () {return dao_stud.query (); } @override public void save (스터드 스터드) {connection con = null; try {con = connutils3.getConnection (); System.out.println ( "링크 받기 :"+con); con.setAutocommit (false); dao_stud.save (스터드); dao_book.save (stud.getbooks ()); System.out.println ( "거래 커밋 ..."); con.commit (); } catch (예외 e) {try {system.out.println ( "트랜잭션을 롤링 ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} 마침내 {try {con.setAutocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }}}} STU 층의 DAO 층
스터드 인터페이스
패키지 cn.hncu.stud.dao; import java.util.list; import java.util.map; import cn.hncu.domain.stud; public interface studdao {public list <map <string, string >> query (); Public Void Save (Stud Stud)는 예외를 던집니다;}스터드 구현 클래스
패키지 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; java.util.hashmat; 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 studdao emplements (string) <) list <map <string, String >> list = new ArrayList <map <String, String >> (); // 맵은 데이터 행입니다. List <cap>은 전체 데이터 테이블 연결 CON = NULL입니다. try {con = connutils3.getConnection (); Statement st = con.createstatement (); 문자열 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 ( "이름", (문자열) rs.getObject (2)); list.add (m); } rs.close (); St.Close (); } catch (sqlexception e) {e.printstacktrace (); } 마침내 {try {con.close (); } catch (sqlexception e) {e.printstacktrace (); }} 리턴 목록; } @override public void save (stud stud) throws exception {connection con = connutils3.getConnection (); System.out.println ( "링크 받기 :"+con); 문자열 sql = "스터드 값 (?,?)에 삽입"; 문자열 uuid = uuid.randomuuid (). tostring (). replace ( "-", ""); preparedstatement pst = con.preparestatement (SQL); Stud.SetId (uuid); // "여러 당사자"를 위해서, 즉,이 책은 "한 파티"ID를 얻을 수 있으며, PST.SetString (1, uuid)을 특별히 보충합니다. pst.setString (2, stud.getName ()); System.out.println ( "1 :"+uuid+", 2 :"+stud.getname ()); pst.executeupdate (); // con.close (); // 동일한 사기를 얻으십시오. 여기에 닫을 필요가 없습니다}}책 인터페이스
패키지 cn.hncu.stud.dao; import java.util.list; import cn.hncu.domain.book; public interface bookdao {public void save (list <book> books) 예외;}도서 구현 수업
패키지 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 public vord public voupride public vord {vookdao {public vord bookjdbcdao Books)는 예외 {Connection con = connutils3.getConnection (); System.out.println ( "링크 받기 :"+con); 문자열 sql = "책에 삽입 (이름, 가격, studid) 값 (?,?,?); preparedstatement pst = con.preparestatement (SQL); for (book b : books) {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 (); // batch에 추가} pst.executebatch (); // batch // con.close (); // 여기에 동일한 사기를 얻습니다. 여기에 닫을 필요가 없습니다}}}학생 정보 페이지 jsps/show.jsp 표시
<%@ page language = "java"import = "java.util.*"pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core"prefix = "c"%> <html> <html> <head> title> </head> </head> </head> </head> </head> <c : foreach items = "$ {studs}"var = "x"> $ {x.id}, $ {x.name} <br/> </c : foreach> </body> </html>생식 이미지 :
관리 시스템에 대한 자세한 내용은 "관리 시스템 특별 주제"를 클릭하여 배우십시오.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.