ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 8. 서블릿 API 사용하기2
    개발자 수업/JSP 2021. 12. 2. 12:50

    1. 바인딩(binding)이란?
        1) 웹 프로그램 실행시 자원(데이터)를 서블릿 관련 객체에 저장하는 방법
        2) HttpServletRequest, HttpSession, ServletContext 객체에서 사용
        3) 저장된 자원은 프로그램 실행시 서블릿이나 JSP에서 공유해서 사용

    2. 서블릿 객체에서 사용되는 바인딩 관련 메서드
        1) setAttribute(String name, Object obj)
            - 자원(데이터)을 각 객체에 바인딩함
        2) getAttribute(String name)
            - 각 객체에 바인딩된 자원(데이터)을 name으로 가져옴
        3) removeAttrubute(String name)
            - 각 객체에 바인딩된 자원(데이터)을 name으로 제거함

    3. HttpServletRequest를 이용한 redirect 포워딩시 바인딩
        - 브라우저에서 요청할 때 서블릿에 전달되는 첫 번째 request는 웹 브라우저를 통해 재요청되는 두 번째 request와 다른 요청임
            -> redirect 방식으로는 서블릿에서 바인딩한 데이터를 다른 서블릿으로 전송할 수 없음

    package kr.co.ezenac.bind;
    
    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("/first6")
    public class FirstServlet extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		
    		//웹 브라우저에서 요청한 request 객체 address의 값으로 "서울시 강남구"를 바인딩함
    		request.setAttribute("address", "서울시 강남구");
    		response.sendRedirect("second6");	//두 번째 서블릿으로 전달하기 위해 호출
    	}
    }
    package kr.co.ezenac.bind;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    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("/second6")
    public class SecondServlet extends HttpServlet{
    	
    	@Override
    	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();
    		
    		//전달된 request에서 getArritube()를 이용해 address값을 가져옴
    		String address = (String)request.getAttribute("address");
    		out.println("<html><body>");
    		out.println("주소 : " + address);
    		out.println("<br>");
    		out.println("redirect를 이용한 바인딩 테스트입니다.");
    		out.println("</body></html>");
    	}
    }


    4. HttpServletRequest를 이용한 dispatch 포워딩시 바인딩
        - 첫 번째 서블릿에서 두 번째 서블릿으로 전달되는 request가 브라우저를 거치지 않고 바로 전달됨
            -> 첫 번째 서블릿의 request에 바인딩된 데이터가 그대로 전달됨

    package kr.co.ezenac.bind02;
    
    import java.io.IOException;
    
    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("/first7")
    public class FirstServlet extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		
    		//웹 브라우저에서 요청한 request 객체 address의 값으로 "서울시 강남구"를 바인딩함
    		request.setAttribute("address", "서울시 강남구");
    		
    		// 바인딩된 request를 다시 두 번째 서블릿으로 포워딩함
    		RequestDispatcher dispatcher = request.getRequestDispatcher("second7");
    		dispatcher.forward(request, response);
    		
    	}
    }
    package kr.co.ezenac.bind02;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    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("/second7")
    public class SecondServlet extends HttpServlet{
    	
    	@Override
    	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();
    		
    		//전달된 request에서 getArritube()를 이용해 address값을 가져옴
    		String address = (String)request.getAttribute("address");
    		out.println("<html><body>");
    		out.println("주소 : " + address);
    		out.println("<br>");
    		out.println("dispatch를 이용한 바인딩 테스트입니다.");
    		out.println("</body></html>");
    	}
    }



    5. 두 서블릿 간 회원 정보 조회 바인딩 테스트

            1) ViewServlet 클래스는 웹 브라우저에서 화면 기능 담당
                -> 서블릿이 발전된 것이 JSP임

    //DAO
    
    package kr.co.ezenac.bind03;
    
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;
    
    public class MemberDAO {
    	
    	private Connection conn;
    	private PreparedStatement pstmt;
    	private DataSource dataFactory;
    	
    	public MemberDAO() {
    		try {
    			Context ctx = new InitialContext();
    			Context envContext = (Context)ctx.lookup("java:/comp/env");		//JNDI에 접근하기 위해 기본경로를 지정
    			//톰캣 context.xml에 설정한 name 값인 jdbc/oracle을 이용해 톰캣이 미리 연결한 DataSource를 받아옴
    			dataFactory = (DataSource)envContext.lookup("jdbc/oracle");		
    		} catch (NamingException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public List<MemberVO> listMembers() {
    		List<MemberVO> list = new ArrayList<MemberVO>();
    		
    		try {
    			conn = dataFactory.getConnection();	//DataSource를 이용해 DB에 연결함
    			
    			String query = "SELECT * FROM T_MEMBER";
    			System.out.println(query);
    			
    			pstmt = conn.prepareStatement(query);	//prepareStatement()메서드에 SQL문을 전달해 객체 생성함
    			ResultSet rs = pstmt.executeQuery();	//미리 설정한 SQL문을 실행함
    			
    			while(rs.next()) {
    				String id = rs.getString("id");
    				String pwd = rs.getString("pwd");
    				String name = rs.getString("name");
    				String email = rs.getString("email");
    				Date joinDate = rs.getDate("joinDate");	//조회한 레코드의 각 컬럼 값을 받아옴
    				
    				MemberVO vo = new MemberVO();
    				vo.setId(id);
    				vo.setPwd(pwd);
    				vo.setName(name);
    				vo.setEmail(email);
    				vo.setJoinDate(joinDate);				//각 컬럼 값을 다시 MemberVO 객체의 속성에 설정함
    				
    				list.add(vo);							//설정된 MemberVO 객체를 다시 ArrayList에 저장함
    			}
    			
    			rs.close();
    			pstmt.close();
    			conn.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    		return list;				//조회한 레코드의 개수만큼 MemberVO 객체를 저장한 ArrayList를 반환함
    	}
    	
    	public void addMember(MemberVO memberVO) {
    		try {
    			conn = dataFactory.getConnection();		// DataSource를 이용해 DB 연결
    			
    			String id = memberVO.getId();			// 테이블에 저장할 회원 정보 받아옴
    			String pwd = memberVO.getPwd();
    			String name = memberVO.getName();
    			String email = memberVO.getEmail();
    			
    			String query = "insert into t_member (id, pwd, name, email) values (?, ?, ?, ?)";
    			System.out.println("prepareStatement: " + query);
    			
    			pstmt = conn.prepareStatement(query);
    			
    			pstmt.setString(1, id);					//insert문의 ?에 순서대로 회원 정보 세팅
    			pstmt.setString(2, pwd);
    			pstmt.setString(3, name);
    			pstmt.setString(4, email);
    			
    			pstmt.executeUpdate();
    			pstmt.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void delMember(String id) {
    		try {
    			conn = dataFactory.getConnection();
    			
    			String query = "DELETE FROM T_MEMBER tm WHERE ID = ?";
    			System.out.println("prepareStatement : " + query);
    			
    			pstmt = conn.prepareStatement(query);
    			pstmt.setString(1, id);		//첫 번째 '?'에 전달된 ID를 인자로 넣음
    			pstmt.executeUpdate();		//delete문 실행 -> 테이블에서 해당 ID 회원 정보 삭제
    			pstmt.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    }
    //VO
    package kr.co.ezenac.bind03;
    
    import java.sql.Date;
    
    /*
     	id 			varchar2(10)	PRIMARY KEY,
    	pwd			varchar2(10)	NOT NULL,
    	name		varchar2(50),
    	email		varchar2(50),
    	joinDate	DATE			DEFAULT sysdate
     */
    
    public class MemberVO {
    	private String id;
    	private String pwd;
    	private String name;
    	private String email;
    	private Date joinDate;
    	
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getPwd() {
    		return pwd;
    	}
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public Date getJoinDate() {
    		return joinDate;
    	}
    	public void setJoinDate(Date joinDate) {
    		this.joinDate = joinDate;
    	}
    }
    package kr.co.ezenac.bind03;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;
    
    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")
    public class MemberServlet extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doHandle(request, response);
    		
    		
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doHandle(request, response);
    		
    	}
    	
    	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		MemberDAO dao = new MemberDAO();
    		List<MemberVO> membersList = dao.listMembers();
    		
    		//조회된 회원 정보를 ArrayList 객체에 저장한 후 request에 바인딩함
    		request.setAttribute("membersList", membersList);
    		
    		//바인딩한 request를 viewMembers 서블릿으로 포워딩함
    		RequestDispatcher dispatch = request.getRequestDispatcher("viewMembers");
    		dispatch.forward(request, response);
    	}
    }
    package kr.co.ezenac.bind03;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.Date;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/viewMembers")
    public class ViewServlet extends HttpServlet{
    
    	@Override
    	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();
    		
    		//바인딩해서 넘어온 request에서 회원 정보를 가져옴
    		List<MemberVO> membersList = (List)request.getAttribute("membersList");
    		
    		out.print("<html><body>");
    		out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
    		out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td><td>삭제</td></tr>");
    		
    		for(int i=0; i<membersList.size(); i++) {
    			MemberVO memberVO = membersList.get(i);			//조회한 회원 정보를 for문 <tr>태그 이용해 출력함
    			String id = memberVO.getId();
    			String pwd = memberVO.getPwd();
    			String name = memberVO.getName();
    			String email = memberVO.getEmail();
    			Date joinDate = memberVO.getJoinDate();
    			out.print("<tr><td>" + id + "</td><td>"
    								 + pwd + "</td><td>"
    								 + name + "</td><td>"
    								 + email + "</td><td>"
    								 + joinDate + "</td><td>"
    								 	//삭제 클릭하면 command 값과 회원 ID를 서블릿으로 전송함
    								 + "<a href='/chap03_Servlet/member3?command=delMember&id="+id+" '>삭제</a></td></tr>");
    		}
    		
    		out.print("</table>");
    		
    		out.print("<a href='/chap03_Servlet/memberForm.html'>새 회원 등록하기</a>");
    		
    		out.print("</body></html>");
    	}
    }

     

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

    10. ServletConfig  (0) 2021.12.03
    9. ServletContext  (0) 2021.12.02
    7. 서블릿 API 사용하기  (0) 2021.11.27
    6. 회원정보 등록, 삭제하기  (0) 2021.11.27
    5. JDBC 연동과 관련객체  (0) 2021.11.27

    댓글