ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 6. 회원정보 등록, 삭제하기
    개발자 수업/JSP 2021. 11. 27. 21:26

    1. 회원 가입창 작성 (html)
        1) <hidden> 태그를 이용해 회원 가입창에서 새 회원 등록 요청을 서블릿에 전달함

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>회원 가입</title>
    	<script type="text/javascript">
    		function fn_sendMember() {
    			var frmMember = document.frmMember;
    			var id = frmMember.id.value;
    			var pwd = frmMember.pwd.value;
    			var name = frmMember.name.value;
    			var email = frmMember.email.value;		//입력한 값들을 얻음
    			
    			if(id.length == 0 || id=="") {
    				alert("아이디는 필수입니다.");
    			} else if(pwd.length == 0 || pwd=="") {
    				alert("비밀번호는 필수입니다.");
    			} else if(name.length == 0 || name=="") {
    				alert("이름은 필수입니다.");
    			} else if(email.length == 0 || email=="") {
    				alert("이메일은 필수입니다.");
    			} else {
    				frmMember.method = "post";			//전송 방법을 post로 지정함
    				frmMember.action = "member3";		//서블릿 매핑 이름 지정
    				frmMember.submit();					//서블릿으로 전송함
    			}
    			
    		}
    	</script>
    </head>
    <body>
    	<form name="frmMember" action="">
    		<table>
    			<th>회원 가입창</th>
    			<tr>
    				<td>아이디</td>
    				<td><input type="text" name="id"></td>	 <!-- 입력한 ID를 서블릿으로 전송함 -->
    			</tr>
    			<tr>
    				<td>비밀번호</td>
    				<td><input type="password" 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>
    		<input type="button" value="가입하기" onclick="fn_sendMember()">
    		<input type="reset" value="다시입력">
    		<input type="hidden" name="command" value="addMember">
    	</form>
    </body>
    </html>


    2. Servlet 클래스 작성

    package kr.co.ezenac.member04;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.Date;
    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 MemberServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	
    	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 ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		MemberDAO dao = new MemberDAO();				//SQL문으로 조회할 MemberDAO 객체를 생성함
    		
    		String command = request.getParameter("command");	//command 값을 받아옴
    		if(command != null && command.equals("addMember")) {	//회원 가입창에서  전송된 command가 addMember이면 전송된 값들을 받아옴
    			String _id = request.getParameter("id");
    			String _pwd = request.getParameter("pwd");
    			String _name = request.getParameter("name");
    			String _email = request.getParameter("email");	//회원 가입창에서 전송된 값들을 얻어와
    			
    			MemberVO vo = new MemberVO();					//MemberVO객체에 저장한 후
    			vo.setId(_id);
    			vo.setPwd(_pwd);
    			vo.setName(_name);
    			vo.setEmail(_email);
    			
    			dao.addMember(vo);								//SQL문을 실행할 메서드에 전달함
    			
    		  //command 값이 delMember인 경우 ID를 가져와 SQL문 전달
    		} else if(command != null && command.equals("delMember")) {
    			String id = request.getParameter("id");
    			dao.delMember(id);
    		}
    			List<MemberVO> list = dao.listMembers();
    			
    			out.print("<html><body>");
    			out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
    			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 = list.get(i);			//조회한 회원 정보를 for문 <tr>태그 이용해 출력함
    				String id = memberVO.getId();
    				String pwd = memberVO.getPwd();
    				String name = memberVO.getName();
    				String email = memberVO.getEmail();
    				Date joinDate = memberVO.getJoinDate();
    				out.print("<tr><td>" + id + "</td><td>"
    									 + pwd + "</td><td>"
    									 + name + "</td><td>"
    									 + email + "</td><td>"
    									 + joinDate + "</td><td>"
    									 	//삭제 클릭하면 command 값과 회원 ID를 서블릿으로 전송함
    									 + "<a href='/chap03_Servlet/member3?command=delMember&id="+id+" '>삭제</a></td></tr>");
    			}
    			
    			out.print("</table>");
    			
    			out.print("<a href='/chap03_Servlet/memberForm.html'>새 회원 등록하기</a>");
    			
    			out.print("</body></html>");
    		
    	}
    
    }


    3. DAO(Data Access Object, DB 관련 기능 보유)에서 insert문 사용
        1) PreparedStatement의 insert문
            - 회원 정보를 저장하기 위해 ?(물음표)를 사용함
            - ?는 id, pwd, name, email에 순서대로 대응함
            - 각 ?에 대응하는 값을 지정하기 위해 setter를 사용함
            - ?은 1부터 시작함

    package kr.co.ezenac.member04;
    
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;
    
    public class MemberDAO {
    	
    	private Connection conn;
    	private PreparedStatement pstmt;
    	private DataSource dataFactory;
    	
    	public MemberDAO() {
    		try {
    			Context ctx = new InitialContext();
    			Context envContext = (Context)ctx.lookup("java:/comp/env");		//JNDI에 접근하기 위해 기본경로를 지정
    			//톰캣 context.xml에 설정한 name 값인 jdbc/oracle을 이용해 톰캣이 미리 연결한 DataSource를 받아옴
    			dataFactory = (DataSource)envContext.lookup("jdbc/oracle");		
    		} catch (NamingException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public List<MemberVO> listMembers() {
    		List<MemberVO> list = new ArrayList<MemberVO>();
    		
    		try {
    			conn = dataFactory.getConnection();	//DataSource를 이용해 DB에 연결함
    			
    			String query = "SELECT * FROM T_MEMBER";
    			System.out.println(query);
    			
    			pstmt = conn.prepareStatement(query);	//prepareStatement()메서드에 SQL문을 전달해 객체 생성함
    			ResultSet rs = pstmt.executeQuery();	//미리 설정한 SQL문을 실행함
    			
    			while(rs.next()) {
    				String id = rs.getString("id");
    				String pwd = rs.getString("pwd");
    				String name = rs.getString("name");
    				String email = rs.getString("email");
    				Date joinDate = rs.getDate("joinDate");	//조회한 레코드의 각 컬럼 값을 받아옴
    				
    				MemberVO vo = new MemberVO();
    				vo.setId(id);
    				vo.setPwd(pwd);
    				vo.setName(name);
    				vo.setEmail(email);
    				vo.setJoinDate(joinDate);				//각 컬럼 값을 다시 MemberVO 객체의 속성에 설정함
    				
    				list.add(vo);							//설정된 MemberVO 객체를 다시 ArrayList에 저장함
    			}
    			
    			rs.close();
    			pstmt.close();
    			conn.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    		return list;				//조회한 레코드의 개수만큼 MemberVO 객체를 저장한 ArrayList를 반환함
    	}
    	
    	public void addMember(MemberVO memberVO) {
    		try {
    			conn = dataFactory.getConnection();		// DataSource를 이용해 DB 연결
    			
    			String id = memberVO.getId();			// 테이블에 저장할 회원 정보 받아옴
    			String pwd = memberVO.getPwd();
    			String name = memberVO.getName();
    			String email = memberVO.getEmail();
    			
    			String query = "insert into t_member (id, pwd, name, email) values (?, ?, ?, ?)";
    			System.out.println("prepareStatement: " + query);
    			
    			pstmt = conn.prepareStatement(query);
    			
    			pstmt.setString(1, id);					//insert문의 ?에 순서대로 회원 정보 세팅
    			pstmt.setString(2, pwd);
    			pstmt.setString(3, name);
    			pstmt.setString(4, email);
    			
    			pstmt.executeUpdate();
    			pstmt.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void delMember(String id) {
    		try {
    			conn = dataFactory.getConnection();
    			
    			String query = "DELETE FROM T_MEMBER tm WHERE ID = ?";
    			System.out.println("prepareStatement : " + query);
    			
    			pstmt = conn.prepareStatement(query);
    			pstmt.setString(1, id);		//첫 번째 '?'에 전달된 ID를 인자로 넣음
    			pstmt.executeUpdate();		//delete문 실행 -> 테이블에서 해당 ID 회원 정보 삭제
    			pstmt.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    }
    //VO 클래스
    
    package kr.co.ezenac.member04;
    
    import java.sql.Date;
    
    /*
     	id 			varchar2(10)	PRIMARY KEY,
    	pwd			varchar2(10)	NOT NULL,
    	name		varchar2(50),
    	email		varchar2(50),
    	joinDate	DATE			DEFAULT sysdate
     */
    
    public class MemberVO {
    	private String id;
    	private String pwd;
    	private String name;
    	private String email;
    	private Date joinDate;
    	
    	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 Date getJoinDate() {
    		return joinDate;
    	}
    	public void setJoinDate(Date joinDate) {
    		this.joinDate = joinDate;
    	}
    	
    	
    }


           

     

    '개발자 수업 > JSP' 카테고리의 다른 글

    8. 서블릿 API 사용하기2  (0) 2021.12.02
    7. 서블릿 API 사용하기  (0) 2021.11.27
    5. JDBC 연동과 관련객체  (0) 2021.11.27
    4. 서블릿 비즈니스 로직 추가  (0) 2021.11.25
    3. 서블릿  (0) 2021.11.24

    댓글