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 |