ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7. 서블릿 API 사용하기
    개발자 수업/JSP 2021. 11. 27. 21:27

    1. 서블릿 포워드 기능
        1) 하나의 서블릿에서 다른 서블릿 혹은 JSP와 연동하는 방법

    2. 포워드 기능의 용도
        1) 요청(request)에 대한 추가 작업을 다른 서블릿에게 수행하게 함
        2) 요청(request)에 포함된 정보를 다른 서블릿 혹은 JSP와 공유함
        3) 요청(request)에 정보를 포함시켜 다른 서블릿에 전달할 수 있음

    3. 서블릿 포워드 방법
        1) redirect를 이용한 포워딩
            - HttpServletResponse 객체의 sendRedirect() 메서드를 이용
            - 웹 브라우저에 재요청하는 방식
            - 형식 : sendRedirect("포워드할 서블릿 or JSP");

    package kr.co.ezenac.redirect;
    
    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("/first")
    public class FirstServlet extends HttpServlet {
    	@Override
    	protected void doGet(HttpServletRequest reqeust, HttpServletResponse response) throws ServletException, IOException {
    		
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		response.sendRedirect("second");	//웹 브라우저에게 다른 서블릿인 second로 재요청함
    	}
    }
    package kr.co.ezenac.redirect;
    
    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("/second")
    public class SecondServlet extends HttpServlet {
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		out.println("<html><body>");
    		out.println("sendRedirect를 이용한 redirect 실행");
    		out.println("</body></html>");
    	}
    }


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

    package kr.co.ezenac.redirect02;
    
    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("/first2")
    public class FirstServlet extends HttpServlet {
    	@Override
    	protected void doGet(HttpServletRequest reqeust, HttpServletResponse response) throws ServletException, IOException {
    		
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		response.addHeader("Refresh", "1;url=second2");	//웹 브라우저에게 1초 후 서블릿인 second2로 재요청함
    	}
    }
    package kr.co.ezenac.redirect02;
    
    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("/second2")
    public class SecondServlet extends HttpServlet {
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		out.println("<html><body>");
    		out.println("refresh를 이용한 redirect 실행");
    		out.println("</body></html>");
    	}
    }

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

    package kr.co.ezenac.location;
    
    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("/first3")
    public class FirstServlet extends HttpServlet{
    	
    	@Override
    	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>");
    	}
    }
    package kr.co.ezenac.location;
    
    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("/second3")
    public class SecondServlet extends HttpServlet {
    	
    	@Override
    	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("location을 이용한 redirect 테스트입니다.");
    		out.print("</body></html>");
    	}
    }


        4) 위의 1~3 redirect 방식으로 다른 서블릿에 데이터 전달하기

    package kr.co.ezenac.redirectData;
    
    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("/first4")
    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");
    		PrintWriter out = response.getWriter();
    		response.sendRedirect("second4?name=lee");	//Get 방식 이용해 이름/값 쌍으로 데이터를 다른 서블릿으로 전달함
    	}
    }
    package kr.co.ezenac.redirectData;
    
    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("/second4")
    public class SecondServlet extends HttpServlet {
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		String name = request.getParameter("name");		//name으로 이전 서블릿에서 전달된 lee를 받음
    		
    		out.println("<html><body>");
    		out.print("이름 : " + name);
    		out.print("<br>");
    		out.println("</body></html>");
    	}
    }


        5) dispatch 방법
            - 일반적으로 포워딩 기능을 지칭
            - 서블릿이 직접 요청하는 방법
            - RequestDispatcher 클래스의 forward() 메서드 이용
            - 형식) RequestDispatcher dis = request.getRequestDispatcher("포워드 할 서블릿 or JSP");
                    dis.forward(request, responce);
            - 모델2나 스프링 프레임워크에서 포워딩시 사용
            - 웹 브라우저 주소 창의 URL이 변경되지 않고 그대로임
                - 서블릿의 포워드가 서버에서 수행되었기 때문임

    package kr.co.ezenac.dispatch;
    
    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("/first5")
    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");
    		
    		//dispatcher 방법을 이용해 second로 전달함
    		RequestDispatcher dispatcher = request.getRequestDispatcher("second5?name=lee2");
    		dispatcher.forward(request, response);
    	}
    }
    package kr.co.ezenac.dispatch;
    
    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("/second5")
    public class SecondServlet extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		String name = request.getParameter("name");		//다른 서블릿에서 전달된 데이터를 가져옴
    		out.println("<html><body>");
    		out.println("이름 : " + name);
    		out.println("<br>");
    		out.println("dispatch를 이용한 forward 테스트입니다.");
    		out.println("</body></html>");
    	}
    }

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

    9. ServletContext  (0) 2021.12.02
    8. 서블릿 API 사용하기2  (0) 2021.12.02
    6. 회원정보 등록, 삭제하기  (0) 2021.11.27
    5. JDBC 연동과 관련객체  (0) 2021.11.27
    4. 서블릿 비즈니스 로직 추가  (0) 2021.11.25

    댓글