본문 바로가기
WEB/JSP

JDBC - DB연결해서 멤버 리스트 출력, 삽입, 삭제하기

by 둥바 2022. 7. 22.

 JDBC - DB연동을 위해 준비해야 할 것

1. WEB PROJECT 생성한다. 

2. WEB-INF 아래 lib 폴더 안에 ojdbc6.jar(JDBC 오라클 드라이버)를 넣는다.

3. src/main/java에 config폴더를 생성한 후 DB.java를 넣는다.

 

package config;

import java.sql.Connection;

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

public class DB{
	public static Connection getConn(){
		//context.xml에 설정된 dbcp에서 커넥션을 가져옴 
		DataSource ds=null; //javax.sql
		Connection conn=null; 
		try  {
		//context.xml을 분석하는 객체
		Context ctx=new InitialContext(); //javax.naming 
		//context.xml의 Resource 태그 검색, name="oraDB"와 매칭 
		ds=(DataSource)ctx.lookup("java:comp/env/oraDB"); 
		conn=ds.getConnection();//커넥션 할당받음
		} catch (Exception e) { 
			e.printStackTrace();
		}
		return conn;//커넥션 리턴 
	}
}

이 때, 연동되려면 Servers 폴더 안에 Tomcat ~폴더 안의 context.xml에 dbcp(데이터베이스 Connection Pool) 설정을 해주어야 한다. 이 때, Resource의 name과 DB.java의 "java:com/env/oraDB"가 일치해야한다.

<!-- dbcp(DataBase Connection Pool) 설정 -->
	<Resource name="oraDB" auth="Container"
		driverClassName="oracle.jdbc.driver.OracleDriver" 
		maxTotal="50" 
		maxIdle="10" 
		maxWaitMillis="-1" 
		type="javax.sql.DataSource"
		url="jdbc:oracle:thin:@localhost:1521:xe" 
		username="java" 
		password="java1234" />

 

4. 제이쿼리를 사용할 것이므로, include폴더를 webapp아래에 만들어서 jqery파일을 넣어준다.

세팅한 모습

5. utf-8을 세팅하는 것이 번거로우므로, config 패키지에서 필터를 만든다.

 

필터란, 요청에 앞서서 처리되는 코드를 정의한 것이다.

이 때, url pattern을 /*으로 설정하는 것은 모든 요청을 필터가 처리하기 위함이다.

 

package config;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;

//필터 : 요청에 앞서 처리되는 코드 정의 
//url pattern : /* 모든 요청 처리
@WebFilter("/*")
public class EncodingFilter extends HttpFilter implements Filter {
    private String charset = "utf-8";
    
    public EncodingFilter() {
        super();
       
    }
    //필터 제거(서버가 멈출 때)
	public void destroy() {
		System.out.println("필터가 제거되었다.");
	}

	//요청이 들어올 때 거쳐가는 코드
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		System.out.println("필터가 실행되었다.");
		//실제 목적
		request.setCharacterEncoding(charset);
		chain.doFilter(request, response);//여기서 필터가 처리된다.
	}

	//필터 초기화(서버가 시작될 때 실행된다)
	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("필터가 초기화되었습니다.");
	}

}

 

준비가 끝났다면, 이제 본격적으로 member 관련 파일들을 만들어야한다.

 

기능구현 1번 ) DB와 연동하여 member의 회원목록을 프론트 단에 출력하기

1. 먼저, 모든 페이지의 시작인 member.jsp를 만든다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src=../include/jquery-3.6.0.min.js></script>
<script type="text/javascript">
$(function(){ //페이지가 로딩되자마자 자동으로 실행되는 코드
	list();
});

//회원목록을 div에 출력할 list함수 만들기, 이 때 빠른 속도를 위해 백그라운드로 실행
function list(){
	$.ajax({
    	type:"post",
        url:"/jsppractice/member_servlet/list.do", //요청 url
        success:function(result){ //받아온 결과를 매개변수로 하는 콜백함수
        	console.log(result);
            $("#memberList).html(result); //div에 result(결과값) 넣기
        }
    });
}

</script>
</head>
<body>
<h2>회원 관리</h2>
<div id="memberList"></div> <!-- 데이터 출력할 용도 -->
</body>
</html>

 

2. 요청을 처리 할 서블릿을 만든다.

먼저, src/main/java 아래에 member 패키지를 만든 후 서블릿을 생성(MemberController.java)한다.

package member;

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("/member_servlet/*") //이 주소로 요청이 들어오면
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//uri : 사용자 요청 주소
		String uri = request.getRequestURI();
		//contextpath : 프로젝트 식별자, 이름
		String context = request.getContextPath();
		//list.do라는 요청이 들어온다면,
		if(uri.indexOf("list.do")!= -1) {
			System.out.println("list 호출");
			System.out.println(request.getRequestURI());
			System.out.println(uri.indexOf("list.do"));
		}
		
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

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

}

uri.indexOf(list.do)은 결국, uri에서 list.do가 위치하는 인덱스값을 반환한다. 만일, 존재하지 않는다면 음수를 반환한다.

따라서 -1이 아니라면 list.do가 uri에 위치한다는 것이므로 list.do 요청이 들어왔다는 것을 의미한다.

 

 

 

3. DTO(데이터 교환을 위한 객체로, 비즈니스 로직을 가지지 않는 순수한 데이터 객체) 만들기

package member;

import java.sql.Date;

public class MemberDTO {
	private String userid;
	private String passwd;
	private String name;
	private String email;
	private String hp;
	private String zipcode;
	private String address1;
	private String address2;
	private Date join_date;
	
	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	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 getHp() {
		return hp;
	}
	public void setHp(String hp) {
		this.hp = hp;
	}
	public String getZipcode() {
		return zipcode;
	}
	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}
	public String getAddress1() {
		return address1;
	}
	public void setAddress1(String address1) {
		this.address1 = address1;
	}
	public String getAddress2() {
		return address2;
	}
	public void setAddress2(String address2) {
		this.address2 = address2;
	}
	public Date getJoin_date() {
		return join_date;
	}
	public void setJoin_date(Date join_date) {
		this.join_date = join_date;
	}
	@Override
	public String toString() {
		return "MemberDTO [userid=" + userid + ", passwd=" + passwd + ", name=" + name + ", email=" + email + ", hp="
				+ hp + ", zipcode=" + zipcode + ", address1=" + address1 + ", address2=" + address2 + ", join_date="
				+ join_date + "]";
	}
	public MemberDTO() {
		super();
		// TODO Auto-generated constructor stub
	}
	public MemberDTO(String userid, String passwd, String name, String email, String hp, String zipcode,
			String address1, String address2, Date join_date) {
		super();
		this.userid = userid;
		this.passwd = passwd;
		this.name = name;
		this.email = email;
		this.hp = hp;
		this.zipcode = zipcode;
		this.address1 = address1;
		this.address2 = address2;
		this.join_date = join_date;
	}
	
	
	
}

 

4. DAO 작성 ( 데이터베이스에 접근하기 위한 객체로, 비즈니스 로직 -SQL문을 가지고 있다.)

 

package member;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import config.DB;

public class MemberDAO {
	//List<MemberDTO>타입으로 반환해주는 memberList() 메소드를 생성
	public List<MemberDTO> memberList(){
		//받을 ArrayList를 메모리에 올려야한다.(객체 생성)
		List<MemberDTO> items = new ArrayList<MemberDTO>(); //다형성
		Connection conn=null;//연결 객체
		PreparedStatement pstmt = null;//SQL문 실행 객체
		ResultSet rs = null;//Select문 결과 받아오는 결과셋
		try {
			//DB,네트워크 등 try-catch문 필수
			conn = DB.getConn(); //DB와 연결
			String sql = "select * from member order by name";
			pstmt = conn.prepareStatement(sql);//sql문 담아서 준비시켜주면
			rs = pstmt.executeQuery();//select 전용 메소드
			while(rs.next()) {//다음 값이 있을 때까지
				//여러 줄 가져올 때 while문 
				//가져온 값을 dto에 넣어야하므로, dto 객체 생성
				MemberDTO dto = new MemberDTO();
				//setter를 통해 넣어주기 - rs에 있는 값 넣기
				dto.setUserid(rs.getString("userid"));
				dto.setPasswd(rs.getString("passwd"));
				dto.setName(rs.getString("name"));
				dto.setEmail(rs.getString("email"));
				dto.setHp(rs.getString("hp"));
				dto.setZipcode(rs.getString("zipcode"));
				dto.setAddress1(rs.getString("address1"));
				dto.setAddress2(rs.getString("address2"));
				dto.setJoin_date(rs.getDate("join_date"));
				//ArrayList는 add로 추가 
				items.add(dto);//리스트에 추가
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//리소스 역순으로 닫아주기
			try {
				if(rs!=null) rs.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			
		}
		
		
		return items;//반환
	}
}

 

5. 이렇게 만든 DAO의 메소드를 서블릿 쪽에서 호출해야 작동한다.

 

package member;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
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("/member_servlet/*")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//uri : 사용자 요청 주소
		String uri = request.getRequestURI();
		//contextpath : 프로젝트 식별자, 이름
		String context = request.getContextPath();
		//memberDAO를 메모리에 올려야한다.
		MemberDAO dao = new MemberDAO();
		
		
		//list.do라는 요청이 들어온다면,
		if(uri.indexOf("list.do")!= -1) {
			//들어온 값을 한번 더 압축 ( ArrayList -> Map으로 한번 더 압축)
			Map<String,Object> map = new HashMap<>();
			List<MemberDTO> list = dao.memberList();//멤버 리스트 호출해서 연결하고 sql처리해서 값을 받아서 dto에 넣고 list에 추가
			map.put("list", list); //Key-value로 map에 넣기
			map.put("count", list.size()); //레코드의 갯수 (회원수) 리턴
			//웹 영역(request)에 저장
			request.setAttribute("map", map);
			//포워딩
			String page="/ch06/member_list.jsp";
			RequestDispatcher rd = request.getRequestDispatcher(page);
			rd.forward(request, response);
			
		}
		
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

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

}

 

6. 포워딩 페이지 작성 ( memberlist.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- import(사용되는 것들)해줘야 한다. -->
<%@ page import="java.util.Map"  %>
<%@ page import="java.util.List"  %>
<%@ page import="member.MemberDTO"  %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src=../include/jquery-3.6.0.min.js></script>
</head>
<body>
<%
//setAttribute로 저장되었던 값을 getAttribute로 가져온다.
Map<String,Object> map = (Map<String,Object>)request.getAttribute("map"); //형변환
//Map에 있는 것 풀기
List<MemberDTO> list = (List<MemberDTO>)map.get("list");
int count = (int)map.get("count");
%>

등록된 회원 수 : <%= count %> 명
<table border="1" width="100%">
	<tr>
		<th>이름</th>
		<th>아이디</th>
		<th>가입일자</th>
		<th>이메일</th>
		<th>핸드폰</th>
		<th>우편번호</th>
		<th>주소</th>
		<th>상세주소</th>
	</tr>
	<!-- for문으로 돌려야 -->
	<% for(MemberDTO dto : list) { %>
		<tr>
			<td><%= dto.getName() %></td>
			<td><%= dto.getUserid() %></td>
			<td><%= dto.getJoin_date() %></td>
			<td><%= dto.getEmail() %></td>
			<td><%= dto.getHp() %></td>
			<td><%= dto.getZipcode() %></td>
			<td><%= dto.getAddress1() %></td>
			<td><%= dto.getAddress2() %></td>
		</tr>
	
	<% } %>
</table>
</body>
</html>

 

기능구현 2번 ) memberlist에 데이터 추가하기

1. member.jsp에서 멤버 정보를 입력할 폼을 만들고, 추가 버튼을 클릭하면 입력한 값들을 서블릿으로 보내고 처리가 성공하면 멤버 리스트를 다시 새로고침하여 가져오고, 입력한 값들을 초기화시켜준다.

- 세분화 시키면,

- 멤버 정보 입력 폼 + 추가버튼

- 추가버튼 클릭 시 insert함수 작동

- insert함수는 ajax로 입력한 값(param)을 post 전송 형태로 join.do라는 요청으로 서블릿에 보내게 되고, 서블릿에서 처리가 성공한다면 

- list를 한 번 더 갱신하고, 입력값을 초기화하게끔 세팅

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src=../include/jquery-3.6.0.min.js></script>
<script type="text/javascript">
$(function(){ //페이지 로딩되자마자 자동으로 실행되는 코드
	list();
	$("#btnSave").click(function() {
		insert();
	});
});

function list(){
	//회원목록을 DB로부터 가지고 와서, div에 출력/ 빠르게 백그라운드로 실행
	$.ajax({
		type: "post",
		url: "/jsp00/member_servlet/list.do",
		success:function(result){
			console.log(result);//F12 콘솔에서 확인
			$("#memberList").html(result);
		}
	});
}

function insert(){
	var param = "userid="+$("#userid").val()
	+ "&passwd="+$("#passwd").val()
	+ "&name=" +$("#name").val()
	+ "&email="+$("#email").val()
	+ "&hp="+$("#hp").val()
	+ "&zipcode="+$("#zipcode").val()
	+ "&address1="+$("#address1").val()
	+ "&address2="+$("#address2").val()
	$.ajax({
		type: "post",
		url: "/jsp00/member_servlet/join.do",
		data: param,
		success : function(){
			list(); //회원목록 갱신
			//입력 값 초기화
			$("#userid").val("");
			$("#passwd").val("");
			$("#name").val("");
			$("#email").val("");
			$("#hp").val("");
			$("#zipcode").val("");
			$("#address1").val("");
			$("#address2").val("");
		}
	});
}


</script>
</head>
<body>
<h2>회원 관리</h2>
<!-- 정보를 입력하고 버튼을 누르면 데이터 추가되어 테이블에 뜨게끔 -->
아이디 : <input id="userid">
비밀번호 : <input type="password" id="passwd">
이름 : <input id="name">
이메일 : <input id="email">
핸드폰 : <input id="hp">
우편번호 : <input id="zipcode">
주소 : <input id="address1">
상세주소 : <input id="address2">
<button type="button" id="btnSave">추가</button>



<div id="memberList"></div> <!-- 데이터 출력할 용도 -->
</body>
</html>

 

2. 서블릿으로 가서, 기능을 추가해준다.

- 요청 : join.do로 들어오면 ajax를 통해서 보낸 값들을 변수에 저장해서 DTO에 넣어준다.(세더를 통해)

package member;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
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("/member_servlet/*")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//uri : 사용자 요청 주소
		String uri = request.getRequestURI();
		//contextpath : 프로젝트 식별자, 이름
		String context = request.getContextPath();
		//memberDAO를 메모리에 올려야한다.
		MemberDAO dao = new MemberDAO();
		
		
		//list.do라는 요청이 들어온다면,
		if(uri.indexOf("list.do")!= -1) {
			//들어온 값을 한번 더 압축 ( ArrayList -> Map으로 한번 더 압축)
			Map<String,Object> map = new HashMap<>();
			List<MemberDTO> list = dao.memberList();//멤버 리스트 호출해서 연결하고 sql처리해서 값을 받아서 dto에 넣고 list에 추가
			map.put("list", list); //Key-value로 map에 넣기
			map.put("count", list.size()); //레코드의 갯수 (회원수) 리턴
			//웹 영역(request)에 저장
			request.setAttribute("map", map);
			//포워딩
			String page="/ch06/member_list.jsp";
			RequestDispatcher rd = request.getRequestDispatcher(page);
			rd.forward(request, response);
			
		}else if(uri.indexOf("join.do")!= -1) {
			//ajax로 들어온 값들을 dto쪽으로 보내줘야 한다.
			String userid=request.getParameter("userid");
			String passwd=request.getParameter("passwd");
			String name=request.getParameter("name");
			String email=request.getParameter("email");
			String hp=request.getParameter("hp");
			String zipcode=request.getParameter("zipcode");
			String address1=request.getParameter("address1");
			String address2=request.getParameter("address2");
			
			MemberDTO dto = new MemberDTO();//DTO생성
			dto.setUserid(userid);//dto의 setter를 통해 자료 저장
			dto.setPasswd(passwd);
			dto.setName(name);
			dto.setEmail(email);
			dto.setHp(hp);
			dto.setZipcode(zipcode);
			dto.setAddress1(address1);
			dto.setAddress2(address2);
		}
		
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

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

}

 

 

3. DAO로 이 값들을 데이터베이스에 보내줘야지! 즉, 추가하는 sql문을 날려서 처리해주는 메소드를 만든다.

package member;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import config.DB;

public class MemberDAO {
	//List<MemberDTO>타입으로 반환해주는 memberList() 메소드를 생성
	public List<MemberDTO> memberList(){
		//받을 ArrayList를 메모리에 올려야한다.(객체 생성)
		List<MemberDTO> items = new ArrayList<MemberDTO>(); //다형성
		Connection conn=null;//연결 객체
		PreparedStatement pstmt = null;//SQL문 실행 객체
		ResultSet rs = null;//Select문 결과 받아오는 결과셋
		try {
			//DB,네트워크 등 try-catch문 필수
			conn = DB.getConn(); //DB와 연결
			String sql = "select * from member order by name";
			pstmt = conn.prepareStatement(sql);//sql문 담아서 준비시켜주면
			rs = pstmt.executeQuery();//select 전용 메소드
			while(rs.next()) {//다음 값이 있을 때까지
				//여러 줄 가져올 때 while문 
				//가져온 값을 dto에 넣어야하므로, dto 객체 생성
				MemberDTO dto = new MemberDTO();
				//setter를 통해 넣어주기 - rs에 있는 값 넣기
				dto.setUserid(rs.getString("userid"));
				dto.setPasswd(rs.getString("passwd"));
				dto.setName(rs.getString("name"));
				dto.setEmail(rs.getString("email"));
				dto.setHp(rs.getString("hp"));
				dto.setZipcode(rs.getString("zipcode"));
				dto.setAddress1(rs.getString("address1"));
				dto.setAddress2(rs.getString("address2"));
				dto.setJoin_date(rs.getDate("join_date"));
				//ArrayList는 add로 추가 
				items.add(dto);//리스트에 추가
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//리소스 역순으로 닫아주기
			try {
				if(rs!=null) rs.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			
		}
		
		
		return items;//반환
	}//memberList() 
	
	public void insert(MemberDTO dto) {
		//update를 하는 경우는 반환할 필요가 없기 때문에 void
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			conn = DB.getConn();
			//String : 불변, StringBuilder : 가변
			StringBuilder sql = new StringBuilder();
			sql.append(" insert into member ");
			sql.append(" (userid,passwd,name,email,hp,zipcode,address1,address2) values ");
			sql.append(" (?,?,?,?,?,?,?,?) ");
			pstmt = conn.prepareStatement(sql.toString());
			//StringBuilder는 toString으로 String화 해줘야한다.
			//?로 들어온 값 처리(setString,get-)
			pstmt.setString(1,dto.getUserid());
			pstmt.setString(2,dto.getPasswd());
			pstmt.setString(3,dto.getName());
			pstmt.setString(4,dto.getEmail());
			pstmt.setString(5,dto.getHp());
			pstmt.setString(6,dto.getZipcode());
			pstmt.setString(7,dto.getAddress1());
			pstmt.setString(8,dto.getAddress2());
			pstmt.executeUpdate();//select제외한 dml문 처리
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}
	
}

 

 

4. 이렇게 만들어 놓은 메소드를 컨트롤러(서블릿)에서 호출해준다.

package member;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
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("/member_servlet/*")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//uri : 사용자 요청 주소
		String uri = request.getRequestURI();
		//contextpath : 프로젝트 식별자, 이름
		String context = request.getContextPath();
		//memberDAO를 메모리에 올려야한다.
		MemberDAO dao = new MemberDAO();
		
		
		//list.do라는 요청이 들어온다면,
		if(uri.indexOf("list.do")!= -1) {
			//들어온 값을 한번 더 압축 ( ArrayList -> Map으로 한번 더 압축)
			Map<String,Object> map = new HashMap<>();
			List<MemberDTO> list = dao.memberList();//멤버 리스트 호출해서 연결하고 sql처리해서 값을 받아서 dto에 넣고 list에 추가
			map.put("list", list); //Key-value로 map에 넣기
			map.put("count", list.size()); //레코드의 갯수 (회원수) 리턴
			//웹 영역(request)에 저장
			request.setAttribute("map", map);
			//포워딩
			String page="/ch06/member_list.jsp";
			RequestDispatcher rd = request.getRequestDispatcher(page);
			rd.forward(request, response);
			
		}else if(uri.indexOf("join.do")!= -1) {
			//ajax로 들어온 값들을 dto쪽으로 보내줘야 한다.
			String userid=request.getParameter("userid");
			String passwd=request.getParameter("passwd");
			String name=request.getParameter("name");
			String email=request.getParameter("email");
			String hp=request.getParameter("hp");
			String zipcode=request.getParameter("zipcode");
			String address1=request.getParameter("address1");
			String address2=request.getParameter("address2");
			
			MemberDTO dto = new MemberDTO();//DTO생성
			dto.setUserid(userid);//dto의 setter를 통해 자료 저장
			dto.setPasswd(passwd);
			dto.setName(name);
			dto.setEmail(email);
			dto.setHp(hp);
			dto.setZipcode(zipcode);
			dto.setAddress1(address1);
			dto.setAddress2(address2);
			dao.insert(dto);
		}
		
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

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

}

기능구현 3번 ) 이름에 하이퍼링크를 걸어서 회원의 상세 페이지에서 수정 , 삭제하는 기능

1.member_list.jsp에서 하이퍼링크 처리

(이름에 하이퍼링크를 걸더라도, 동명이인의 문제가 있으므로 , 중복된 값이 허용되지 않는 유니크한 값으로 처리)

- 이름의 하이퍼링크를 클릭하면 view(<%=dto.getUserid()%>)라는 자바스크립트 함수 이벤트 실행

-  이 자바스크립트 함수는 폼 안의 userid값에 매개변수로 들어온 dto의 id값을 저장한다.

- 이 폼을 수동 submit을 통해서 보내는데,

- 폼은 userid를 hidden으로 보내며, view.do로 요청한다.(상세페이지)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- import(사용되는 것들)해줘야 한다. -->
<%@ page import="java.util.Map"  %>
<%@ page import="java.util.List"  %>
<%@ page import="member.MemberDTO"  %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src=../include/jquery-3.6.0.min.js></script>
<script type="text/javascript">
function view(userid){
	document.form1.userid.value = userid;
	//들어온 dto.getUserid값을 form의 userid값에 보내는 것
	//form을 보내기 위한 수동 submit
	document.form1.submit();
}

</script>
</head>
<body>
<%
//setAttribute로 저장되었던 값을 getAttribute로 가져온다.
Map<String,Object> map = (Map<String,Object>)request.getAttribute("map"); //형변환
//Map에 있는 것 풀기
List<MemberDTO> list = (List<MemberDTO>)map.get("list");
int count = (int)map.get("count");
%>

등록된 회원 수 : <%= count %> 명
<table border="1" width="100%">
	<tr>
		<th>이름</th>
		<th>아이디</th>
		<th>가입일자</th>
		<th>이메일</th>
		<th>핸드폰</th>
		<th>우편번호</th>
		<th>주소</th>
		<th>상세주소</th>
	</tr>
	<!-- for문으로 돌려야 -->
	<% for(MemberDTO dto : list) { %>
		<tr>
		<!-- 동명이인의 것을 삭제,수정할 수 있으므로 유니크한 값이 필요(아이디) -->
			<td><a href="#" onclick="view('<%=dto.getUserid() %>')"><%= dto.getName() %></a></td>
			<td><%= dto.getUserid() %></td>
			<td><%= dto.getJoin_date() %></td>
			<td><%= dto.getEmail() %></td>
			<td><%= dto.getHp() %></td>
			<td><%= dto.getZipcode() %></td>
			<td><%= dto.getAddress1() %></td>
			<td><%= dto.getAddress2() %></td>
		</tr>
	
	<% } %>
</table>
<!-- 요청 -->
<form name="form1" method="post" action="/jsp00/member_servlet/view.do">
<!-- userid값을 보내는데, 사용자에게 보이지 않게 보내주기 -->
	<input type="hidden" name="userid">
</form>

</body>
</html>

 

2. 컨트롤러에 기능을 추가한다.

package member;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
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("/member_servlet/*")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//uri : 사용자 요청 주소
		String uri = request.getRequestURI();
		//contextpath : 프로젝트 식별자, 이름
		String context = request.getContextPath();
		//memberDAO를 메모리에 올려야한다.
		MemberDAO dao = new MemberDAO();
		
		
		//list.do라는 요청이 들어온다면,
		if(uri.indexOf("list.do")!= -1) {
			//들어온 값을 한번 더 압축 ( ArrayList -> Map으로 한번 더 압축)
			Map<String,Object> map = new HashMap<>();
			List<MemberDTO> list = dao.memberList();//멤버 리스트 호출해서 연결하고 sql처리해서 값을 받아서 dto에 넣고 list에 추가
			map.put("list", list); //Key-value로 map에 넣기
			map.put("count", list.size()); //레코드의 갯수 (회원수) 리턴
			//웹 영역(request)에 저장
			request.setAttribute("map", map);
			//포워딩
			String page="/ch06/member_list.jsp";
			RequestDispatcher rd = request.getRequestDispatcher(page);
			rd.forward(request, response);
			
		}else if(uri.indexOf("join.do")!= -1) {
			//ajax로 들어온 값들을 dto쪽으로 보내줘야 한다.
			String userid=request.getParameter("userid");
			String passwd=request.getParameter("passwd");
			String name=request.getParameter("name");
			String email=request.getParameter("email");
			String hp=request.getParameter("hp");
			String zipcode=request.getParameter("zipcode");
			String address1=request.getParameter("address1");
			String address2=request.getParameter("address2");
			
			MemberDTO dto = new MemberDTO();//DTO생성
			dto.setUserid(userid);//dto의 setter를 통해 자료 저장
			dto.setPasswd(passwd);
			dto.setName(name);
			dto.setEmail(email);
			dto.setHp(hp);
			dto.setZipcode(zipcode);
			dto.setAddress1(address1);
			dto.setAddress2(address2);
			dao.insert(dto);
		}else if(uri.indexOf("view.do")!= -1) {
			String userid=request.getParameter("userid");
			System.out.println("클릭한 아이디:" + userid);
		}
		
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

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

}

 

3. DAO에서 들어온 userid값과 일치하는 멤버의 상세정보를 DTO로 반환하는 메소드 만들기

 

package member;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import config.DB;

public class MemberDAO {
	//List<MemberDTO>타입으로 반환해주는 memberList() 메소드를 생성
	public List<MemberDTO> memberList(){
		//받을 ArrayList를 메모리에 올려야한다.(객체 생성)
		List<MemberDTO> items = new ArrayList<MemberDTO>(); //다형성
		Connection conn=null;//연결 객체
		PreparedStatement pstmt = null;//SQL문 실행 객체
		ResultSet rs = null;//Select문 결과 받아오는 결과셋
		try {
			//DB,네트워크 등 try-catch문 필수
			conn = DB.getConn(); //DB와 연결
			String sql = "select * from member order by name";
			pstmt = conn.prepareStatement(sql);//sql문 담아서 준비시켜주면
			rs = pstmt.executeQuery();//select 전용 메소드
			while(rs.next()) {//다음 값이 있을 때까지
				//여러 줄 가져올 때 while문 
				//가져온 값을 dto에 넣어야하므로, dto 객체 생성
				MemberDTO dto = new MemberDTO();
				//setter를 통해 넣어주기 - rs에 있는 값 넣기
				dto.setUserid(rs.getString("userid"));
				dto.setPasswd(rs.getString("passwd"));
				dto.setName(rs.getString("name"));
				dto.setEmail(rs.getString("email"));
				dto.setHp(rs.getString("hp"));
				dto.setZipcode(rs.getString("zipcode"));
				dto.setAddress1(rs.getString("address1"));
				dto.setAddress2(rs.getString("address2"));
				dto.setJoin_date(rs.getDate("join_date"));
				//ArrayList는 add로 추가 
				items.add(dto);//리스트에 추가
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//리소스 역순으로 닫아주기
			try {
				if(rs!=null) rs.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			
		}
		
		
		return items;//반환
	}//memberList() 
	
	public void insert(MemberDTO dto) {
		//update를 하는 경우는 반환할 필요가 없기 때문에 void
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			conn = DB.getConn();
			//String : 불변, StringBuilder : 가변
			StringBuilder sql = new StringBuilder();
			sql.append(" insert into member ");
			sql.append(" (userid,passwd,name,email,hp,zipcode,address1,address2) values ");
			sql.append(" (?,?,?,?,?,?,?,?) ");
			pstmt = conn.prepareStatement(sql.toString());
			//StringBuilder는 toString으로 String화 해줘야한다.
			//?로 들어온 값 처리(setString,get-)
			pstmt.setString(1,dto.getUserid());
			pstmt.setString(2,dto.getPasswd());
			pstmt.setString(3,dto.getName());
			pstmt.setString(4,dto.getEmail());
			pstmt.setString(5,dto.getHp());
			pstmt.setString(6,dto.getZipcode());
			pstmt.setString(7,dto.getAddress1());
			pstmt.setString(8,dto.getAddress2());
			pstmt.executeUpdate();//select제외한 dml문 처리
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}//insert()
	
	public MemberDTO memberDetail(String userid) {
		MemberDTO dto = null;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = DB.getConn();
			String sql = "select * from member where userid=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userid);//들어온 값을 1번 물음표에 넣어줌
			rs = pstmt.executeQuery();
			if(rs.next()) {
				//한 개만 가져올 때
				//rs의 값을 dto에 넣어주기
				dto = new MemberDTO();
				dto.setUserid(userid);
				dto.setPasswd(rs.getString("passwd"));
				dto.setName(rs.getString("name"));
				dto.setEmail(rs.getString("email"));
				dto.setHp(rs.getString("hp"));
				dto.setZipcode(rs.getString("zipcode"));
				dto.setAddress1(rs.getString("address1"));
				dto.setAddress2(rs.getString("address2"));
				dto.setJoin_date(rs.getDate("join_date"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//리소스 역순으로 닫아주기
			try {
				if(rs!=null) rs.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			
		}
		return dto;
	}//end memberDetail()
	
}

 

4. 서블릿에서 위에서 만든 메소드를 실행하여 받아온 값을 웹 영역에 저장하고 포워딩하기

 

package member;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
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("/member_servlet/*")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//uri : 사용자 요청 주소
		String uri = request.getRequestURI();
		//contextpath : 프로젝트 식별자, 이름
		String context = request.getContextPath();
		//memberDAO를 메모리에 올려야한다.
		MemberDAO dao = new MemberDAO();
		
		
		//list.do라는 요청이 들어온다면,
		if(uri.indexOf("list.do")!= -1) {
			//들어온 값을 한번 더 압축 ( ArrayList -> Map으로 한번 더 압축)
			Map<String,Object> map = new HashMap<>();
			List<MemberDTO> list = dao.memberList();//멤버 리스트 호출해서 연결하고 sql처리해서 값을 받아서 dto에 넣고 list에 추가
			map.put("list", list); //Key-value로 map에 넣기
			map.put("count", list.size()); //레코드의 갯수 (회원수) 리턴
			//웹 영역(request)에 저장
			request.setAttribute("map", map);
			//포워딩
			String page="/ch06/member_list.jsp";
			RequestDispatcher rd = request.getRequestDispatcher(page);
			rd.forward(request, response);
			
		}else if(uri.indexOf("join.do")!= -1) {
			//ajax로 들어온 값들을 dto쪽으로 보내줘야 한다.
			String userid=request.getParameter("userid");
			String passwd=request.getParameter("passwd");
			String name=request.getParameter("name");
			String email=request.getParameter("email");
			String hp=request.getParameter("hp");
			String zipcode=request.getParameter("zipcode");
			String address1=request.getParameter("address1");
			String address2=request.getParameter("address2");
			
			MemberDTO dto = new MemberDTO();//DTO생성
			dto.setUserid(userid);//dto의 setter를 통해 자료 저장
			dto.setPasswd(passwd);
			dto.setName(name);
			dto.setEmail(email);
			dto.setHp(hp);
			dto.setZipcode(zipcode);
			dto.setAddress1(address1);
			dto.setAddress2(address2);
			dao.insert(dto);
		}else if(uri.indexOf("view.do")!= -1) {
			String userid=request.getParameter("userid");
			System.out.println("클릭한 아이디:" + userid);
			MemberDTO dto = dao.memberDetail(userid);
			//쿼리문 처리한 상세내용을 dto에 저장
			//웹 영역에 저장
			request.setAttribute("dto", dto);
			//포워딩
			String page="/ch06/member_view.jsp";
			RequestDispatcher rd=request.getRequestDispatcher(page);
			rd.forward(request, response);
		}
		
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

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

}

 

5. member_view.jsp에서 받아온 값을 테이블에 넣어서 출력

-> 수정, 삭제 버튼 만들 때 반드시 userid가 필요하므로 hidden으로 같이 보내기

-> 수정을 위해서 입력 필드로 열어놓기

-> 수정 버튼을 클릭하면 update.do 주소로 요청, 폼 제출

-> 삭제 버튼 클릭하면 delete.do 주소로 요청, 폼 제출

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="member.MemberDTO"  %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src=../include/jquery-3.6.0.min.js></script>
<script type="text/javascript">
$(function(){
	$("#btnUpdate").click(function(){
		//폼에 있는 데이터를 제출할 주소
		document.form1.action="/jsp00/member_servlet/update.do";
		//데이터 서버에 제출
		document.form1.submit();
	});
	$("#btnDelete").click(function(){
		if(confirm("삭제하시겠습니까?")){	
			//폼에 있는 데이터를 제출할 주소
			document.form1.action="/jsp00/member_servlet/delete.do";
			//데이터 서버에 제출
			document.form1.submit();
		}
	});
});


</script>
</head>
<body>
<%
//웹 영역에 저장된 값을 가져오기
MemberDTO dto = (MemberDTO)request.getAttribute("dto");
%>
<!-- 수정,삭제를 위해 -->

<form name="form1" method="post">
<table>
	<tr>
		<td>아이디</td>
		<td><%= dto.getUserid() %></td>
	</tr>
	<tr>
	<!-- 수정용도로 입력필드 주기 -->
		<td>비밀번호</td>
		<td><input type="password" name="passwd" value="<%= dto.getPasswd() %>"></td>
	</tr>
	<tr>
	<!-- 수정용도로 입력필드 주기 -->
		<td>이름</td>
		<td><input name="name" value="<%= dto.getName() %>"></td>
	</tr>
	<tr>
		<td>가입일자</td>
		<td><%= dto.getJoin_date() %></td>
	</tr>
	<tr>
	<!-- 수정용도로 입력필드 주기 -->
		<td>이메일</td>
		<td><input name="email" value="<%= dto.getEmail() %>"></td>
	</tr>
	<tr>
	<!-- 수정용도로 입력필드 주기 -->
		<td>휴대폰</td>
		<td><input name="hp" value="<%= dto.getHp() %>"></td>
	</tr>
	<tr>
	<!-- 수정용도로 입력필드 주기 -->
		<td>우편번호</td>
		<td><input name="zipcode" value="<%= dto.getZipcode() %>"></td>
	</tr>
	<tr>
	<!-- 수정용도로 입력필드 주기 -->
		<td>주소</td>
		<td><input name="address1" value="<%= dto.getAddress1() %>"></td>
	</tr>
	<tr>
	<!-- 수정용도로 입력필드 주기 -->
		<td>상세주소</td>
		<td><input name="address2" value="<%= dto.getAddress2() %>"></td>
	</tr>
	<tr>
		<td colspan="2" align="center">
		<!-- 수정,삭제에는 반드시 userid가 필요하므로 hidden타입으로 넘김. -->
			<input type="hidden" name="userid" value="<%= dto.getUserid() %>">
			<button type="button" id="btnUpdate">수정</button>
			<button type="button" id="btnDelete">삭제</button>
		</td>
	</tr>
</table>



</form>
</body>
</html>

6. 서블릿에서 수정 요청 처리

-> 입력된 값들을 받아와서 (수정) DTO에 저장하고, DAO로 업데이트 해야

package member;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
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("/member_servlet/*")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//uri : 사용자 요청 주소
		String uri = request.getRequestURI();
		//contextpath : 프로젝트 식별자, 이름
		String context = request.getContextPath();
		//memberDAO를 메모리에 올려야한다.
		MemberDAO dao = new MemberDAO();
		
		
		//list.do라는 요청이 들어온다면,
		if(uri.indexOf("list.do")!= -1) {
			//들어온 값을 한번 더 압축 ( ArrayList -> Map으로 한번 더 압축)
			Map<String,Object> map = new HashMap<>();
			List<MemberDTO> list = dao.memberList();//멤버 리스트 호출해서 연결하고 sql처리해서 값을 받아서 dto에 넣고 list에 추가
			map.put("list", list); //Key-value로 map에 넣기
			map.put("count", list.size()); //레코드의 갯수 (회원수) 리턴
			//웹 영역(request)에 저장
			request.setAttribute("map", map);
			//포워딩
			String page="/ch06/member_list.jsp";
			RequestDispatcher rd = request.getRequestDispatcher(page);
			rd.forward(request, response);
			
		}else if(uri.indexOf("join.do")!= -1) {
			//ajax로 들어온 값들을 dto쪽으로 보내줘야 한다.
			String userid=request.getParameter("userid");
			String passwd=request.getParameter("passwd");
			String name=request.getParameter("name");
			String email=request.getParameter("email");
			String hp=request.getParameter("hp");
			String zipcode=request.getParameter("zipcode");
			String address1=request.getParameter("address1");
			String address2=request.getParameter("address2");
			
			MemberDTO dto = new MemberDTO();//DTO생성
			dto.setUserid(userid);//dto의 setter를 통해 자료 저장
			dto.setPasswd(passwd);
			dto.setName(name);
			dto.setEmail(email);
			dto.setHp(hp);
			dto.setZipcode(zipcode);
			dto.setAddress1(address1);
			dto.setAddress2(address2);
			dao.insert(dto);
		}else if(uri.indexOf("view.do")!= -1) {
			String userid=request.getParameter("userid");
			System.out.println("클릭한 아이디:" + userid);
			MemberDTO dto = dao.memberDetail(userid);
			//쿼리문 처리한 상세내용을 dto에 저장
			//웹 영역에 저장
			request.setAttribute("dto", dto);
			//포워딩
			String page="/ch06/member_view.jsp";
			RequestDispatcher rd=request.getRequestDispatcher(page);
			rd.forward(request, response);
		}else if(uri.indexOf("update.do")!= -1) {
			//수정된 값을 받아야 한다.
			String userid=request.getParameter("userid");
			String passwd=request.getParameter("passwd");
			String name=request.getParameter("name");
			String email=request.getParameter("email");
			String hp=request.getParameter("hp");
			String zipcode=request.getParameter("zipcode");
			String address1=request.getParameter("address1");
			String address2=request.getParameter("address2");
			//받아온 값을 dto에 저장하고
			MemberDTO dto = new MemberDTO();//DTO생성
			dto.setUserid(userid);//dto의 setter를 통해 자료 저장
			dto.setPasswd(passwd);
			dto.setName(name);
			dto.setEmail(email);
			dto.setHp(hp);
			dto.setZipcode(zipcode);
			dto.setAddress1(address1);
			dto.setAddress2(address2);
			//레코드 수정 처리는 DAO에서 한다.(데이터베이스에 수정처리)
			dao.update(dto);
		}
		
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

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

}

 

 

7. 받아온 dto값을 데이터베이스에 update하는 메소드 생성

 

package member;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import config.DB;

public class MemberDAO {
	//List<MemberDTO>타입으로 반환해주는 memberList() 메소드를 생성
	public List<MemberDTO> memberList(){
		//받을 ArrayList를 메모리에 올려야한다.(객체 생성)
		List<MemberDTO> items = new ArrayList<MemberDTO>(); //다형성
		Connection conn=null;//연결 객체
		PreparedStatement pstmt = null;//SQL문 실행 객체
		ResultSet rs = null;//Select문 결과 받아오는 결과셋
		try {
			//DB,네트워크 등 try-catch문 필수
			conn = DB.getConn(); //DB와 연결
			String sql = "select * from member order by name";
			pstmt = conn.prepareStatement(sql);//sql문 담아서 준비시켜주면
			rs = pstmt.executeQuery();//select 전용 메소드
			while(rs.next()) {//다음 값이 있을 때까지
				//여러 줄 가져올 때 while문 
				//가져온 값을 dto에 넣어야하므로, dto 객체 생성
				MemberDTO dto = new MemberDTO();
				//setter를 통해 넣어주기 - rs에 있는 값 넣기
				dto.setUserid(rs.getString("userid"));
				dto.setPasswd(rs.getString("passwd"));
				dto.setName(rs.getString("name"));
				dto.setEmail(rs.getString("email"));
				dto.setHp(rs.getString("hp"));
				dto.setZipcode(rs.getString("zipcode"));
				dto.setAddress1(rs.getString("address1"));
				dto.setAddress2(rs.getString("address2"));
				dto.setJoin_date(rs.getDate("join_date"));
				//ArrayList는 add로 추가 
				items.add(dto);//리스트에 추가
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//리소스 역순으로 닫아주기
			try {
				if(rs!=null) rs.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			
		}
		
		
		return items;//반환
	}//memberList() 
	
	public void insert(MemberDTO dto) {
		//update를 하는 경우는 반환할 필요가 없기 때문에 void
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			conn = DB.getConn();
			//String : 불변, StringBuilder : 가변
			StringBuilder sql = new StringBuilder();
			sql.append(" insert into member ");
			sql.append(" (userid,passwd,name,email,hp,zipcode,address1,address2) values ");
			sql.append(" (?,?,?,?,?,?,?,?) ");
			pstmt = conn.prepareStatement(sql.toString());
			//StringBuilder는 toString으로 String화 해줘야한다.
			//?로 들어온 값 처리(setString,get-)
			pstmt.setString(1,dto.getUserid());
			pstmt.setString(2,dto.getPasswd());
			pstmt.setString(3,dto.getName());
			pstmt.setString(4,dto.getEmail());
			pstmt.setString(5,dto.getHp());
			pstmt.setString(6,dto.getZipcode());
			pstmt.setString(7,dto.getAddress1());
			pstmt.setString(8,dto.getAddress2());
			pstmt.executeUpdate();//select제외한 dml문 처리
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}//insert()
	
	public MemberDTO memberDetail(String userid) {
		MemberDTO dto = null;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = DB.getConn();
			String sql = "select * from member where userid=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userid);//들어온 값을 1번 물음표에 넣어줌
			rs = pstmt.executeQuery();
			if(rs.next()) {
				//한 개만 가져올 때
				//rs의 값을 dto에 넣어주기
				dto = new MemberDTO();
				dto.setUserid(userid);
				dto.setPasswd(rs.getString("passwd"));
				dto.setName(rs.getString("name"));
				dto.setEmail(rs.getString("email"));
				dto.setHp(rs.getString("hp"));
				dto.setZipcode(rs.getString("zipcode"));
				dto.setAddress1(rs.getString("address1"));
				dto.setAddress2(rs.getString("address2"));
				dto.setJoin_date(rs.getDate("join_date"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//리소스 역순으로 닫아주기
			try {
				if(rs!=null) rs.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			
		}
		return dto;
	}//end memberDetail()

	public void update(MemberDTO dto) {
		Connection conn=null;
		PreparedStatement pstmt = null;
		try {
			conn = DB.getConn();
			StringBuilder sb = new StringBuilder();
			sb.append(" update member set ");
			sb.append(" passwd=?, name=?, email=?, hp=?, zipcode=?, address1=?, address2=? ");
			sb.append(" where userid=? ");
			pstmt=conn.prepareStatement(sb.toString());
			pstmt.setString(1, dto.getPasswd());
			pstmt.setString(2, dto.getName());
			pstmt.setString(3, dto.getEmail());
			pstmt.setString(4, dto.getHp());
			pstmt.setString(5, dto.getZipcode());
			pstmt.setString(6, dto.getAddress1());
			pstmt.setString(7, dto.getAddress2());
			pstmt.setString(8, dto.getUserid());
			pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}  finally {
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		
	}//end update()
	
}

 

8. 수정 작업이 끝난 후 페이지 이동(단순 이동 -> 리다이렉트 처리) 한 줄 추가 

package member;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
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("/member_servlet/*")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//uri : 사용자 요청 주소
		String uri = request.getRequestURI();
		//contextpath : 프로젝트 식별자, 이름
		String context = request.getContextPath();
		//memberDAO를 메모리에 올려야한다.
		MemberDAO dao = new MemberDAO();
		
		
		//list.do라는 요청이 들어온다면,
		if(uri.indexOf("list.do")!= -1) {
			//들어온 값을 한번 더 압축 ( ArrayList -> Map으로 한번 더 압축)
			Map<String,Object> map = new HashMap<>();
			List<MemberDTO> list = dao.memberList();//멤버 리스트 호출해서 연결하고 sql처리해서 값을 받아서 dto에 넣고 list에 추가
			map.put("list", list); //Key-value로 map에 넣기
			map.put("count", list.size()); //레코드의 갯수 (회원수) 리턴
			//웹 영역(request)에 저장
			request.setAttribute("map", map);
			//포워딩
			String page="/ch06/member_list.jsp";
			RequestDispatcher rd = request.getRequestDispatcher(page);
			rd.forward(request, response);
			
		}else if(uri.indexOf("join.do")!= -1) {
			//ajax로 들어온 값들을 dto쪽으로 보내줘야 한다.
			String userid=request.getParameter("userid");
			String passwd=request.getParameter("passwd");
			String name=request.getParameter("name");
			String email=request.getParameter("email");
			String hp=request.getParameter("hp");
			String zipcode=request.getParameter("zipcode");
			String address1=request.getParameter("address1");
			String address2=request.getParameter("address2");
			
			MemberDTO dto = new MemberDTO();//DTO생성
			dto.setUserid(userid);//dto의 setter를 통해 자료 저장
			dto.setPasswd(passwd);
			dto.setName(name);
			dto.setEmail(email);
			dto.setHp(hp);
			dto.setZipcode(zipcode);
			dto.setAddress1(address1);
			dto.setAddress2(address2);
			dao.insert(dto);
		}else if(uri.indexOf("view.do")!= -1) {
			String userid=request.getParameter("userid");
			System.out.println("클릭한 아이디:" + userid);
			MemberDTO dto = dao.memberDetail(userid);
			//쿼리문 처리한 상세내용을 dto에 저장
			//웹 영역에 저장
			request.setAttribute("dto", dto);
			//포워딩
			String page="/ch06/member_view.jsp";
			RequestDispatcher rd=request.getRequestDispatcher(page);
			rd.forward(request, response);
		}else if(uri.indexOf("update.do")!= -1) {
			//수정된 값을 받아야 한다.
			String userid=request.getParameter("userid");
			String passwd=request.getParameter("passwd");
			String name=request.getParameter("name");
			String email=request.getParameter("email");
			String hp=request.getParameter("hp");
			String zipcode=request.getParameter("zipcode");
			String address1=request.getParameter("address1");
			String address2=request.getParameter("address2");
			//받아온 값을 dto에 저장하고
			MemberDTO dto = new MemberDTO();//DTO생성
			dto.setUserid(userid);//dto의 setter를 통해 자료 저장
			dto.setPasswd(passwd);
			dto.setName(name);
			dto.setEmail(email);
			dto.setHp(hp);
			dto.setZipcode(zipcode);
			dto.setAddress1(address1);
			dto.setAddress2(address2);
			//레코드 수정 처리는 DAO에서 한다.(데이터베이스에 수정처리)
			dao.update(dto);
			//페이지 이동(리다이렉트)
			response.sendRedirect(context+"/ch06/member.jsp");
		}
		
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

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

}

 

7. 컨트롤러에서 delete 기능 추가

package member;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
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("/member_servlet/*")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//uri : 사용자 요청 주소
		String uri = request.getRequestURI();
		//contextpath : 프로젝트 식별자, 이름
		String context = request.getContextPath();
		//memberDAO를 메모리에 올려야한다.
		MemberDAO dao = new MemberDAO();
		
		
		//list.do라는 요청이 들어온다면,
		if(uri.indexOf("list.do")!= -1) {
			//들어온 값을 한번 더 압축 ( ArrayList -> Map으로 한번 더 압축)
			Map<String,Object> map = new HashMap<>();
			List<MemberDTO> list = dao.memberList();//멤버 리스트 호출해서 연결하고 sql처리해서 값을 받아서 dto에 넣고 list에 추가
			map.put("list", list); //Key-value로 map에 넣기
			map.put("count", list.size()); //레코드의 갯수 (회원수) 리턴
			//웹 영역(request)에 저장
			request.setAttribute("map", map);
			//포워딩
			String page="/ch06/member_list.jsp";
			RequestDispatcher rd = request.getRequestDispatcher(page);
			rd.forward(request, response);
			
		}else if(uri.indexOf("join.do")!= -1) {
			//ajax로 들어온 값들을 dto쪽으로 보내줘야 한다.
			String userid=request.getParameter("userid");
			String passwd=request.getParameter("passwd");
			String name=request.getParameter("name");
			String email=request.getParameter("email");
			String hp=request.getParameter("hp");
			String zipcode=request.getParameter("zipcode");
			String address1=request.getParameter("address1");
			String address2=request.getParameter("address2");
			
			MemberDTO dto = new MemberDTO();//DTO생성
			dto.setUserid(userid);//dto의 setter를 통해 자료 저장
			dto.setPasswd(passwd);
			dto.setName(name);
			dto.setEmail(email);
			dto.setHp(hp);
			dto.setZipcode(zipcode);
			dto.setAddress1(address1);
			dto.setAddress2(address2);
			dao.insert(dto);
		}else if(uri.indexOf("view.do")!= -1) {
			String userid=request.getParameter("userid");
			System.out.println("클릭한 아이디:" + userid);
			MemberDTO dto = dao.memberDetail(userid);
			//쿼리문 처리한 상세내용을 dto에 저장
			//웹 영역에 저장
			request.setAttribute("dto", dto);
			//포워딩
			String page="/ch06/member_view.jsp";
			RequestDispatcher rd=request.getRequestDispatcher(page);
			rd.forward(request, response);
		}else if(uri.indexOf("update.do")!= -1) {
			//수정된 값을 받아야 한다.
			String userid=request.getParameter("userid");
			String passwd=request.getParameter("passwd");
			String name=request.getParameter("name");
			String email=request.getParameter("email");
			String hp=request.getParameter("hp");
			String zipcode=request.getParameter("zipcode");
			String address1=request.getParameter("address1");
			String address2=request.getParameter("address2");
			//받아온 값을 dto에 저장하고
			MemberDTO dto = new MemberDTO();//DTO생성
			dto.setUserid(userid);//dto의 setter를 통해 자료 저장
			dto.setPasswd(passwd);
			dto.setName(name);
			dto.setEmail(email);
			dto.setHp(hp);
			dto.setZipcode(zipcode);
			dto.setAddress1(address1);
			dto.setAddress2(address2);
			//레코드 수정 처리는 DAO에서 한다.(데이터베이스에 수정처리)
			dao.update(dto);
			//페이지 이동(리다이렉트)
			response.sendRedirect(context+"/ch06/member.jsp");
		}else if(uri.indexOf("delete.do")!=-1) {
			String userid=request.getParameter("userid");
			//레코드 삭제 처리
			dao.delete(userid);
			//페이지 이동(리다이렉트)
			response.sendRedirect(context+"/ch06/member.jsp");
		}
		
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

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

}

 

8. dao에서 지우는 작업 

package member;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import config.DB;

public class MemberDAO {
	//List<MemberDTO>타입으로 반환해주는 memberList() 메소드를 생성
	public List<MemberDTO> memberList(){
		//받을 ArrayList를 메모리에 올려야한다.(객체 생성)
		List<MemberDTO> items = new ArrayList<MemberDTO>(); //다형성
		Connection conn=null;//연결 객체
		PreparedStatement pstmt = null;//SQL문 실행 객체
		ResultSet rs = null;//Select문 결과 받아오는 결과셋
		try {
			//DB,네트워크 등 try-catch문 필수
			conn = DB.getConn(); //DB와 연결
			String sql = "select * from member order by name";
			pstmt = conn.prepareStatement(sql);//sql문 담아서 준비시켜주면
			rs = pstmt.executeQuery();//select 전용 메소드
			while(rs.next()) {//다음 값이 있을 때까지
				//여러 줄 가져올 때 while문 
				//가져온 값을 dto에 넣어야하므로, dto 객체 생성
				MemberDTO dto = new MemberDTO();
				//setter를 통해 넣어주기 - rs에 있는 값 넣기
				dto.setUserid(rs.getString("userid"));
				dto.setPasswd(rs.getString("passwd"));
				dto.setName(rs.getString("name"));
				dto.setEmail(rs.getString("email"));
				dto.setHp(rs.getString("hp"));
				dto.setZipcode(rs.getString("zipcode"));
				dto.setAddress1(rs.getString("address1"));
				dto.setAddress2(rs.getString("address2"));
				dto.setJoin_date(rs.getDate("join_date"));
				//ArrayList는 add로 추가 
				items.add(dto);//리스트에 추가
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//리소스 역순으로 닫아주기
			try {
				if(rs!=null) rs.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			
		}
		
		
		return items;//반환
	}//memberList() 
	
	public void insert(MemberDTO dto) {
		//update를 하는 경우는 반환할 필요가 없기 때문에 void
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			conn = DB.getConn();
			//String : 불변, StringBuilder : 가변
			StringBuilder sql = new StringBuilder();
			sql.append(" insert into member ");
			sql.append(" (userid,passwd,name,email,hp,zipcode,address1,address2) values ");
			sql.append(" (?,?,?,?,?,?,?,?) ");
			pstmt = conn.prepareStatement(sql.toString());
			//StringBuilder는 toString으로 String화 해줘야한다.
			//?로 들어온 값 처리(setString,get-)
			pstmt.setString(1,dto.getUserid());
			pstmt.setString(2,dto.getPasswd());
			pstmt.setString(3,dto.getName());
			pstmt.setString(4,dto.getEmail());
			pstmt.setString(5,dto.getHp());
			pstmt.setString(6,dto.getZipcode());
			pstmt.setString(7,dto.getAddress1());
			pstmt.setString(8,dto.getAddress2());
			pstmt.executeUpdate();//select제외한 dml문 처리
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}//insert()
	
	public MemberDTO memberDetail(String userid) {
		MemberDTO dto = null;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = DB.getConn();
			String sql = "select * from member where userid=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userid);//들어온 값을 1번 물음표에 넣어줌
			rs = pstmt.executeQuery();
			if(rs.next()) {
				//한 개만 가져올 때
				//rs의 값을 dto에 넣어주기
				dto = new MemberDTO();
				dto.setUserid(userid);
				dto.setPasswd(rs.getString("passwd"));
				dto.setName(rs.getString("name"));
				dto.setEmail(rs.getString("email"));
				dto.setHp(rs.getString("hp"));
				dto.setZipcode(rs.getString("zipcode"));
				dto.setAddress1(rs.getString("address1"));
				dto.setAddress2(rs.getString("address2"));
				dto.setJoin_date(rs.getDate("join_date"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//리소스 역순으로 닫아주기
			try {
				if(rs!=null) rs.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			
		}
		return dto;
	}//end memberDetail()

	public void update(MemberDTO dto) {
		Connection conn=null;
		PreparedStatement pstmt = null;
		try {
			conn = DB.getConn();
			StringBuilder sb = new StringBuilder();
			sb.append(" update member set ");
			sb.append(" passwd=?, name=?, email=?, hp=?, zipcode=?, address1=?, address2=? ");
			sb.append(" where userid=? ");
			pstmt=conn.prepareStatement(sb.toString());
			pstmt.setString(1, dto.getPasswd());
			pstmt.setString(2, dto.getName());
			pstmt.setString(3, dto.getEmail());
			pstmt.setString(4, dto.getHp());
			pstmt.setString(5, dto.getZipcode());
			pstmt.setString(6, dto.getAddress1());
			pstmt.setString(7, dto.getAddress2());
			pstmt.setString(8, dto.getUserid());
			pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}  finally {
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		
	}//end update()

	public void delete(String userid) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			conn = DB.getConn();
			String sql = "delete from member where userid=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userid);
			pstmt.executeUpdate();
		}  catch (Exception e) {
			e.printStackTrace();
		}  finally {
			try {
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			try {
				if(conn!=null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}//end delete()
	
}

삭제된 이후

'WEB > JSP' 카테고리의 다른 글

쿠키와 세션  (0) 2022.08.03
트랜잭션 처리, 배치 처리  (0) 2022.07.22
Session 객체  (0) 2022.07.18
웹 프로젝트 생성 및 DB연결  (0) 2022.07.17
JSP /SERVLET 개념 정리  (0) 2022.07.17