<servlet>
<servlet-name>MemberAuth</servlet-name>
<servlet-class>servlet.MemberAuth</servlet-class>
<!-- init-param 설정 -->
<init-param>
<param-name>admin_id</param-name>
<param-value>nakja</param-value>
</init-param>
</servlet>
<!-- Servlet과 요청명 매핑 -->
<servlet-mapping>
<servlet-name>MemberAuth</servlet-name>
<url-pattern>/12Servlet/MemberAuth.mvc</url-pattern>
</servlet-mapping>
</web-app>
<Context docBase="webstudy4" path="/webstudy4" reloadable="true" source="org.eclipse.jst.jee.server:webstudy4"/><Context docBase="ExServlet" path="/ExServlet" reloadable="true" source="org.eclipse.jst.jee.server:ExServlet"/></Host>
</Engine>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 아이디와 패스워드를 받아 인증 요청할 JSP(관리자, 회원, 비회원 구분 인증요청) -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC 패턴으로 회원인증하기</title>
</head>
<body>
<h2>MVC패턴으로 회원인증하기</h2>
<strong>${authMessage}</strong>
<br />
<a href="./MemberAuth.mvc?id=nakja&pass=1234"> 회원인증(관리자)</a>
<a href="./MemberAuth.mvc?id=onetime&pass=12345"> 회원인증(회원)</a>
<a href="./MemberAuth.mvc?id=stranger&pass=12345"> 회원인증(비회원)</a>
</body>
</html>
JDBConnection
을 이용해도 되고 DBConnPool
을 이용해도 됨public MemberDAO(String driver, String url, String id, String pwd) {
super(driver, url, id, pwd);
}
// 4. web.xml에 등록할 컨텍스트 초기화 매개변수 중 DB 연결 정보들을 읽어옴 => web.xml의 이름으로 가져옴
/*
* String driver = application.getInitParameter("OracleDriver"); String
* connectUrl = application.getInitParameter("OracleURL"); String oId =
* application.getInitParameter("OracleId"); String oPass =
* application.getInitParameter("OraclePwd");
* => MemberDAO에 JDBConnection을 부모로 두며, JDBConnection에는 설정 되어 있기 때문에 필요없음
*/
DBConnPool
을 이용하고 싶다면 자식으로 하지 말고 덜 종속적
이게 설정package membership;
//데이터베이스 연결/ 동적인 기능(CRUD) 구현
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import common.DBConnPool;
public class MemberDAO2 {
DBConnPool db;
Connection con;
PreparedStatement pstmt;
ResultSet rs;
public MemberDAO2() {
db = new DBConnPool();
}
/*
* public MemberDAO(String driver , String url, String id, String pwd) {
* super(driver,url,id,pwd); }
*
* public MemberDAO(ServletContext application) {
*
* super(application); }
*/
public MemberDTO getMemberDTO(String id, String pass) {
MemberDTO dto = new MemberDTO();
String sql = "SELECT * FROM member WHERE id=? AND pass=?";
try {
//쿼리 실행
pstmt = db.con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pass);
rs = pstmt.executeQuery();
//결과 처리
if(rs.next()) {
dto.setId(rs.getString("id"));
dto.setPass(rs.getString("pass"));
dto.setName(rs.getString("name"));
dto.setRegidate(rs.getString(4));
}
}catch(Exception e) {
e.printStackTrace();
}
return dto;
}
// 연결 해제(자원 반납)
public void close() {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (con != null) con.close(); // 자동으로 커넥션 풀로 반납됨
System.out.println("DB 커넥션 풀 자원 반납");
}
catch (Exception e) {
e.printStackTrace();
}
}
}
JDBConnction의 application방법
이용을 할 것이기에 주석 처리 부분 필요 없음package membership;
//데이터베이스 연결/ 동적인 기능(CRUD) 구현
import javax.servlet.ServletContext;
import common.JDBConnection;
public class MemberDAO extends JDBConnection {
public MemberDAO() {
}
public MemberDAO(String driver, String url, String id, String pwd) {
super(driver, url, id, pwd);
}
public MemberDAO(ServletContext application) {
super(application);
}
public MemberDTO getMemberDTO(String id, String pass) {
MemberDTO dto = new MemberDTO();
String sql = "SELECT * FROM member WHERE id=? AND pass=?";
try {
// 쿼리 실행
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pass);
rs = pstmt.executeQuery();
// 결과 처리
if (rs.next()) {
dto.setId(rs.getString("id"));
dto.setPass(rs.getString("pass"));
dto.setName(rs.getString("name"));
dto.setRegidate(rs.getString(4));
}
} catch (Exception e) {
e.printStackTrace();
}
return dto;
}
}
package membership;
//회원한명의 정보를 담을 객체
public class MemberDTO {
//멤버 번수 선언
private String id;
private String pass;
private String name;
private String regidate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRegidate() {
return regidate;
}
public void setRegidate(String regidate) {
this.regidate = regidate;
}
package common;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DBConnPool {
public Connection con;
public Statement stmt;
public PreparedStatement pstmt=null;
public ResultSet rs;
public DBConnPool() {
try {
//컨넥션 풀(DataSource) 얻기
Context initCtx = new InitialContext();
Context ctx =(Context)initCtx.lookup("java:comp/env");
DataSource source =(DataSource) ctx.lookup("dbcp_myoracle");
//커넥션 풀을 이용한 연결(Connection) 얻기
con = source.getConnection();
System.out.println("커넥션 풀을 통한 연결 성공!");
} catch (Exception e) {
System.out.println("커넥션 풀 연결 실패!");
e.printStackTrace();
}
}
public void close() {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close();
System.out.println("JDBC 자원 해제");
} catch (Exception e) {
e.printStackTrace();
}
}
}
package common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.servlet.ServletContext;
//1) 기본적인 DB 연결 관리 클래스
public class JDBConnection {
/*
* 1. JDBC 드라이버 로드 2. DB연결 3. 연결을 통해 쿼리문을 전송 4. 결과값을 확인 (INSERT,UPDATE,DELTE -
* 성공,실패 , SELECT - ResultSet ) 5. 리소스 close()
*/
public Connection con;
public Statement stmt;
public PreparedStatement pstmt;
public ResultSet rs;
public JDBConnection() {
try {
//1. 오라클 드라이버 로드
Class.forName("oracle.jdbc.OracleDriver");
System.out.println("드라이버 로드1 ok!");
//2.DB 연결
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String id = "multi";
String pwd = "1234";
con = DriverManager.getConnection(url, id, pwd);
System.out.println("DB 연결 성공(기본 생성자)");
} catch (Exception e) {
System.out.println("오라클 드라이버가 없습니다.확인필요!");
e.printStackTrace();
}
}
public JDBConnection(String driver , String url, String id, String pwd) {
try {
//1. 오라클 드라이버 로드
Class.forName(driver);
System.out.println("드라이버 로드2 ok!");
//2.DB 연결
con = DriverManager.getConnection(url, id, pwd);
System.out.println("DB 연결 성공(기본 생성자 2 )");
} catch (Exception e) {
e.printStackTrace();
}
}
public JDBConnection(ServletContext application) {
try {
//JDBC 로드
String driver = application.getInitParameter("OracleDriver");
getClass().forName(driver);
System.out.println("드라이버 연결3 ok!");
//DB연결
String url = application.getInitParameter("OracleURL");
String id = application.getInitParameter("OracleId");
String pwd = application.getInitParameter("OraclePwd");
con = DriverManager.getConnection(url,id,pwd);
System.out.println("JDBC 연결 성공: 생성자3 ");
} catch (Exception e) {
e.printStackTrace();
}
}
public void close() {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close();
System.out.println("JDBC 자원 해제");
} catch (Exception e) {
e.printStackTrace();
}
}
}
package servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import membership.MemberDAO;
import membership.MemberDTO;
public class MemberAuth extends HttpServlet{
// 1. JDBC 프로그래밍을 위해 작성핚 MemberDAO 타입의 DAO 객체를 멤버 변수로 선언
MemberDAO dao;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 6. 서블릿 초기화 매개변수를 얻어옴 - 관리자 아이디로 설정한 값
String admin_id = this.getInitParameter("admin_id");
// 7. 인증을 요청한 id, pass 받아옴
String id = req.getParameter("id");
String pass = req.getParameter("pass");
// 회원테이블에서 인증 요청한 id/pass에 해당하는 회원 찾기
MemberDTO memberDTO = dao.getMemberDTO(id, pass);
//8. 찾은 회원의 이름에 따른 비교 처리
String memberName = memberDTO.getName();
if(memberName != null) { //일치하는 회원이 있음
req.setAttribute("authMessage", memberName +"회원님 반갑습니다.");
}
else {
if(admin_id.equals(id)) req.setAttribute("authMessage", id +"괸리자님 반갑습니다.");
else { //비회원
req.setAttribute("authMessage", "귀하는 회원이 아닙니다. 회원 가입 후 서비스를 이용해주세요.");
}
}
//반환할 메시지를 request 영역에 저장
req.getRequestDispatcher("/12Servlet/MemberAuth.jsp").forward(req, resp);
}
// 서블릿 객체 소멸 시 DAO 객체의 close( ) 메서드를 호출하여 JDBC에서 사용하던 객체를 메모리에서 소멸시킴
@Override
public void destroy() {
dao.close();
}
@Override
public void init() throws ServletException {
// 2. init( ) 메서드에서 DB 연결을 위한 DAO 객체를 생성
// 3. application 내장 객체를 가져오기
ServletContext application = this.getServletContext();
// 4. web.xml에 등록할 컨텍스트 초기화 매개변수 중 DB 연결 정보들을 읽어옴 => web.xml의 이름으로 가져옴
/*
* String driver = application.getInitParameter("OracleDriver"); String
* connectUrl = application.getInitParameter("OracleURL"); String oId =
* application.getInitParameter("OracleId"); String oPass =
* application.getInitParameter("OraclePwd");
* => MemberDAO에 JDBConnection을 부모로 두며, JDBConnection에는 설정 되어 있기 때문에 필요없음
*/
// 5. 이 정보를 인수로 건네 MemberDAO 객체를 생성
dao = new MemberDAO(application);
}
}
오늘은 강사님이 게시판 2 각자 작업해보게 작업시간을 주셨다. 어느정도는 작업했는데 파일 다운로드 부분이랑 서블릿 연결 부분을 잘 모르겠다. 그 부분은 구글 드라이브에 올려주신다고 하셨으니 내 코드랑 비교해서 공부해야겠다.