반응형

package user;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class UserDAO {

		DataSource dataSource;
		
		public UserDAO() {
			try {
				
				InitialContext initContext = new InitialContext();
				// 실질적으로 소스에 접속할 수 있도록 함
				Context envContext = (Context) initContext.lookup("java:/comp/env");
				// 데이터 소스 초기화 
				dataSource = (DataSource) envContext.lookup("jdbc/UserChat");
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		//userID와 userPassword를 받아서
		public int login(String userID, String userPassword) {
			Connection conn = null;
			PreparedStatement pstmt = null;
			ResultSet rs = null;
			String SQL = "SELECT * FROM USER WHERE userID = ?";
			try {
				conn = dataSource.getConnection();
				pstmt = conn.prepareStatement(SQL);
				pstmt.setString(1,  userID);
				rs = pstmt.executeQuery();
				if(rs.next()){
					//앞 쪽 userPassword는 db에서 가져온 패스워드
					if(rs.getString("userPassword").equals(userPassword)) {
						return 1; // 로그인에 성공
					}
					return 2; //비밀번호가 틀림
				}else {
					return 0; // 해당 사용자가 존재하지 않음.
				}
					
				
			}catch(Exception e){
				e.printStackTrace();
			}finally {
				try {
					if(rs != null) rs.close();
					if(pstmt != null) pstmt.close();
					if(conn != null) conn.close();
				}catch(Exception e) {
					e.printStackTrace();
				}
			}
			return -1; // 데이터베이스 오류
		}
		
		//userID를 받아와서
		public int registerCheck(String userID) {
			Connection conn = null;
			PreparedStatement pstmt = null;
			ResultSet rs = null;
			String SQL = "SELECT * FROM USER WHERE userID = ?";
			try {
				conn = dataSource.getConnection();
				pstmt = conn.prepareStatement(SQL);
				pstmt.setString(1,  userID);
				rs = pstmt.executeQuery();
				if(rs.next() || userID.equals("")){
					return 0; //이미 존재하는 회원
					
				}else {
					return 1; //가입 가능한 회원 아이디
				}
					
				
			}catch(Exception e){
				e.printStackTrace();
			}finally {
				try {
					if(rs != null) rs.close();
					if(pstmt != null) pstmt.close();
					if(conn != null) conn.close();
				}catch(Exception e) {
					e.printStackTrace();
				}
			}
			return -1; // 데이터베이스 오류
		}
		
		// 회원가입하는 함수
		public int register(String userID, String userPassword, String userName, String userAge, String userGender, String userEmail, String userProfile) {
			Connection conn = null;
			PreparedStatement pstmt = null;
			ResultSet rs = null;
			String SQL = "INSERT INTO USER VALUES(?,?,?,?,?,?,?)";
			try {
				conn = dataSource.getConnection();
				pstmt = conn.prepareStatement(SQL);
				pstmt.setString(1,  userID);
				pstmt.setString(2, userPassword);
				pstmt.setString(3, userName);
				pstmt.setInt(4, Integer.parseInt(userAge));
				pstmt.setString(5, userGender);
				pstmt.setString(6, userEmail);
				pstmt.setString(7,  userProfile);
				
				
				rs = pstmt.executeQuery();
				if(rs.next() || userID.equals("")){
					return 0; //이미 존재하는 회원
					
				}else {
					return 1; //가입 가능한 회원 아이디
				}
					
				
			}catch(Exception e){
				e.printStackTrace();
			}finally {
				try {
					if(rs != null) rs.close();
					if(pstmt != null) pstmt.close();
					if(conn != null) conn.close();
				}catch(Exception e) {
					e.printStackTrace();
				}
			}
			return -1; // 데이터베이스 오류
		}
		
}

UserDAO

 

package user;

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;


@WebServlet("/UserRegisterCheck")
public class UserRegisterCheckServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		String userID = request.getParameter("userID");
		//문자열 형태를 출력할 수 있도록 공백을 추가해줌.
		response.getWriter().write(new UserDAO().registerCheck(userID) + "");
	}

}

UserRegisterCheckServlet

 

package user;

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;

@WebServlet("/userRegisterServlet")
public class UserRegisterServlet extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		String userID = request.getParameter("userID");
		String userPassword1 = request.getParameter("userPassword1");
		String userPassword2 = request.getParameter("userPassword2");
		String userName = request.getParameter("userName");
		String userAge = request.getParameter("userAge");
		String userGender = request.getParameter("userGender");
		String userEmail = request.getParameter("userEmail");
		String userProfile = request.getParameter("userProfile");
		
		if(userID == null || userID.equals("") || userPassword1 == null || userPassword1.equals("") || 
				userPassword2 == null || userPassword2.equals("") || userName == null || userName.equals("") || userAge == null ||
				userAge.equals("") || userGender == null || userGender.equals("") ||
				userEmail == null || userEmail.equals("")) {
			request.getSession().setAttribute("messageType", "오류 메시지");
			request.getSession().setAttribute("messageContent", "모든 내용을 입력해 주세요");
			response.sendRedirect("join.jsp");
			return;
		}
		if(!userPassword1.equals(userPassword2)) {
			request.getSession().setAttribute("messageType", "오류 메시지");
			request.getSession().setAttribute("messageContent", "암호가 일치하지 않습니다.");
			response.sendRedirect("join.jsp");
			return;
		}
		//여기까지 왔으면 userPassword에 1을 넣든 2를 넣든 상관 없음.
		int result = new UserDAO().register(userID, userPassword1, userName, userAge, userGender, userEmail, userProfile);
		if(result == 1) {
			request.getSession().setAttribute("messageType", "성공 메시지");
			request.getSession().setAttribute("messageContent", "회원 가입을 성공하였습니다.");
			response.sendRedirect("index.jsp");
			return;
		} else {
			request.getSession().setAttribute("messageType", "오류 메시지");
			request.getSession().setAttribute("messageContent", "이미 존재하는 회원 입니다.");
			response.sendRedirect("join.jsp");
			
		}
	}
}

UserRegisterServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>UserChat</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  	<servlet-name>UserRegisterServlet</servlet-name>
  	<servlet-class>user.UserRegisterServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>UserRegisterServlet</servlet-name>
  	<url-pattern>/userRegister</url-pattern>
  </servlet-mapping>
</web-app>

web.xml

 

반응형
블로그 이미지

꽃꽂이하는개발자

,
반응형

커넥션 풀

  온라인 쇼핑몰의 경우 동시에 수십에서 수백명까지 접속해서 조회, 주문등 다양한 기능을 사용하는데 앞의 방법처럼 데이터 베이스와 연동해 작업해야 한다면 너무 비효율적입니다.

 

이 문제를 해결하기 위해 현재는 웹 어플리케이션이 실행됨과 동시에 연동할 데이터베이스와의 연결을 미리 설정해둡니다.

  이렇게 미리 데이터베이스와 연결시킨 상태를 유지하는 기술을 커넥션 풀 (ConnectionPool)이라고 부릅니다.

 

JNDI

  실제 웹 어플리케이션에서 ConnectionPool 객체를 구현할 때는 Java SE에서 제공하는 javax.sql.DataSource 클래스를 이용합니다.

그리고 웹 어플리케이션 실행 시 톰캣이 만들어 놓은 ConnectionPool 객체에 접근할 때는 JNDI를 이용합니다.

  JNDI란 필요한 자원을 키/값 쌍으로 저장한 후 필요할 때 키를 이용해 값을 얻는 방법입니다.

 

아래와 같이 Servers에 들어가서 context.xml을 찾고 우측과 같이 코딩을 합니다

username과 password 는 본인이 아이디와 비밀번호를 넣어주시면 됩니다.

 

이제 설정을 마쳤으니 클래스를 만들어 연동해 보겠습니다.

sec02.ex01 패키지를 만들고 앞에서 사용한 MemberDAO, MemberServlet, MemberVO 클래스를 복사하겠습니다.

MemberDAO클래스에서 서블릿 매핑 이름을 /member2 로 바꿔줍니다.

 

아래의 import는 코딩하시면서 해주셔야 합니다. 단축키(ctrl+ shift +o)

아래에 주석처리된 부분은 저희가 커넥션 풀을 이용하였기 때문에 주석처리를 해줍니다.

 

앞에서 한 것과 결과는 같지만 이번에는 커넥션 풀을 이용해서 데이터베이스와 연동했다는 점에서 차이가 있습니다.

 

반응형
블로그 이미지

꽃꽂이하는개발자

,
반응형

문제: 방금 전 만든 예제를 이용해 로그인시 ADMIN ID로 로그인하면 회원관리와 회원 삭제 기능을 보여주도록 작성하시오.

 

 

 

sec04.ex01 패키지 내에 LoginTest2 클래스를 만들어 주었습니다

WebContent / test01 / login.html은 전 예제에서 만든 것이고 내부에 action만 바꿔주었습니다.

 

LoginTest2 
login.html

login.html에서는 전 예제에서 action=에 loginTest2 로 숫자를 추가해주었습니다.

주소창에 localhost:8080/pro06/test01/login.html을 입력하면 아래와 같은 화면이 나타나게 됩니다.

(aaaa는 제가 입력해놓은거에요..)

우리가 코딩을 한 것처럼 admin으로 접속을 하게 되면(비번은 상관없어요)

요렇게 화면이 나타나게 됩니다.

참고로 회원정보 수정하기와 회원정보 삭제하기는 표시만 해놓은거지 눌러도 아무 변화가 없습니다.!

반응형
블로그 이미지

꽃꽂이하는개발자

,
반응형

우선 LoginTest 클래스와 loginTest.html 을 만들어 주겠습니다

LoginTest는 sec04.ex01패키지 내에 만들어 주겠습니다.

login.html은 WebContent에 폴더 test01 생성후 만들어 주었습니다.

프로젝트 실행해 주시고

주소창에 아래와 같이 입력해주세요 localhost:8080/pro06/test01/login.html

아이디와 비밀번호 입력시 뜨는 화면

 

아이디가 없을 시 뜨는 화면

 

반응형
블로그 이미지

꽃꽂이하는개발자

,