Servlet/JSP 회원가입(데이터베이스연동)

bitna's study note·2022년 6월 22일

Servlet/JSP

목록 보기
18/21

6월 22일 내용정리

오늘은 Servlet/JSP을 사용하여 회원가입 기능구현 연습해봄

1.회원가입폼

<!-- 멤버폼 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입 창</title>

<script type="text/javascript">
function fn_sendMember() {

	var frmMember= document.frmMember; //폼에 받은 모든걸 객체 frmMember에 담아줌
	var id=frmMember.id.value; //frmMember 객체를 이용하여 각요소 불러내어 변수에 담기
	var pwd=frmMember.pwd.value; //frmMember 객체를 이용하여 각요소 불러내어 변수에 담기
	var name=frmMember.name.value; //frmMember 객체를 이용하여 각요소 불러내어 변수에 담기
	var email=frmMember.email.value; //frmMember 객체를 이용하여 각요소 불러내어 변수에 담기
	
	//유효성 체크
	if(id.lenght==0 || id==""){ //요소가 길이가 0이거나 빈값일때 
		alert("아이디는 필수입니다.");
	}else if(pwd.lenght==0||pwd==""){ //요소가 길이가 0이거나 빈값일때 
		alert("비밀번호는 필수 입니다.");
	}else if(name.length==0||name==""){ //요소가 길이가 0이거나 빈값일때 
		alert("이름은 필수 입니다.");
	}else if(email.length==0||email==""){ //요소가 길이가 0이거나 빈값일때 
		alert("이메일은 필수 입니다.");
	}else{
		frmMember.method="Post"; //위에 모든 조건이 충족되었다면 post로 보내죠
		frmMember.action="member3"; // member3 서블릿으로 
		frmMember.submit(); //frmMember객체를 보내줌
	}
		
}
</script>
</head>
<body>
<form name="frmMember">
<table>
<th>회원 가입창</th>
	<tr>
		<td>아이디</td>
		<td><input type="text" name="id"></td>
	</tr>
	<tr>
		<td>비밀번호</td>
		<td><input type="text" name="pwd"></td>
	</tr>
	<tr>
		<td>이름</td>
		<td><input type="text" name="name"></td>
	</tr>
	<tr>
		<td>이메일</td>
		<td><input type="text" name="email"></td>
	</tr>	
</table>
<!-- 버튼을 누름과 동시에 fn_sendMember() 자바스크립트 함수 호출 -->
<input type="button" value="가입하기" onclick="fn_sendMember()">
<input type="reset" value="다시입력">
<!-- 숨겨진 기능?? 무언가를 체크할때 쓰임 -->
<input type="hidden" name="command" value="addMember" />
</form>
</body>
</html>

2.멤버 서블릿(기능 구현)

package study_0621;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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("/member3")
public class MemberServlet01 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request,response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request,response);
	}


	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws IOException {
		
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		MemberDAO dao= new MemberDAO(); //데이터베이스 관련 객체 생성
		PrintWriter out =response.getWriter();
		String command=request.getParameter("command"); //command 의 value를 변수에 담아죠
		
		if(command !=null && command.equals("addMember")) //command가 null이 아니면서 value의 내용이 addMember와 같다면
		{
			String _id=request.getParameter("id"); //request객체에 담긴 요소를 꺼내서 변수에 담아죠
			String _pwd=request.getParameter("pwd"); //request객체에 담긴 요소를 꺼내서 변수에 담아죠
			String _name=request.getParameter("name"); //request객체에 담긴 요소를 꺼내서 변수에 담아죠
			String _email=request.getParameter("email"); //request객체에 담긴 요소를 꺼내서 변수에 담아죠
			
			MemberVO vo = new MemberVO(); //자바빈 객체 생성,은닉성
			
			vo.setId(_id); //자바빈의 set메서드를 사용하여 request객체에 담긴 요소로 설정해죠
			vo.setPwd(_pwd); //자바빈의 set메서드를 사용하여 request객체에 담긴 요소로 설정해죠
			vo.setName(_name); //자바빈의 set메서드를 사용하여 request객체에 담긴 요소로 설정해죠
			vo.setEmail(_email); //자바빈의 set메서드를 사용하여 request객체에 담긴 요소로 설정해죠
			
			dao.addMember(vo); //데이터베이스에 addMember메서드 호출하고 매개변수로 자바빈 객체를 넘겨죠
			
		}else if(command !=null && command.equals("delMember")) //command가 null이 아니면서 value의 내용이 delMember와 같다면
		{
			String id=request.getParameter("id"); //request객체에서 id를 얻어와서 변수에 담아죠
			dao.delMember(id); //데이터베이스의 delMember메서드 호출하고 id를 매개변수로 넘겨죠
		}
		List<MemberVO> list=dao.listMember(); //데이터베이스의 listMember메서드를 호출해서 List자료구조에에 담아죠, MemberVO객체타입만
		out.print("<html><body><table><tr>");
		out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td><td>삭제</td></tr>");
		
		
		for(int i=0;i<list.size();i++) {
			MemberVO memberVO=(MemberVO)list.get(i); //형변환,  list의 i번째해당하는 객체를 변수에 담아죠
			String id=memberVO.getId(); //memberVO의 객체의 요소를 꺼내죠
			String pwd=memberVO.getPwd(); //memberVO의 객체의 요소를 꺼내죠
			String name=memberVO.getName(); //memberVO의 객체의 요소를 꺼내죠
			String email=memberVO.getEmail(); //memberVO의 객체의 요소를 꺼내죠
			String joinDate=memberVO.getJoinDate();  //memberVO의 객체의 요소를 꺼내죠
			
			//그것을 출력해죠
			out.print("<tr><td>"+id+"</td><td>"+pwd+"</td><td>"+
			name+"</td><td>"+email+"</td><td>"+joinDate+"</td><td>"+
					//삭제를 누르면 member3에 해당하는 서블릿으로 이동해죠, 아래값 command=delMember&id=id 을 가지고 
					"<a href='/Webstudy/member3?command=delMember&id="+id+"'>삭제</a></td></tr>");
		}
		out.print("</table></body></html>");
		//새회원 등록하기를 누르면 Webstudy/memberForm.jsp 로 이동해죠
		out.print("<a href='/Webstudy/memberForm.jsp'>새회원 등록하기</a>");
	}

}

3.값을 전달하는 데 사용되는 VO(Value Object)클래스

package study_0621;
//값을 전달하는 데 사용되는 VO(Value Object)클래스 입니다.
public class MemberVO {

	private String id;
	private String pwd;
	private String name;
	private String email;
	private String joinDate;
	
	public MemberVO(){
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getJoinDate() {
		return joinDate;
	}

	public void setJoinDate(String joinDate) {
		this.joinDate = joinDate;
	}
	
}

4.데이터베이스 연결클래스

package study_0621;

public class MemberDAO {
	
	private Connection conn; 
	private PreparedStatement pstmt; 
	private DataSource dataFactory; //ConnectionPool 객체 생성

	MemberDAO(){
		
		try {
		Context ctx = new InitialContext(); //JNDI에 접근하기위해 시작객체 InitialContext() 생성
		Context envContext=(Context)ctx.lookup("java:/comp/env"); //lookup으로 JNDI의 기본경로(java:/comp/env) 넣어주기
		dataFactory=(DataSource)envContext.lookup("jdbc/myoracle"); //톰캣 context.xml에 설정한 name값인 jdbc/myoracle을 이용하여 
																	//톰캣이 미리 연결한 DataSource를 받아온다.
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public List<MemberVO> listMember(){ //MemberVO객체만 받는 자료구조 List의 메서드임
		List<MemberVO> list = new ArrayList<>(); // 자료구조 객체 생성
	try {
		conn=dataFactory.getConnection(); //ConnectionPool 객체의 getConnection()로 연결
		String query="select * from t_member"; //sql문
		System.out.println("prepareStatememt:"+query); 
		pstmt=conn.prepareStatement(query); //명령문을 담아줌
		ResultSet rs =pstmt.executeQuery(); //결과값을 받을 객체를 생성
		
		while(rs.next()) { //커서의 개념이 있음 next()는 그다음껄 꺼내줌
			String id=rs.getString("id"); //데이터베이스에서 결과값을 받아서 변수에 넣어줌
			String pwd=rs.getString("pwd"); //데이터베이스에서 결과값을 받아서 변수에 넣어줌
			String name=rs.getString("name"); //데이터베이스에서 결과값을 받아서 변수에 넣어줌
			String email=rs.getString("email"); //데이터베이스에서 결과값을 받아서 변수에 넣어줌
			String joinDate=rs.getString("joinDate"); //데이터베이스에서 결과값을 받아서 변수에 넣어줌
			
			MemberVO vo =new MemberVO(); //자바빈 객체 생성
			
			vo.setId(id); //자바빈 객체 설정
			vo.setPwd(pwd); //자바빈 객체 설정
			vo.setName(name); //자바빈 객체 설정
			vo.setEmail(email); //자바빈 객체 설정
			vo.setJoinDate(joinDate); //자바빈 객체 설정
			list.add(vo); //위에 set으로 설정했던거 다 list에 담아주기
		}
		rs.close();
		pstmt.close();
		conn.close();
	}catch(Exception e) {
		e.printStackTrace();
	}
	return list; //list 객체를 반환
	
	} 

	public void addMember(MemberVO memberVO) {
		try {
			conn=dataFactory.getConnection(); //ConnectionPool 객체연결
			String id=memberVO.getId(); //자바빈에서 요소 불러와서 변수에 담아주기
			String pwd=memberVO.getPwd(); //자바빈에서 요소 불러와서 변수에 담아주기
			String name=memberVO.getName(); //자바빈에서 요소 불러와서 변수에 담아주기
			String email=memberVO.getEmail(); //자바빈에서 요소 불러와서 변수에 담아주기
			
			String query="insert into t_member"; //쿼리문
			query+="(id,pwd,Name,email)"; //쿼리문
			query+="values(?,?,?,?)"; //쿼리문
			System.out.println("PreparedStatement:"+query);
			pstmt=conn.prepareStatement(query); //쿼리문 날리기 위한 객체생성
			pstmt.setString(1, id); //쿼리문 날리는 객체와 함께 보내줘야 하는 값
			pstmt.setString(2, pwd); //쿼리문 날리는 객체와 함께 보내줘야 하는 값
			pstmt.setString(3, name); //쿼리문 날리는 객체와 함께 보내줘야 하는 값
			pstmt.setString(4, email); //쿼리문 날리는 객체와 함께 보내줘야 하는 값
			pstmt.executeUpdate(); //실행하기
			pstmt.close(); //자원회수
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

	public void delMember(String id) {
		
		try {
			conn=dataFactory.getConnection(); //ConnectionPool 객체연결
			String query ="delete from t_member where id=?"; //쿼리문
			System.out.println("PreparedStatement:"+query); 
			pstmt=conn.prepareStatement(query); //쿼리문 날리기 위한 객체생성
			pstmt.setString(1, id); //쿼리문 날리는 객체와 함께 보내줘야 하는 값
			pstmt.executeUpdate(); //쿼리문 실행하기
			pstmt.close(); //자원회수
			
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		
	}
	
	
}
profile
좋은개발자가 되기위한 삽질기록 노트

0개의 댓글