본문 바로가기

Programming/국비학원

220926 - 서블릿 -커넥션 풀, 서블릿 확장 API (포워드 / 바인딩)

  • 회원가입 (커넥션 풀)
  • MemberServlet
package servletdb.ex04;

import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/member4")
public class MemberServlet extends HttpServlet {

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

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

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		//가입 버튼 클릭 시 db에 추가하기, 알림창 생성
		response.setContentType("text/html;charset=utf-8");
		MemberDAO dao = new MemberDAO(); //서버에 연결돼있으므로 db 연결 따로 X
		PrintWriter out = response.getWriter();
		
		String command = request.getParameter("command");
		if (command!=null && command.equals("addMember")){
			String _id = request.getParameter("id"); //_변수는 클라이언트에게 받아온 값
			String _pwd = request.getParameter("pwd");
			String _name = request.getParameter("name");
			String _email = request.getParameter("email");	
			
			MemberVO vo = new MemberVO(); //한명의 회원 정보로 저장, db에 넘김
			vo.setId(_id);
			vo.setPwd(_pwd);
			vo.setName(_name);
			vo.setEmail(_email);
			
			dao.addMember(vo);
			out.print("회원가입이 완료되었습니다");
		}
		
		List list = dao.listMembers(); //<MemberVO>로 선언시 하단 for문에서 바로 list.get(i).getID 가능
		
		out.print("<html><body>");
		out.print("<table border=1>");
		out.print("<tr align='center' bgcolor='azure'>");
		out.print("<th>아이디</th><th>비밀번호</th><th>이름</th><th>이메일</th><th>가입일자</th>");
		out.print("</tr>");
		
		for (int i=0;i<list.size();i++) { //i번째 vo객체
			MemberVO memberVO = (MemberVO) list.get(i);
			
			out.print("<tr>");
			out.print("<td>"+memberVO.getId()+"</td><td>"+memberVO.getPwd()+"</td><td>"+
			memberVO.getName()+"</td><td>"+memberVO.getEmail()+"</td><td>"+memberVO.getJoindate()+"</td>");
			out.print("</tr>");
		}
		out.print("</table>");
		out.print("<a href='/servletdb/memberForm.html'>새 회원 등록하기</a>");
		out.print("</body></html");

	}
    
}

 

 

 

  • MemberDAO
package servletdb.ex04;

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

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

public class MemberDAO {

	private Connection con; 
	private PreparedStatement pstmt; 
	private DataSource dataFactory; //
	
	public MemberDAO() { //
		try {
			Context ctx = new InitialContext();
			Context envContext = (Context)ctx.lookup("java:/comp/env");
			dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
		} catch(Exception e) {
			System.out.println("DB 연결 실패");
		}
	}
	
	//회원정보 목록
	public List<MemberVO> listMembers(){
		
		List<MemberVO> list = new ArrayList<MemberVO>();
		try {
			con = dataFactory.getConnection(); //
			String query = "select * from member_list";
			pstmt = con.prepareStatement(query);
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()) {
				String id = rs.getString("id");
				String pwd = rs.getString("pwd");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date joinDate = rs.getDate("joindate");
				
				MemberVO vo = new MemberVO();
				vo.setId(id);
				vo.setPwd(pwd);
				vo.setName(name);
				vo.setEmail(email);
				vo.setJoindate(joinDate);
				
				list.add(vo);
			}
			rs.close();
			pstmt.close();
			con.close();
		} catch(Exception e) {
			System.out.println("자료 처리 중 에러 발생");
		}
		return list;
		
	}
	
	public void addMember(MemberVO memberVO) {
		try {
			con = dataFactory.getConnection();
			
			String id = memberVO.getId();
			String pwd = memberVO.getPwd();
			String name = memberVO.getName();
			String email = memberVO.getEmail();
			
			String query = "insert into member_list(id, pwd, name, email) values(?,?,?,?)";
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, id);
			pstmt.setString(2, pwd);
			pstmt.setString(3, name);
			pstmt.setString(4, email);
			pstmt.executeUpdate();
			pstmt.close();
		} catch(Exception e) {
			System.out.println("회원 추가 중 에러 발생");
		}
	}
	
}

 

 

※ Connection.prepareStatement()

 

=> 메소드 수행 시 쿼리가 메모리에 저장되므로 parse는 최초 한번만 수행됨 (효율적)

 

String query = "insert into member_list(id, pwd, name, email) values(?,?,?,?)"; //쿼리문
Statement pstmt = con.prepareStatement(query); //SQL문 DB에 전송 (데이터 없음)
pstmt.setString(1, id); //첫번째 데이터 바인딩
~
ptsmt.executeUpdate(); //SQL문 실행

 

 

 

 

  • 회원 삭제
  • MemberServlet
package servletdb.ex04;

import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/member4")
public class MemberServlet extends HttpServlet {

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

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

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		MemberDAO dao = new MemberDAO(); 
		PrintWriter out = response.getWriter();
		
		String command = request.getParameter("command");
		if (command!=null && command.equals("addMember")){
			String _id = request.getParameter("id"); 
			String _pwd = request.getParameter("pwd");
			String _name = request.getParameter("name");
			String _email = request.getParameter("email");	
			
			MemberVO vo = new MemberVO(); 
			vo.setId(_id);
			vo.setPwd(_pwd);
			vo.setName(_name);
			vo.setEmail(_email);
			
			dao.addMember(vo); //회원리스트에 추가
		//회원 가입창에서 전송된 command 값이 delMember => ID를 가져와 SQL문으로 전달해서 삭제
		} else if (command != null && command.equals("delMember")) {
			String id = request.getParameter("id");  ////
			dao.delMember(id);  ////
		}
		
		List list = dao.listMembers();
		
		out.print("<html><body>");
		out.print("<table border=1>");
		out.print("<tr align='center' bgcolor='azure'>");
		out.print("<th>아이디</th><th>비밀번호</th><th>이름</th><th>이메일</th><th>가입일자</th><th>삭제</th>");
		out.print("</tr>");
		
		for (int i=0;i<list.size();i++) { //i번째 vo객체
			MemberVO memberVO = (MemberVO) list.get(i);
			
			out.print("<tr>");
			out.print("<td>"+memberVO.getId()+"</td><td>"+memberVO.getPwd()+"</td><td>"+
			memberVO.getName()+"</td><td>"+memberVO.getEmail()+"</td><td>"+memberVO.getJoindate()+"</td>");
			out.print("<td><a href='/servletdb/member4?command=delMember&id="+ memberVO.getId() +"'>삭제</a></td>"); ////삭제를 클릭하면 command 값과 회원 ID를 서블릿으로 전송 ////
			out.print("</tr>");
		}
		out.print("</table>");
		out.print("<a href='/servletdb/memberForm.html'>새 회원 등록하기</a>"); 
		out.print("</body></html");

	}
    
}

 

 

 

  • MemberDAO
package servletdb.ex04;

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

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

public class MemberDAO {

	private Connection con; 
	private PreparedStatement pstmt; 
	private DataSource dataFactory; 
	
	public MemberDAO() { 
		try {
			Context ctx = new InitialContext();
			Context envContext = (Context)ctx.lookup("java:/comp/env");
			dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
		} catch(Exception e) {
			System.out.println("DB 연결 실패");
		}
	}
	
	//회원정보 목록
	public List<MemberVO> listMembers(){
		
		List<MemberVO> list = new ArrayList<MemberVO>();
		try {
			con = dataFactory.getConnection(); 
			String query = "select * from member_list";
			pstmt = con.prepareStatement(query);
			ResultSet rs = pstmt.executeQuery(); 
			while(rs.next()) {
				String id = rs.getString("id");
				String pwd = rs.getString("pwd");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date joinDate = rs.getDate("joindate");
				
				MemberVO vo = new MemberVO();
				vo.setId(id);
				vo.setPwd(pwd);
				vo.setName(name);
				vo.setEmail(email);
				vo.setJoindate(joinDate);
				
				list.add(vo);
			}
			rs.close();
			pstmt.close();
			con.close();
		} catch(Exception e) {
			System.out.println("자료 처리 중 에러 발생");
		}
		return list;
		
	}
	
	public void addMember(MemberVO memberVO) {
		try {
			con = dataFactory.getConnection();
			
			String id = memberVO.getId();
			String pwd = memberVO.getPwd();
			String name = memberVO.getName();
			String email = memberVO.getEmail();
			
			String query = "insert into member_list(id, pwd, name, email) values(?,?,?,?)";
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, id);
			pstmt.setString(2, pwd);
			pstmt.setString(3, name);
			pstmt.setString(4, email);
			pstmt.executeUpdate();
			pstmt.close();
		} catch(Exception e) {
			System.out.println("회원 추가 중 에러 발생");
		}
	}
	
	public void delMember(String id) { ////
		try {
			con = dataFactory.getConnection();
			String query = "delete from member_list where id=?";
			pstmt = con.prepareStatement(query);
			pstmt.setString(1,id);
			pstmt.executeUpdate();
			pstmt.close();
		} catch(Exception e) {
			System.out.println("삭제 중 에러 발생");
		}
	}
	
}

 

 

 

 

서블릿 포워드

: 하나의 서블릿에서 다른 서블릿/JSP와 연동

 

 

 

  • 포워드 방법

1. redirect 
 - HttpServletResponse 객체의 sendRedirect() 메서드 이용
 - 웹 브라우저에 재요청하는 방식
 - 형식 : sendRedirect("포워드할 서블릿 또는 JSP")
(클라이언트의 웹브라우저에서 첫번째 서블릿에 요청 전달
-> 첫번째 서블릿은 sendRedirect() 통해 두번째 서블릿을 웹브라우저에 요청
-> 웹브라우저는 두번째 서블릿에 다시 요청 전달)

2. refresh
 - HttpServletResponse 객체의 addHeader() 메서드 이용
 - 웹브라우저에 재요청하는 방식
 - 형식: response.addHeader("Refresh", "경과시간(초); url=요청할 서블릿 또는 jsp")

3. location
 - 자바스크립트 location 객체의 href 속성을 이용
 - 자바스크립트에서 재요청하는 방식
 - 형식: location.href='요청할 서블릿 또는 jsp'

4. dispatch
 - 일반적으로 포워딩기능을 지칭
 - 서블릿이 다른 서블릿에 직접 요청하는 방법
 - RequestDispatcher 클래스의 forward() 메서드를 이용합니다.
 - 서블릿의 이동이 있더라도 url의 변경이 일어나지 않음
 - 형식: RequestDispatcher dis = request.getRequestDispatcher("포워드할 서블릿 또는 jsp");
           dis.forward(request,response);

 
1,2,3은 서블릿(=>요청)이 웹브라우저를 거쳐 다른 서블릿이나 jsp에게 요청하는 방식
=> 웹브라우저를 거치기 때문에 url의 변경이 일어난다.

4는 서블릿에서 바로 다른 서블릿에 요청하는 방법
=> 서블릿의 이동이 있더라도 url의 변경이 일어나지 않음
    ex) /first 서블릿에서 /second 서블릿으로 이동해도 localhost:8080/first로 보인다.

 

 

 

 

  • redirect
  •  
@WebServlet("/first")
public class FirstServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		response.sendRedirect("second"); //second 서블릿 재요청
	}

}


@WebServlet("/second")
public class SecondServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<html><body>");
		out.print("<h2>sendRedirect를 이용한 포워딩 실습</h2>");
		out.print("</body></html>");
	}

}

 

 

 

  •  
@WebServlet("/first")
public class FirstServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		response.sendRedirect("second?name=hong"); ////
	}

}


@WebServlet("/second")
public class SecondServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<html><body>");
		out.print("<h2>"+name+"님 환영합니다</h2>"); ////
		out.print("</body></html>");
	}

}

 

//

hong님 환영합니다

 

 

 

 

  • refresh
  •  
@WebServlet("/first2")
public class FirstServlet2 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		response.addHeader("Refresh","1;url=second2"); ////
	}

}


@WebServlet("/second2")
public class SecondServlet2 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<html><body>");
		out.print("<h2>refresh를 이용한 포워딩 실습</h2>");
		out.print("</body></html>");
	}

}

 

 

 

 

  • location
  •  
@WebServlet("/first3")
public class FirstServlet2 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<script type='text/javascript'>"); //
		out.print("location.href='second3';"); ////
		out.print("</script>");
	}

}


@WebServlet("/second3")
public class SecondServlet2 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<html><body>");
		out.print("<h2>location을 이용한 포워딩 실습</h2>");
		out.print("</body></html>");
	}

}

 

 

 

 

  • dispatch
  •  
@WebServlet("/first4")
public class FirstServlet4 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		RequestDispatcher dispatcher = request.getRequestDispatcher("second4"); ////
		dispatcher.forward(request, response); ////
	}

}


@WebServlet("/second4")
public class SecondServlet4 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<html><body>");
		out.print("<h2>dispatch를 이용한 포워딩 실습</h2>");
		out.print("</body></html>");
	}

}

 

=>  http://localhost:8080/servletAPI/first4  이동해도 주소 그대로 유지됨

 

 

 

 

=> 대량의 데이터를 공유하거나 전달할 때 포워드보다 바인딩 (서블릿 -> 다른 서블릿/jsp)

서블릿 바인딩

: 웹 프로그램 실행 시 데이터를 서블릿 관련 객체에 저장하는 방법

 

 

 

  • redirect 통한 바인딩 (실패)
  •  
@WebServlet("/bind")
public class FirstServletBind extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		request.setAttribute("address", "서울시 종로구"); ////
		response.sendRedirect("secondBind"); //
	}

}


@WebServlet("/secondBind")
public class SecondServletBind extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String address = (String)request.getAttribute("address"); ////
		out.print("<html><body>");
		out.print("<h3>주소는 "+address+"입니다</h3>"); ////
		out.print("redirect를 이용한 포워딩 시 바인딩하는 실습");
		out.print("</body></html>");
	}

}

//
주소는 null입니다 
redirect를 이용한 포워딩 시 바인딩하는 실습

 

 

=> /secondBind 이동은 하지만 데이터 바인딩 실패
=> 1,2,3 방법으로는 바인딩 불가
=> 웹 브라우저를 거치면서 객체가 다른 객체가 되어 돌아옴

(처음 요청 때 받은 객체 & 다시 웹 브라우저를 거쳐 요청하는 객체 => 서로 다른 객체)

 

 

 

 

  • dispatch 통한 바인딩 (성공)
@WebServlet("/bind2")
public class FirstServletBind2 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		request.setAttribute("address", "서울시 종로구"); ////
		RequestDispatcher dispatcher = request.getRequestDispatcher("secondBind2"); ////
		dispatcher.forward(request, response); ////
	}

}


@WebServlet("/secondBind2")
public class SecondServletBind2 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String address = (String)request.getAttribute("address"); ////
		out.print("<html><body>");
		out.print("<h3>주소는 "+address+"입니다</h3>"); ///
		out.print("dispatch를 이용한 포워딩 시 바인딩하는 실습");
		out.print("</body></html>");
	}

}

//

주소는 서울시 종로구입니다
dispatch를 이용한 포워딩 시 바인딩하는 실습

 

 

 

 

  • 두 서블릿 간 회원정보 조회 바인딩

주 기능 / 화면 출력 서블릿 분리

 

 

 

  • MemberVO, MemberDAO 복붙

 

 

  • MemberServlet
@WebServlet("/member5")
public class MemberServlet extends HttpServlet {

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

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

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		MemberDAO dao = new MemberDAO(); 
		PrintWriter out = response.getWriter();
		
		String command = request.getParameter("command");
		if (command!=null && command.equals("addMember")){
			String _id = request.getParameter("id"); 
			String _pwd = request.getParameter("pwd");
			String _name = request.getParameter("name");
			String _email = request.getParameter("email");	
			
			MemberVO vo = new MemberVO(); 
			vo.setId(_id);
			vo.setPwd(_pwd);
			vo.setName(_name);
			vo.setEmail(_email);
			
			dao.addMember(vo); 
		} else if (command != null && command.equals("delMember")) {
			String id = request.getParameter("id"); //누른 행의 id값 받아옴 
			dao.delMember(id); //id값 일치하는 회원을 회원리스트에서 삭제 
		}
		List memberList = dao.listMembers();
		request.setAttribute("memberList", memberList);  //모든 회원정보를 객체 변수에 저장해 (Hashmap 구조)
        
        //viewMembers(다른 서블릿)에 전달 
		RequestDispatcher dis = request.getRequestDispatcher("viewMembers"); 
		dis.forward(request, response); 
	}
    
}

 

 

 

  • ViewServlet
@WebServlet("/viewMembers")
public class ViewServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		PrintWriter out = response.getWriter();
		
		List memberList = (List) request.getAttribute("memberList");
        	//MemberServlet에서 setAttribute()로 받은 HashMap 타입 객체 List로 변환해 받아옴
		
		out.print("<html><body>");
		out.print("<table border=1>");
		out.print("<tr align='center' bgcolor='azure'>");
		out.print("<th>아이디</th><th>비밀번호</th><th>이름</th><th>이메일</th><th>가입일자</th><th>삭제</th>");
		out.print("</tr>");
		
		for (int i=0;i<memberList.size();i++) { 
			MemberVO memberVO = (MemberVO) memberList.get(i);
			
			out.print("<tr>");
			out.print("<td>"+memberVO.getId()+"</td><td>"+memberVO.getPwd()+"</td><td>"+
			memberVO.getName()+"</td><td>"+memberVO.getEmail()+"</td><td>"+memberVO.getJoindate()+"</td>");
			out.print("<td><a href='/servletdb/member4?command=delMember&id="+ memberVO.getId() +"'>삭제</a></td>"); ////
			out.print("</tr>");
		}
		out.print("</table>");
		out.print("<a href='/servletdb/memberForm.html'>새 회원 등록하기</a>"); 
		out.print("</body></html");
	}

}

 

=> http://localhost:8080/servletAPI/member5 

 

화면 출력은 viewMembers에서 실행되지만 dispatch이므로 주소 유지됨

 

 

 

 

 

 

 

 

※ ctrl shift O => import 자동 수정