Cohe
6. JSP-JDBC 연동 본문
728x90
반응형
JDBC
- 싱글톤 패턴 : 하나의 객체만 생성하여 사용하도록 만드는 패턴-객체를 1개로 제한
- 여러개의 객체가 생성되게 하면 메모리 과부하가 올 수 있는 경우에 사용
DAO
- DAO 객체는 DB 연동을 담당하는 클래스로 싱글톤 방식으로 생성
- 스스로의 객체를 멤버변수로 선언, 1개로 제한
- 외부에서 객체를 생성할 수 없게 생성자에 private 설정
- 외부에서 객체를 요구할 때 getter를 써서 반환
//싱글톤 패턴 : 하나의 객체만 생성하여 사용하도록 만드는 패턴
private static UserDAO instance = new UserDAO();
//Connection 객체를 생성하기 위한 값
private String url ="jdbc:mysql://localhost:3306/jdbctest";
private String user = "jdbc";
private String password = "jdbc";
//데이터 접속을 위한 객체 데이터베이스 연결 객체(Connection 객체)
Connection conn = null; //비어있는 객체선언.
ResultSet rs = null;
private UserDAO() {
//생성자가 한 번 동작할 때 드라이버와 연결
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. Connection 객체 생성 - DriverManger.getConnection 이용
conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
System.out.println("데이터베이스 접속 성공.");
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로드 실패");
}
catch(SQLException sqle) {
System.out.println("SQL 연동 오류");
System.out.println(sqle.getMessage());
}
}
public static UserDAO getInstance() {
return instance;
}
public static void setInstance(UserDAO instance) {
UserDAO.instance = instance;
}
VO
- VO 클래스는 DB컬럼을 자바변수로 동일하게 선언
package com.jdbc.domain;
public class UserVO {
// vo class DB column을 자바변수로 동일하게 선언, 은닉 선언
private String id;
private String pw;
private String name;
private String phone1;
private String phone2;
private String gender;
public UserVO() {
super();
}
public UserVO(String id, String pw, String name, String phone1, String phone2, String gender) {
super();
this.id = id;
this.pw = pw;
this.name = name;
this.phone1 = phone1;
this.phone2 = phone2;
this.gender = gender;
}
@Override
public String toString() {
return String.format("UserV)[id= %s, pw= %s, name= %s, phone1= %s, phone2= %s, gender= %s]",id,pw, name, phone1, phone2,gender);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone1() {
return phone1;
}
public void setPhone1(String phone1) {
this.phone1 = phone1;
}
public String getPhone2() {
return phone2;
}
public void setPhone2(String phone2) {
this.phone2 = phone2;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
회원 가입 처리
- 이건 서블릿으로 작성하기로 한다
- login.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>
<body>
<form action="join_ok" method="post">
ID : <input type="text" name="id"><br>
PW : <input type="password" name="pw"><br>
이름 : <input type="text" name="name"><br>
<select name="phone1">
<option>010</option>
<option>011</option>
<option>018</option>
</select>
-<input type="text" name = phone2><br>
<input type="radio" name="gender" value="m"/>남자
<input type="radio" name="gender" value="w"/>여자 <br>
<input type = "submit" value= "가입">
</form>
</body>
</html>
- join_ok 서블릿으로 처리하기 위해 서블릿을 만든다
- join_ok.java
- 회원 가입을 처리한다.
package com.jdbc.ok;
import java.io.IOException;
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 com.jdbc.domain.UserDAO;
import com.jdbc.domain.UserVO;
/**
* Servlet implementation class join_ok
*/
@WebServlet("/join_ok")
public class join_ok extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public join_ok() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//form에서 들어오는 값 처리
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String name = request.getParameter("name");
String phone1 = request.getParameter("phone1");
String phone2 = request.getParameter("phone2");
String gender = request.getParameter("gender");
//DAO 객체 생성 -> 싱글톤 작업을 할 것임! 딱 하나의 dao 객체를 만듦 -> db와 작업함!
UserDAO dao = UserDAO.getInstance();
//VO 객체 생성
UserVO vo = new UserVO(id, pw, name, phone1, phone2, gender);
//회원가입 처리
int result = dao.join(vo);
if(result ==1) {//성공시 처리
response.sendRedirect("join_success.jsp");
}else { //실패 시 처리
response.sendRedirect("join_fail.jsp");
}
}
}
- 여기서 dao에는 지금은 join 메소드가 없어 직접적으로 만들어줘야 한다
- UserDAO에 join 메소드 추가
//-----------------기능을 메소드로 선언
//회원 가입
public int join(UserVO vo) {
int result = 0;
String sql = "insert into user values(?,?,?,?,?,?)";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user,password);
System.out.println(conn);
System.out.println("데이터베이스 접속 성공.");
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,vo.getId());
pstmt.setString(2,vo.getPw());
pstmt.setString(3,vo.getName());
pstmt.setString(4,vo.getPhone1());
pstmt.setString(5,vo.getPhone2());
pstmt.setString(6,vo.getGender());
result = pstmt.executeUpdate();
if(result != 0) {
System.out.println("SQL성공");
}else {
System.out.println("SQL실패");
}
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로드 실패");
}catch (SQLException sqle) {
System.out.println("SQL 연동 오류");
System.out.println(sqle.getMessage());
}finally {
try {
} catch (Exception e) {
// TODO: handle exception
}
}
return result;
}
- join_fail.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>
<h1>회원가입을 실패했습니다</h1>
<a href="join.jsp">회원가입 페이지로 이동</a>
</body>
</html>
- join_success.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>
<h1>회원가입을 축하합니다</h1>
<a href="login.jsp">로그인 페이지로 이동</a>
</body>
</html>
login 구현하기
- UserDAO객체 생성 => login_ok.java
package com.jdbc.ok;
import java.io.IOException;
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 javax.servlet.http.HttpSession;
import com.jdbc.domain.UserDAO;
import com.jdbc.domain.UserVO;
@WebServlet("/login\_ok")
public class login\_ok extends HttpServlet {
private static final long serialVersionUID = 1L;
public login_ok() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//폼데이터 처리
String id = request.getParameter("id");
String pw = request.getParameter("pw");
UserDAO dao = UserDAO.getInstance();
//dao에 login(id,pw) 메서드를 생성
//회원가입 처리
int result = dao.login(id,pw);
if(result ==1) {//성공시 처리
HttpSession session = request.getSession();
session.setAttribute("id", id);
response.sendRedirect("mypage.jsp");
}else { //실패 시 처리
response.sendRedirect("login_fail.jsp");
}
}
}
- DAO에 login(id, pw) 메서드를 생성 : sql = select * from user where id = ? and pw = ?
public int login(String id, String pw) {
int result = 0;
String sql = "select * from user where id=? and pw=?";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
System.out.println("데이터베이스 접속 성공.");
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id); // id 값이 문자열이므로 setString을 사용하여 데이터 타입을 지정
pstmt.setString(2, pw); // pw 값이 문자열이므로 setString을 사용하여 데이터 타입을 지정
rs = pstmt.executeQuery(); // 쿼리 실행 결과를 ResultSet에 저장
if (rs.next()) {
result = 1; // 존재하는 경우 1, 존재하지 않는 경우 0
}
if(result != 0) {
System.out.println("SQL성공");
}else {
System.out.println("SQL실패");
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if(conn!=null) conn.close();
if(pstmt!=null) pstmt.close();
if(rs!=null) rs.close();
} catch (Exception e) {
// TODO: handle exception
}
}
return result;
}
- login 메서드 안에서 executeQuery() 구문으로 실행 : rs.next() 결과가 있으면 1, 없으면 0을 반환
- login_ok에서는 세션을 id로 저장하고 화면으로 이동
- 결과가 1인 경우, mypage.jsp -> XXX님 환영합니다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
String id = (String)session.getAttribute("id"); //type casting 필요
if(id==null){
response.sendRedirect("login.jsp");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1><%=id %>님 환영합니다.</h1>
<a href="logout.jsp">로그아웃</a><br>
<a href="modify_ok.jsp">정보수정</a><br>
<!-- DB로 부터 객체 정보를 담아와서 vo에 담아줘야 한다, update.jsp 를 그대로 나온다. 값을 변경해야 한다.
update_ok로 가야함. 수정이 다되면 my_page로 다시 온다. -->
<a href="delete_ok.jsp">회원탈퇴</a>
</body>
</html>
- 결과가 0인 경우, login_fail.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>
<h1>로그인에 실패했습니다</h1>
<h2>아이디나 패스워드가 틀립니다.</h2>
<a href="login.jsp">로그인 페이지로 이동</a>
</body>
</html>
728x90
반응형
'개발 언어 > JSP' 카테고리의 다른 글
JSP mini project : mypage 실습 (0) | 2024.04.15 |
---|---|
6-1 JSP-JDBC 연동2 (0) | 2024.04.12 |
5. javaBean (0) | 2024.04.11 |
4. application, param, include, forward, action tag, error page (0) | 2024.04.09 |
3. Cookie, Session (0) | 2024.04.08 |