Daily coding

Servlet : Java에서 데이터 보내는방식 1 ( sendRedirect ) 본문

Front-end/비동기통신

Servlet : Java에서 데이터 보내는방식 1 ( sendRedirect )

sunnnkim 2020. 1. 17. 18:19

web ( client )  <---- 통신 ----> Java ( server )

 

 

 

* web (client) ------> Java (Server)

: 클라이언트에서 데이터를 가지고 자바로 이동할 수 있는 몇가지 방법이 있다 ( 다음에 알아보자 )

  마찬가지로, Java의 servlet에서 다른 곳으로 이동할 수 있는 방법이 존재한다.

  가장 대표적인 2가지 방식은 sendRedirect forward 이다.

  sendRedirect 는 단순 이동시 주로 사용되는 방식이며,

  데이터를 가지고 이동할 수 있으나 코드가 복잡해지기 때문에 데이터를 가지고 이동하기 위해서는

  forward 방식을 사용한다.

  또한, sendRedirect 는 반드시 doGet메소드로 이동하게 되며, Forward 방식은 client의 요청대로 메소드를 수행한다.

 

 

 

1. sendRedirect : 짐 (데이터) 없이 단순 이동일 때 주로 사용

    

    response.sendRedirect("helloServlet");

    // helloServlet 파일은 web.xml 파일에 등록이 되어야 함 ( 또는 @ (name space) 설정하기 )

    

    response.sendRedirect ("index.html");  ====> html파일로 이동

 

    response.sendRedirect ("index.jsp");  ====> jsp파일로 이동

 

    response.sendRedirect (" index.jsp?name='이름' "); 

   

 

* 위와 같은 방법으로 jsp파일로 다양한 데이터를 넘겨줄 수 있다.

   html 파일은 서블릿으로 데이터 패키지를 사용할 수 없으나, jsp, ajax을 이용하여 데이터는 받을 수 있다 

   요즘 추세는 jsp 사용 안함, ajax로 함(Vue, React 등에서 사용)

   jsp에서는    

<% String name = request.getParameter("name"); %>

  이런식으로 데이터를 받아 사용한다 

  (받은 데이터는 모두 String 타입)

 

 

 

< 데이터를 가지고 페이지 이동하기 > 

public class HelloServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 인코딩 설정
		// sendRedirect로 보낼 때 이름 깨지는 것 해결하기
		req.setCharacterEncoding("utf-8");
		
		
		String name = req.getParameter("name");
		String sage = req.getParameter("age");
		int age =0;
		age = Integer.parseInt(sage);
		
		if(sage==null || sage.trim().equals("")) {
			resp.sendRedirect("index.html");
			// 빈문자열 일 때 처리방법,
			// 이렇게 하는 것보다는 html에서 값을 넘겨주기 전에 확인하는 작업을 거친다.
			// 주로 html에서 먼저 작업을 한다
		
		}else {
			age = Integer.parseInt(sage);
		}

		
		String fruits[] = req.getParameterValues("fruits");
		if(fruits == null || fruits.length <= 0 ) {
        	
        	// null이거나 배열 길이가 0보다 같거나 작을때
			// 다시 원래 html 파일로 되돌리기
	        resp.sendRedirect("index.html");
            
		}
		
		String fArr = "";	// 배열 데이터 전송을 위해 문자열에 모두 붙이기
		for (int i = 0; i < fruits.length; i++) {
			fArr = fArr + "&fruits="+ fruits[i];
			System.out.println();
		}
		
		// sendRedirect : 단순 이동시 사용
		resp.sendRedirect("ResultServlet?name="+URLEncoder.encode(name)+"&age="+age+ fArr );
		
		
		
	}

 

< sendRedirect 받는 부분의 Servlet >

	//Get
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("ResultServlet까지 도착");
		
		// 이름 깨지는 것 해결하기
		req.setCharacterEncoding("utf-8");
		
		String name = req.getParameter("name");
		String age = req.getParameter("age");
		String fruits[] = req.getParameterValues("fruits");
		
		resp.setContentType("text/html; charset=UTF-8");
		PrintWriter pw = resp.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<title>제목</title>");
		pw.println("<body>");
		
		pw.println("<p>이름: "+ name +"</p>");
		pw.println("<p>나이: "+ age +"</p>");
		for (int i = 0; i < fruits.length; i++) {
			pw.println("<p>좋아하는 과일: "+ fruits[i] +"</p>");
		}
		pw.println("</body>");
		pw.println("</head>");
		pw.println("</html>");
		pw.close();
	
	}

 

 

 

 

 

* 참고 : sendRedirect 이외의 링크이동시켜주는 함수

- setHeader : 링크걸어줌 Location은 고정 값 
resp.setHeader("Location", "http://www.naver.com");

---> naver 사이트로 이동

- link 를 설정한 경우는 HttpServletResponse 설정을 해주어야 링크로 이동한다 

resp.setStatus ( HttpServletResponse.SC_MOVED_PERMANENTLY );

 

 

 < setHeader >

 

@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// resp.setHeader() : url사용
		
		String url = req.getParameter("url");
		
		
		// link 를 설정한 경우는 HttpServletResponse 설정을 해주어야 링크로 이동한다
		resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
		
		
		// 링크 걸어주기
		if(url.equals("naver.com")) {
			// setHeader : 링크걸어줌 Location은 고정 값 
			resp.setHeader("Location", "http://www.naver.com");
		}
		else if(url.equals("google.com")) {
			resp.setHeader("Location", "http://www.google.com");
		}
		else {
			resp.setHeader("Location", "http://www.zum.com");
		}
		
		
	}