-
JSP와 데이터베이스연동2(DAO패턴 적용)jsp(Model1) 2020. 5. 17. 01:17
DAO란 DataAccessObject의 줄임말. DataBase에 접근하는 별도의 클래스를 만들어서 사용한다.
MemberJon.jsp(회원가입화면)
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>Insert title here</title> </head> <body> <center> <h2>회원 가입</h2> <form action = "MemberJoinProc.jsp" method = "post"> <table width = "500" border = "1"> <tr height="50"> <td width="150" align="center">아이디</td> <td width="350" align="center"> <input type="text" name="id" size="40" placeholder="아이디를 입력해주세요"> </td> </tr> <tr height="50"> <td width="150" align="center">패스워드</td> <td width="350" align="center"> <input type="password" name="pass1" size="40"> </td> </tr> <tr height="50"> <td width="150" align="center">패스워드확인</td> <td width="350" align="center"> <input type="password" name="pass2" size="40"> </td> </tr> </tr> <tr height="50"> <td width="150" align="center">이메일</td> <td width="350" align="center"> <input type="email" name="email" size="40"> </td> </tr> <tr height="50"> <td width="150" align="center">전화번호</td> <td width="350" align="center"> <input type="tel" name="tel" size="40"> </td> </tr> <tr height="50"> <td width="150" align="center">당신의 관심분야</td> <td width="350" align="center"> <input type="checkbox" name="hobby" value="캠핑">캠핑 <input type="checkbox" name="hobby" value="등산">등산 <input type="checkbox" name="hobby" value="영화">영화 <input type="checkbox" name="hobby" value="독서">독서 </td> </tr> <tr height="50"> <td width="150" align="center">당신의 직업은</td> <td width="350" align="center"> <select name="job"> <option value="교사">교사</option> <option value="변호사">변호사</option> <option value="의사">의사</option> <option value="기술사">기술사</option> </select> </td> </tr> <tr height="50"> <td width="150" align="center">하고 싶은 말</td> <td width="350" align="center"> <textarea rows="5" cols="40" name="info"></textarea> </td> </tr> <tr height="50"> <td width="150" align="center">당신의 연령은</td> <td width="350" align="center"> <input type="radio" name="age" value="10">10대 <input type="radio" name="age" value="20">20대 <input type="radio" name="age" value="30">30대 <input type="radio" name="age" value="40">40대 </td> </tr> <tr height="50"> <td colspan="2" align="center"> <input type="submit" value="회원가입"> <input type="reset" value="취소"> </td> </tr> </table> </form> </center> </body> </html>
MemberJoinProc.jsp(회원가입 처리)
<%@page import="model.MemberDAO"%> <%@page import="java.sql.PreparedStatement"%> <%@page import="java.sql.DriverManager"%> <%@page import="java.sql.Connection"%> <%@page import="model.MemberBean"%> <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>Insert title here</title> </head> <body> <% request.setCharacterEncoding("euc-kr");//한글처리 //취미 부분은 별도로 읽어드려 다시 빈 클래스에 저장(여러개이기 때문에 배열로 받아서 저장해 줘야 한다.) String [] hobby = request.getParameterValues("hobby"); //배열에 있는 내용을 하나의 스트링으로 저장 String texthobby = new String(); for(int i = 0; i<hobby.length; i++){ texthobby += hobby[i] + " "; } %> <!-- useBean을 이용하여 한꺼번에 데이터를 받아옴 --> <jsp:useBean id="mbean" class="model.MemberBean"> <jsp:setProperty name="mbean" property="*" /> </jsp:useBean> <% mbean.setHobby(texthobby); //기존 취미는 주소 번지가 저장이 되기 때문에(배열이기 때문에) 위의 배열의 내용을 하나의 스트링으로 저장한 변수를 다시 입력 /* //오라클에 접속하는 소스를 작성 String id = "wogus";//접속 아이디 String pass = "Akdhfl1593";//접속 패스워드 String url = "jdbc:oracle:thin:@localhost:1521:XE";//접속 url */ /* try{ //1.해당 데이터 베이스를 사용한다고 선언(클래스를 등록 = 오라클용을 사용) Class.forName("oracle.jdbc.driver.OracleDriver"); //2.해당 데이터 베이스에 접속 Connection con = DriverManager.getConnection(url,id,pass); //3.접속 후 쿼리준비하여 String sql = "insert into member values(?,?,?,?,?,?,?,?)"; //4.쿼리를 사용하도록 설정 PreparedStatement pstmt = con.prepareStatement(sql);//jsp에서 쿼리를 사용하도록 설정 //5.?에 맞게 데이터 맵핑 pstmt.setString(1, mbean.getId()); pstmt.setString(2, mbean.getPass1()); pstmt.setString(3, mbean.getEmail()); pstmt.setString(4, mbean.getTel()); pstmt.setString(5, mbean.getHobby()); pstmt.setString(6, mbean.getJob()); pstmt.setString(7, mbean.getAge()); pstmt.setString(8, mbean.getInfo()); //6.오라클에서 쿼리를 실행 pstmt.executeUpdate();//insert, update, delete 에서 사용하는 메서드 //7.자원 반납(커넥션이 연결되어 있으니깐 끊어줘야한다.) con.close(); }catch(Exception e){ e.printStackTrace(); } */ //데이터베이스 클래스 객체 생성 MemberDAO mdao = new MemberDAO(); mdao.insertMember(mbean); //회원가입이 되었다면 회원 정보를 보여주는 페이지로 이동시킴 response.sendRedirect("MemberList.jsp"); %> <!-- 체크박스로 여러개가 선택된 hobby는 배열을 통해서 받아와 그 배열을 다시 풀어서 하나의 스트링으로 만들어 줘야 한다. 그냥 바로 값을 집어넣게 되면 처음 선택한 하나의 값만 들어가게 된다. --> <h2>당신의 아이디 = <%=mbean.getId() %></h2> 당신의 취미는 = <%=mbean.getHobby() %> Email : <%=mbean.getEmail() %> 오라클에 완료 </body> </html>
MemberList.jsp(전체 회원 리스트)
<%@page import="model.MemberBean"%> <%@page import="java.util.Vector"%> <%@page import="model.MemberDAO"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <!-- 1.데이터 베이스에서 모든 회원의 정보를 가져옴 2.table태그를 이용하여 화면에 회원들의 정보를 출력 --> <% request.setCharacterEncoding("euc-kr"); MemberDAO mdao = new MemberDAO(); //회원들의 정보가 얼마나 저장되어있는지 모르기에 가변길이인 Vector를 이용하여 데이터를 저장해줌 Vector<MemberBean> vec = mdao.allSelectMember(); //처음부터 익스텐션(확장, <>로 표시해준것)을 MemberDAO타입으로만 받겠다고 선언해줬다. //이러면 들어갈때도 MemberDAO로 들어가고 빼올떄도 MemberDAO로 빼기 때문에 //오브젝트 캐스팅을 해줄 필요가 없어서 좋다. //익스텐션을 안써주면 들어올 때 오브젝트 타입으로 들어오기 때문에 //꺼낼 때 하위로 캐스팅을 해줘야한다. %> <h2>모든 회원 보기</h2> <table width="800" border="1"> <tr height="50"> <td align="center" width="150">아이디</td> <td align="center" width="250">이메일</td> <td align="center" width="200">전화번호</td> <td align="center" width="200">취미</td> </tr> <% for(int i = 0; i<vec.size(); i++){ MemberBean bean = vec.get(i);//벡터에 담긴 빈클래스를 하나씩 추출 %> <tr height="50"> <td align="center" width="150"><a href="MemberInfo.jsp?id=<%= bean.getId() %>"><%= bean.getId() %></a></td> <td align="center" width="250"><%= bean.getEmail() %></td> <td align="center" width="200"><%= bean.getTel() %></td> <td align="center" width="200"><%= bean.getHobby() %></td> </tr> <% } %> </table> </body> </html>
멤버 상세보기jsp(멤버 전체보기에서 id에 a태그 걸어줘서 이동)
<%@page import="model.MemberBean"%> <%@page import="model.MemberDAO"%> <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>Insert title here</title> </head> <body> <!-- 1.데이터 베이스에서 한 회원의 정보를 가져옴 2.table태그를 이용하여 화면에 회원의 정보를 출력 --> <% String id = request.getParameter("id");//MemberList에서 넘긴 id를 받아줌 MemberDAO mdao = new MemberDAO(); MemberBean mbean = mdao.oneSelectMember(id); //해당하는 id의 회원정보를 리턴 %> <h2>회원정보보기</h2> <table width = "400" border="1"> <tr height="50"> <td align="center" width="150">아이디</td> <td width="250"><%= mbean.getId() %></td> </tr> <tr height="50"> <td align="center" width="150">이메일</td> <td width="250"><%= mbean.getEmail() %></td> </tr> <tr height="50"> <td align="center" width="150">전화</td> <td width="250"><%= mbean.getTel() %></td> </tr> <tr height="50"> <td align="center" width="150">취미</td> <td width="250"><%= mbean.getHobby() %></td> </tr> <tr height="50"> <td align="center" width="150">나이</td> <td width="250"><%= mbean.getAge() %></td> </tr> <tr height="50"> <td align="center" width="150">정보</td> <td width="250"><%= mbean.getInfo() %></td> </tr> <tr height="50"> <td align="center" colspan="2"> <button onclick="location.href='MemberUpdateForm.jsp?id=<%= mbean.getId()%>'">회원수정</button> <button onclick="location.href='MemberDeleteForm.jsp?id=<%= mbean.getId()%>'">회원삭제</button> <button onclick="location.href='MemberList.jsp?id=<%= mbean.getId()%>'">목록보기</button> <button onclick="location.href='MemberJoin.jsp?id=<%= mbean.getId()%>'">회원가입</button> </td> </tr> </table> </body> </html>
회원정보 수정jsp(폼)
<%@page import="model.MemberBean"%> <%@page import="model.MemberDAO"%> <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>Insert title here</title> </head> <body> <% String id = request.getParameter("id");//MemberList에서 넘긴 id를 받아줌 MemberDAO mdao = new MemberDAO(); MemberBean mbean = mdao.oneSelectMember(id); //해당하는 id의 회원정보를 리턴 %> <h2>회원수정하기</h2> <table width = "400" border="1"> <form action="MemberUpdateProc.jsp" method="post"> <tr height="50"> <td align="center" width="150">아이디</td> <td width="250"><%= mbean.getId() %></td> </tr> <tr height="50"> <td align="center" width="150">이메일</td> <td width="250"> <input type="email" name="email" value="<%= mbean.getEmail() %>"> </td> </tr> <tr height="50"> <td align="center" width="150">전화</td> <td width="250"> <input type="tel" name="tel" value="<%= mbean.getTel() %>"> </td> </tr> <tr height="50"> <td align="center" width="150">취미</td> <td width="250"> <input type="text" name="hobby" value="<%= mbean.getHobby() %>"> </td> </tr> <tr height="50"> <td align="center" width="150">패스워드</td> <td width="250"> <input type="password" name="pass1"> </td> </tr> <tr height="50"> <td align="center" colspan="2"> <input type="hidden" name="id" value="<%=mbean.getId() %>"> <input type="submit" value="회원 수정하기"></form> <!-- 자바스크립트를 사용하는 버튼이 폼태그안에 들어가게 되면 제대로 작동을 안한다. --> <button onclick="location.href='MemberList.jsp'">회원 전체보기</button> </td> </tr> </table> </body> </html>
회원정보 수정 처리 jsp
<%@page import="model.MemberDAO"%> <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>Insert title here</title> </head> <body> <% request.setCharacterEncoding("euc-kr"); %> <jsp:useBean id="mbean" class="model.MemberBean"> <jsp:setProperty name="mbean" property="*"/> </jsp:useBean> <% String id = request.getParameter("id"); MemberDAO mdao = new MemberDAO(); //스트링타입으로 저장되어있는 패스워드를 가져옴(데이터베이스에서 가져온 pass 값이 저장) String pass = mdao.getPass(id); //수정하기 위해서 작성한 패스워드 값과 기존 데이터 베이스에서 가져온 패스워드 값을 비교 if(mbean.getPass1().equals(pass)){//기존 패스와 데이터베이스 패스가 같다면 member 테이블을 수정 //MemberDAO클래스의 회원수정 메소드를 호출 mdao.updateMember(mbean); response.sendRedirect("MemberList.jsp"); }else{ %> <script type="text/javascript"> alert("패스워드가 맞지 않습니다. 다시 확인해 주세요"); history.go(-1); </script> <% } %> </body> </html>
회원 삭제 jsp(폼)
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>Insert title here</title> </head> <body> <h2>회원삭제하기</h2> <table width = "400" border="1"> <form action="MemberDeleteProc.jsp" method="post"> <tr height="50"> <td align="center" width="150">아이디</td> <td width="250"><%= request.getParameter("id") %></td> </tr> <tr height="50"> <td align="center" width="150">패스워드</td> <td width="250"> <input type="password" name="pass1"> </td> </tr> <tr height="50"> <td align="center" colspan="2"> <input type="hidden" name="id" value="<%=request.getParameter("id") %>"> <input type="submit" value="회원 삭제하기"></form> <!-- 자바스크립트를 사용하는 버튼이 폼태그안에 들어가게 되면 제대로 작동을 안한다. --> <button onclick="location.href='MemberList.jsp'">회원 전체보기</button> </td> </tr> </table> </body> </html>
회원 삭제 처리 jsp
<%@page import="model.MemberDAO"%> <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>Insert title here</title> </head> <body> <% request.setCharacterEncoding("euc-kr"); %> <jsp:useBean id="mbean" class="model.MemberBean"> <jsp:setProperty name="mbean" property="*"/> </jsp:useBean> <% String id = request.getParameter("id");//굳이 안해줘도 됨. mbean.getId()에 이미 닮겨있다. MemberDAO mdao = new MemberDAO(); //스트링타입으로 저장되어있는 패스워드를 가져옴(데이터베이스에서 가져온 pass 값이 저장) String pass = mdao.getPass(mbean.getId()); //수정하기 위해서 작성한 패스워드 값과 기존 데이터 베이스에서 가져온 패스워드 값을 비교 if(mbean.getPass1().equals(pass)){//기존 패스와 데이터베이스 패스가 같다면 member 테이블을 수정 //MemberDAO클래스의 회원수정 메소드를 호출 mdao.deleteMember(mbean.getId()); response.sendRedirect("MemberList.jsp"); }else{ %> <script type="text/javascript"> alert("패스워드가 맞지 않습니다. 다시 확인해 주세요"); history.go(-1); </script> <% } %> </body> </html>
MemberBean
package model; public class MemberBean { private String id; private String pass1; private String pass2; private String email; private String tel; private String hobby; private String job; private String age; private String info; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPass1() { return pass1; } public void setPass1(String pass1) { this.pass1 = pass1; } public String getPass2() { return pass2; } public void setPass2(String pass2) { this.pass2 = pass2; } public String getEmail() { return email; } public void setEmail(String eamil) { this.email = eamil; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } }
DAO
package model; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Vector; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; //오라클 데이터 베이스에 연결하고 select, insert, update, delete작업을 실행해주는 클래스 public class MemberDAO { //오라클에 접속하는 소스를 작성 String id = "wogus"; //접속 아이디 String pass = "***"; String url = "jdbc:oracle:thin:@localhost:1521:XE";//접속 url Connection con; //데이터베이스에 접근할 수 있도록 설정 PreparedStatement pstmt; //데이터 베이스에서 쿼리를 실행시켜주는 객체 ResultSet rs; //데이터베이스의 테이블의 결과를 리턴받아 자바에 저장해주는 객체 //데이터베이스에 접근할 수 있도록 도와주는 메소드 public void getCon() { //커넥션 풀을 이용하여 데이터베이스에 접근 try { //외부에서 데이터를 읽어드려야 하기에 Context initctx = new InitialContext(); //톰캣 서버에 정보를 담아 놓은 곳으로 이동 Context envctx = (Context) initctx.lookup("java:comp/env"); //데이터 소스 객체를 선언 DataSource ds = (DataSource) envctx.lookup("jdbc/pool"); //데이터 소스를 기준으로 커넥션을 연결해 주시오 con = ds.getConnection(); }catch(Exception e) { e.printStackTrace(); } /* * try { //1.해당 데이터 베이스를 사용한다고 선언(클래스를 등록 = 오라클용을 사용) * Class.forName("oracle.jdbc.driver.OracleDriver"); *2.해당 데이터 베이스에 접속 *con = DriverManager.getConnection(url, id, pass); * * }catch(Exception e) { * * } */ } //데이터 베이스에 한사람의 회원 정보를 저장해주는 메소드 public void insertMember(MemberBean mbean) { System.out.println("inserMember"); getCon(); try { String sql = "insert into member values(?,?,?,?,?,?,?,?)"; pstmt = con.prepareStatement(sql); //?에 맞게 데이터를 맵핑 pstmt.setString(1, mbean.getId()); pstmt.setString(2, mbean.getPass1()); pstmt.setString(3, mbean.getEmail()); pstmt.setString(4, mbean.getTel()); pstmt.setString(5, mbean.getHobby()); pstmt.setString(6, mbean.getJob()); pstmt.setString(7, mbean.getAge()); pstmt.setString(8, mbean.getInfo()); //오라클에서 쿼리를 실행하시오. pstmt.executeUpdate();//insert, update, delete 에서 사용하는 메서드 //자원반납(연결끊기) con.close(); }catch(Exception e) { e.printStackTrace(); } } //모든회원의 정보를 리턴해주는 메소드 호출 public Vector<MemberBean> allSelectMember(){ //가변길이로 데이터를 저장 Vector<MemberBean> v = new Vector(); //무조건 데이터베이스는 io,입출력된 데이터베이스, 쓰레드, 네트워크 4개패키지 안에 들어있는 메소드들은 무조건 예외처리를 해줘야한다. try { //1.커넥션연결 getCon(); //2.쿼리 준비 String sql = "select * from member"; //3.쿼리를 실행시켜주는 객체 선언 pstmt = con.prepareStatement(sql); //4.쿼리를 실행시킨 결과를 리턴해서 받아줌(오라클 테이블의 검색된 결과를 자바객체에 저장) rs = pstmt.executeQuery(); //5.반복문을 사용해서 resultSet에 저장된 데이터를 추출해야 함 while(rs.next()) { //저장된 데이터 만큼 반복문을 돌리겠다 MemberBean bean = new MemberBean(); //컬럼으로 나뉘어진 데이터를 빈클래스에 저장 bean.setId(rs.getString(1)); bean.setPass1(rs.getString(2)); bean.setEmail(rs.getString(3)); bean.setTel(rs.getString(4)); bean.setHobby(rs.getString(5)); bean.setJob(rs.getString(6)); bean.setAge(rs.getString(7)); bean.setInfo(rs.getString(8)); //6.패키징된 memberBean클래스를 벡터에 저장 v.add(bean); } //자원 반납 con.close(); }catch(Exception e) { e.printStackTrace(); } //다 저장된 벡터를 리턴 return v; } //한사람에 대한 정보를 리턴하는 메소드 작성 public MemberBean oneSelectMember(String id) { //한사람에 대한 정보만 리턴하기에 빈클래스 객체 생성 MemberBean bean = new MemberBean(); try { //커넥션 연결 getCon(); //쿼리준비 /* String sql="select * from member where id ="+id; */ String sql="select * from member where id = ?"; pstmt = con.prepareStatement(sql); //?의 값을 맵핑 pstmt.setString(1, id); //쿼리 실행 rs = pstmt.executeQuery(); //pstmt.executeQuery();의 결과가 ResultSet rs에 저장된다. if(rs.next()) {//레코드가 있다면 bean.setId(rs.getString(1)); bean.setPass1(rs.getString(2)); bean.setEmail(rs.getString(3)); bean.setTel(rs.getString(4)); bean.setHobby(rs.getString(5)); bean.setJob(rs.getString(6)); bean.setAge(rs.getString(7)); bean.setInfo(rs.getString(8)); } //자원반납 con.close(); }catch(Exception e) { e.printStackTrace(); } return bean; } //한 회원의 패스워드 값을 리턴하는 메소드 작성 public String getPass(String id) { //스트링으로 리턴을 해야하기에 스트링 변수 선언 String pass = ""; try { getCon(); //쿼리 준비 String sql = "select pass1 from member where id=?"; pstmt = con.prepareStatement(sql); //?에 값을 맵핑 pstmt.setString(1, id); //쿼리 실행 rs = pstmt.executeQuery(); if(rs.next()) { pass = rs.getString(1); //패스워드 값이 저장된 컬럼 인덱스 } //자원반납 con.close(); } catch(Exception e) { e.printStackTrace(); } //결과를 리턴 return pass; } //한 회원의 정보를 수정하는 메서드 public void updateMember(MemberBean bean) { getCon(); try { //쿼리 준비 String sql = "update member set email=?,tel=? where id=?"; //쿼리실행 객체 선언 pstmt = con.prepareStatement(sql); //?에 값을 맵핑 pstmt.setString(1, bean.getEmail()); pstmt.setString(2, bean.getTel()); pstmt.setString(3, bean.getId()); //쿼리 실행 pstmt.executeUpdate(); //sql에서 셀렉트를 쓸때는 executeQuery(), insert, update, delete를 쓸때는 executeUpdate() //자원 반납 con.close(); }catch(Exception e) { e.printStackTrace(); } } //한 회원을 삭제하는 메서드 public void deleteMember(String id) { getCon(); try { //쿼리준비 String sql = "delete from member where id=?"; //쿼리실행객체선언 pstmt = con.prepareStatement(sql); //객체값 매핑 pstmt.setString(1, id); pstmt.executeUpdate(); con.close(); }catch(Exception e) { e.printStackTrace(); } } }
server의 server.xml(커넥션 풀 이용할 때)
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --><!-- Note: A "Server" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/server.html --><Server port="8888" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener"/> <!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" /> --> <!--APR library loader. Documentation at /docs/apr.html --> <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/> <!-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/> <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html --> <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/> </GlobalNamingResources> <!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" Note: A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/service.html --> <Service name="Catalina"> <!--The connectors can use a shared executor, you can define one or more named thread pools--> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 --> <Connector URIEncoding="EUC-KR" connectionTimeout="20000" port="9292" protocol="HTTP/1.1" redirectPort="8443"/> <!-- A "Connector" using the shared thread pool--> <!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 This connector uses the NIO implementation. The default SSLImplementation will depend on the presence of the APR/native library and the useOpenSSL attribute of the AprLifecycleListener. Either JSSE or OpenSSL style configuration may be used regardless of the SSLImplementation selected. JSSE style configuration is used below. --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/localhost-rsa.jks" type="RSA" /> </SSLHostConfig> </Connector> --> <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2 This connector uses the APR/native implementation which always uses OpenSSL for TLS. Either JSSE or OpenSSL style configuration may be used. OpenSSL style configuration is used below. --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" > <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> <SSLHostConfig> <Certificate certificateKeyFile="conf/localhost-rsa-key.pem" certificateFile="conf/localhost-rsa-cert.pem" certificateChainFile="conf/localhost-rsa-chain.pem" type="RSA" /> </SSLHostConfig> </Connector> --> <!-- Define an AJP 1.3 Connector on port 8009 --> <!-- <Connector protocol="AJP/1.3" address="::1" port="8009" redirectPort="8443" /> --> <!-- An Engine represents the entry point (within Catalina) that processes every request. The Engine implementation for Tomcat stand alone analyzes the HTTP headers included with the request, and passes them on to the appropriate Host (virtual host). Documentation at /docs/config/engine.html --> <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> <Engine defaultHost="localhost" name="Catalina"> <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> --> <!-- Use the LockOutRealm to prevent attempts to guess user passwords via a brute-force attack --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/> <Context docBase="JSP1" path="/JSP1" reloadable="true" source="org.eclipse.jst.jee.server:JSP1"/> <Context docBase="JSP2" path="/JSP2" reloadable="true" source="org.eclipse.jst.jee.server:JSP2"/> <!-- 이부분 --> <Context docBase="DataBase" path="/DataBase" reloadable="true" source="org.eclipse.jst.jee.server:DataBase"> <Resource name="jdbc/pool" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver" loginTimeout="10" maxWait="5000" username="wogus" password="***" url="jdbc:oracle:thin:@localhost:1521:xe"/> <!-- name부분은 이름(나중에 자바코드에서 써야한다, auth는 관리자(Container는 웹서버.즉 아파치 톰캣),type = DataSource라는 클래스를 이용해 커넥션 풀을 사용하겠다. --> <!-- 즉, 자바소스에서 했던 내용들을 javax.sql.DataSource클래스를 이용해서 컨테이너가 하겠다 라는 의미 --> </Context> <!-- 이부분 --> </Host> </Engine> </Service> </Server>
*Connection Pool : DAO패턴인데 커넥션을 직접 연결하는 방식이 아닌
커넥션풀(DBCP)사용 이유
-JDBC를 통하여 DB에 연결하기 위해서는 드라이버(Driver)를 로드하고 커넥션(connection)객체를 받아와야 한다.
-JDBC를 사용하면 사용자가 요청을 할 때마다 매번 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하기 때문에 비효율적이다.
-이런 문제를 해결하기 위해서 커넥션풀(DBCP)를 사용한다.
커넥션풀(DBCP)
-웹 컨테이너(아파치 톰캣 등 서버)가 실행되면서 커넥션(connection)객체를 미리 풀(pool)에 생성해 둔다.
-DB와 연결된 커넥션(connection)을 미리 생성해서 풀(pool)속에 저장해 두고 있다가 필요할 때에 가져다 쓰고 반환한다.
-미리 생성해두기 때문에 데이터베이스에 부하를 줄이고 유동적으로 연결을 관리 할 수 있다.
https://opentutorials.org/module/3569/21223참조
https://devbox.tistory.com/entry/JSP-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80-1
참조 : 인프런 - JSP 웹 쇼핑몰 프로그래밍 기본 과정(JSP WEB Programming) - JSP와 데이터베이스 연동
'jsp(Model1)' 카테고리의 다른 글
Session (0) 2020.05.17 Cookie (0) 2020.05.17 JSP와 데이터베이스 연동1 (0) 2020.05.16 JSP 액션태그 (0) 2020.05.15 JSP 페이지 디렉티브 - Include (0) 2020.05.15