이 예제의 학생 정보는 데이터베이스에 트랜잭션을 추가합니다 (트랜잭션을 제출할 수 있고, 트랜잭션을 롤백하고 로컬 스레드로 개선 할 수 있음)
메인 페이지 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; // 하나를 움직일 수 있습니다}}}연기
패키지 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.sqlexcection; public 객체 strcobj = null rementments {public class and allller; private txproxy (object srcobj) {this.srcobj = srcobj; } public static 객체 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 (개체 프록시, 메소드 메소드, 개체 [] args) 던져 버릴 수있는 {connection con = null; 객체 returnObj = null; try {con = connutils5.getConnection (); System.out.println ( "호출은 링크를 얻었습니다 :"+con); con.setAutocommit (false); returnObj = method.invoke (srcobj, args); 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 (); }} return returnObj; }}에이전트 2 : 이적을 강제 할 필요가 없지만 모두
패키지 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.sqlexception; public shobj = null and emplestments remboction {public grcobj. private txproxy2 (object srcobj) {this.srcobj = srcobj; } public static <t> t getProxy (class <t> c) {object obj = null; try {obj = c.newinstance (); } catch (예외 e) {e.printstacktrace (); } Object NewOBJ = proxy.NewProxyInstance (txproxy2.class.getClassLoader (), c.getInterfaces (), new txproxy2 (obj)); 리턴 (t) Newobj; } @override public object invoke (개체 프록시, 메소드 메소드, 개체 [] args) 던져 버릴 수있는 {connection con = null; 객체 returnObj = null; try {con = connutils5.getConnection (); System.out.println ( "호출은 링크를 얻었습니다 :"+con); con.setAutocommit (false); returnObj = method.invoke (srcobj, args); 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 (); }} return returnObj; }}주석
패키지 cn.hncu.utils; import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; import java.lang.annotation.target (value = elementtype.method)@intercation {}에이전트 3 : 주석을 사용하여 필요할 때 거래를 구현하십시오
패키지 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.sqlexcection; public srcobj = null and empless empless empless empless empless emptrements rempless and lemport java.sql.connection; 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 (오브젝트 프록시, 메소드 메소드, 개체 [] args) 던지기 가능 { /*이 방법은 지정된 메소드를 가로 채기 만하면 (method.getName (). equals ( "close")) {... intercept} else {return method.invoke (srcobj, args); } */ if (method.isannotationPresent (transaction.class)) {Connection con = null; 객체 returnObj = null; try {con = connutils5.getConnection (); System.out.println ( "호출은 링크를 얻었습니다 :"+con); con.setAutocommit (false); // 실제 비즈니스 코드, 릴리스 returnObj = method.invoke (srcobj, args); 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 (); }} return 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? 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
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.studserviceimpl; public class.util.txprody3 QueryServlet는 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 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 {system.out.println ( "service :"+service); List <map <String, String >> studs = service.query (); request.setAttribute ( "스터드", 스터드); request.getRequestDispatcher ( "/jsps/show.jsp"). FORMPER (요청, 응답); } public void add (httpservletRequest 요청, httpservletResponse 응답)는 servletexception, ioexception {// 1 수집 매개 변수 2 매개 변수를 구성합니다 (dao에서 id 필드를 보충제로 맡기는) 문자열 이름 [] = request.getParameTervalues ( "name"); 스터드 S = 새로운 스터드 (); S.SetName (이름 [0]); // 책 정보 문자열 books [] = request.getParametErvalues ( "book"); // 보호 --- 가격 보호도 작성해야합니다. 우리는 여기에 게으르다. } 문자열 가격 [] = 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} // 3 서비스 계층을 호출하십시오 {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; import cn.hncu.utils.transaction; public interface istudservice {public list <map <문자열, 문자열 >> Query (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.connutils5;/*미래 발전 중에는 테이블을 사용합니다. 시스템에 여러 엔티티 테이블이있는 경우 몇 가지 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 (Stud Stud)는 예외 {dao_stud.save (stud); dao_book.save (stud.getbooks ()); }} STU 층의 DAO 층
스터드 인터페이스 분리 연습, 하나의 테이블은 하나의 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 (); // 여기에 동일한 사기를 얻습니다. 여기에 닫을 필요가 없습니다}}} 가치 객체
스터드 객체
패키지 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; }}책 대상
패키지 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; // 스터드 객체는 여기서 출력 할 수 없으며, 그렇지 않으면 무한 재귀}}학생 정보 페이지 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을 더 지원하기를 바랍니다.