ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Cookie
    JAVA/웹 프로그래밍 - 서블릿 2020. 11. 2. 21:43

     

    ServletContext와 HttpSession과 달리 

    아래에서 ServletContext와 HttpSession에 대한 내용을 참고해보자.

    designatedroom87.tistory.com/276?category=899787

     

    HttpSession

    HttpSession에 대하여 알아보자. 우선은 ServletContext에 대해 알아보고 오자. designatedroom87.tistory.com/272?category=899787 ServletContext ServletContext의 필요 이유는 값을 기억할 필요가 있을 때 필..

    designatedroom87.tistory.com

    반대로 쿠키는 클라이언트(웹 브라우저)가 저장하는데 생성은 서버가 한다.
    쿠키의 생성은 서버에서 해서 클라이언트에게 던진다.
    클라이언트가 받을지 말지를 결정한다. 쿠키는 배열로 생성해서 배열로 받는다.

    쿠키를 주고 받는 것은 따로 html을 만들 필요가 없다.

    쿠키는 문자열이다. 그래서 문자열로 받아야 한다.
    쿠키 주고 받기는 java파일을 실행하고 개발자 도구에서 확인하면 된다.
    받기는 콘솔창으로 볼 수 있다.

     

    우선 쿠키를 보내보도록 하자.

    서블릿으로 만들기를 하면 된다. 클래스 명은 CookieTest라 한다.

    CookieTest.java 내용

    더보기
    package com.iot.web;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/CookieTest")
    public class CookieTest extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void service(HttpServletRequest request, 
    			HttpServletResponse response) throws ServletException, IOException 
    	{
    		Cookie cookie1=new Cookie("name1","value1");
    		response.addCookie(cookie1);	
    		
    		Cookie cookie2=new Cookie("name2","value2");
    		response.addCookie(cookie2);
    	}
    }

     

    위의 CookieTest.java를 실행하자.

    Chrome 창에서 [도구 더보기]에서 [개발자 도구]를 선택한다.

    그리고 

    위의 탭에서 Network를 선택한다. 그리고 F5를 누른다.

    그리고 하단에 다음과 같이 Console 탭을 선택한다.

    그러면 아래와 같이 CookieTest가 뜬다. 이를 클릭하자.

    그리고, 아래의 그림과 같이 Headers 탭을 선택한다.

    위의 하단에 Set-Cookie가 보일 것이다. 

     

     

     

    그리고 Cookie를 받아보자.

    CookieRecv.java 내용

    더보기
    package com.iot.web;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/CookieRecv")
    public class CookieRecv extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void service(HttpServletRequest request, 
    			HttpServletResponse response) throws ServletException, IOException 
    	{
    		//	클라이언트로부터 쿠키를 받아오기(처음에 쿠키는 없을 수도 있다.)
    		//	쿠키는 배열로 받아야 한다.
    		Cookie[] cookies = request.getCookies();
    		
    		//	쿠키가 있다면 탐색
    		if (cookies != null)
    		{
    			for (Cookie cookie : cookies)
    			{
    				System.out.println(cookie.getName() +" : " + cookie.getValue());
    			}
    		}
    	}
    }

     

    위의 CookieRecv.java를 실행해보자.

    그러면 이번에는 자바 콘솔 창에서 다음과 같이 출력이 된다.

     

     

     

    이번에는 HttpSession으로 만들어진 Add4.java를 Cookie로 변경해보자.

    Add5.java를 만들자.

    연산의 마지막은 "=" 버튼이 클릭이 되었을 때이다.

    그러므로 연산이 끝나면 기존의 수와 연산자를 초기값으로 설정을 해주어야 한다. 

    Add5.java 내용

    더보기
    package com.iot.web;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/Add5")
    public class Add5 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void service(HttpServletRequest request, 
    			HttpServletResponse response) throws ServletException, IOException 
    	{	
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html;charset=UTF-8");
    		PrintWriter out = response.getWriter();
    		
    		String value_= request.getParameter("value");
    		String operator = request.getParameter("operator");
    		
    		int value = 0;
    		if(!value_.equals("")) value=Integer.parseInt(value_);
    		
    		//Cookie cookie=new Cookie("c",value_);
    		//Cookie cookie=new Cookie("c",String.valueOf(value));
    		
    		//	클라이언트로 부터 쿠기 받아오기
    		Cookie[] cookies = request.getCookies();
    		
    		String v = "0";
    		String op = "+";
    		
    		//	클라이언트가 쿠키가 있으면 받아와서 사용 그렇지 않을 경우 생성
    		if(cookies != null) 
    		{ 
    			for(Cookie cookie:cookies) 
    			{
    				if("v".equals(cookie.getName())) v=cookie.getValue();
    				else if("op".equals(cookie.getName())) op=cookie.getValue();
    			}
    		}
    		/*
    		//	쿠키가 없을 경우 처리
    		else 
    		{ 
    			v = "0";
    			op = "+";
    		}
    		*/
    		if(operator.equals("=")) 
    		{
    			//	연산 후 출력(이전 저장되어 있는 오퍼레이트를 가져와 계산)
    			int result = 0;
    			if(op.equals("+")) 
    			{
    				result = Integer.parseInt(v)+value;
    			}
    			else if(op.equals("-")) 
    			{
    				result = Integer.parseInt(v)-value;
    			}
    			
    			//클라이언트가 쿠키가 있으면 받아와서 사용 그렇지 않을 경우 생성
    			if(cookies!=null) 
    			{ 
    				for(Cookie cookie:cookies) 
    				{
    					//	수를 0으로 초기화
    					if("v".equals(cookie.getName())) 
    					{
    						cookie.setValue("0"); 
    						response.addCookie(cookie); 
    						System.out.println(cookie.getValue());
    					}
    					//	초기 연산자인 +로 초기화
    					else if("op".equals(cookie.getName())) 
    					{
    						cookie.setValue("+"); 
    						response.addCookie(cookie);
    					}
    				}
    			}
    			
    			System.out.println(result);
    			out.println("결과 : "+result);
    			/*
    			 * 쿠키 삭제
    			 */
    		}
    		else 
    		{
    			int imsi = 0;
    			//	이전 저장되어 있는 오퍼레이트를 가져와 계산만 하는 작업 그리고 결과를 임시 저장
    			if(op.equals("+")) 
    			{
    				imsi=Integer.parseInt(v)+value;
    				Cookie cookie = new Cookie("v",String.valueOf(imsi));
    				response.addCookie(cookie);
    				
    			}
    			else if(op.equals("-")) 
    			{
    				imsi = Integer.parseInt(v)-value;
    				Cookie cookie = new Cookie("v",String.valueOf(imsi));
    				response.addCookie(cookie);
    			}
    			//	실시간으로 저장소에 저장되는 값을 확인
    			System.out.println(imsi);
    			Cookie cookie = new Cookie("op",operator);
    			response.addCookie(cookie);
    		}
    	}
    }

     

    add5.html 내용

    더보기
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form action="Add5" method="post">
    		<input type="text" name="value">
    		
    	<input type="submit" name="operator" value="+">
    	<input type="submit" name="operator" value="-">
    	<input type="submit" name="operator" value="=">
    	<br>
    		결과 : 0	
    	</form>	
    </body>
    </html>

     

     

    입력 창에 ( 5 + 버튼) (3 - 버튼) (10 = 버튼)을 차례로 입력하면

    자바 콘솔 창에 다음과 같이 출력된다.

     

     

    여기서 우리가 한 가지 불편한 점이 있을 것이다.

    이는 웹 브라우저 창에서 수를 입력하고 연산 버튼을 클릭하면 다시 뒤로 가기로 한 후에

    다시 수를 입력해야 하는 번거로움이 존재했다.

    이는 response 객체의 sendRedirect메소드를 이용해서 쉽게 해결할 수 있다.

    response.sendRedirect("add5.html"); 함수는 아래와 같이 호출한다.

     

    Add5.java 파일 내용

    더보기
    package com.iot.web;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/Add5")
    public class Add5 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void service(HttpServletRequest request, 
    			HttpServletResponse response) throws ServletException, IOException 
    	{	
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html;charset=UTF-8");
    		PrintWriter out = response.getWriter();
    		
    		String value_= request.getParameter("value");
    		String operator = request.getParameter("operator");
    		
    		int value = 0;
    		if(!value_.equals("")) value=Integer.parseInt(value_);
    		
    		//Cookie cookie=new Cookie("c",value_);
    		//Cookie cookie=new Cookie("c",String.valueOf(value));
    		
    		//	클라이언트로 부터 쿠기 받아오기
    		Cookie[] cookies = request.getCookies();
    		
    		String v = "0";
    		String op = "+";
    		
    		//	클라이언트가 쿠키가 있으면 받아와서 사용 그렇지 않을 경우 생성
    		if(cookies != null) 
    		{ 
    			for(Cookie cookie:cookies) 
    			{
    				if("v".equals(cookie.getName())) v=cookie.getValue();
    				else if("op".equals(cookie.getName())) op=cookie.getValue();
    			}
    		}
    		/*
    		//	쿠키가 없을 경우 처리
    		else 
    		{ 
    			v = "0";
    			op = "+";
    		}
    		*/
    		if(operator.equals("=")) 
    		{
    			//	연산 후 출력(이전 저장되어 있는 오퍼레이트를 가져와 계산)
    			int result = 0;
    			if(op.equals("+")) 
    			{
    				result = Integer.parseInt(v)+value;
    			}
    			else if(op.equals("-")) 
    			{
    				result = Integer.parseInt(v)-value;
    			}
    			
    			//클라이언트가 쿠키가 있으면 받아와서 사용 그렇지 않을 경우 생성
    			if(cookies!=null) 
    			{ 
    				for(Cookie cookie:cookies) 
    				{
    					//	수를 0으로 초기화
    					if("v".equals(cookie.getName())) 
    					{
    						cookie.setValue("0"); 
    						response.addCookie(cookie); 
    						System.out.println(cookie.getValue());
    					}
    					//	초기 연산자인 +로 초기화
    					else if("op".equals(cookie.getName())) 
    					{
    						cookie.setValue("+"); 
    						response.addCookie(cookie);
    					}
    				}
    			}
    			
    			System.out.println(result);
    			out.println("결과 : "+result);
    			/*
    			 * 쿠키 삭제
    			 */
    		}
    		else 
    		{
    			int imsi = 0;
    			//	이전 저장되어 있는 오퍼레이트를 가져와 계산만 하는 작업 그리고 결과를 임시 저장
    			if(op.equals("+")) 
    			{
    				imsi=Integer.parseInt(v)+value;
    				Cookie cookie = new Cookie("v",String.valueOf(imsi));
    				response.addCookie(cookie);
    				
    			}
    			else if(op.equals("-")) 
    			{
    				imsi = Integer.parseInt(v)-value;
    				Cookie cookie = new Cookie("v",String.valueOf(imsi));
    				response.addCookie(cookie);
    			}
    			//	실시간으로 저장소에 저장되는 값을 확인
    			System.out.println(imsi);
    			Cookie cookie = new Cookie("op",operator);
    			response.addCookie(cookie);
    			response.sendRedirect("add5.html"); //값과 상관없이 화면 전환
    		}
    	}
    }

     

    add5.html 파일을 실행해보자.

    뒤로 가기를 하지 않아도 해당 페이지에서 수 입력이 가능하다.

     

    쿠키를 지우는 법은 아래와 같다.

    Chrome을 기준으로 설명하면, Chrome창을 하나 띄운다.

    "Chrome 맞춤설정 및 제어"를 선택한다. "설정"을 선택하고 

    "개인 정보 및 보안" 탭을 클릭 하고  "쿠키 및 기타 사이트 데이터" 부분을 선택하고

    "모든 쿠키 및 사이트 데이터 보기" 선택하고 쿠키를 삭제하면 된다.

     

    이번에는 add6.html 파일을 만들어서 아래와 같이 글을 작성하자.

    위의 add5.html과 같은 내용이다.

    add6.html

    더보기
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form action="Add6" method="post">
    		<input type="text" name="value">
    		
    	<input type="submit" name="operator" value="+">
    	<input type="submit" name="operator" value="-">
    	<input type="submit" name="operator" value="=">
    	<br>
    		결과 : 0	
    	</form>	
    </body>
    </html>

     

     

     

    이번에도 Add6.java라는 서블릿 파일을 만든다.

    Add5.java 내용을 그대로 가지고 오는데, response.sendRedirect("add5.html"); 함수에서

    add6으로 수정한다.

    Add6.java 내용

    더보기
    package com.iot.web;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/Add6")
    public class Add6 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void service(HttpServletRequest request, 
    			HttpServletResponse response) throws ServletException, IOException 
    	{
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html;charset=UTF-8");
    		PrintWriter out=response.getWriter();
    		
    		String value_= request.getParameter("value");
    		String operator = request.getParameter("operator");
    		
    		int value=0;
    		if(!value_.equals("")) value=Integer.parseInt(value_);
    		
    		//Cookie cookie=new Cookie("c",value_);
    		//Cookie cookie=new Cookie("c",String.valueOf(value));
    		
    		//클라이언트로 부터 쿠기 받아오기
    		Cookie[] cookies=request.getCookies();
    		
    		String v="0";
    		String op="+";
    		
    		if(cookies!=null) { //클라이언트가 쿠키가 있으면 받아와서 사용 그렇지 않을 경우 생성
    			for(Cookie cookie:cookies) {
    				if("v".equals(cookie.getName())) v=cookie.getValue();
    				else if("op".equals(cookie.getName())) op=cookie.getValue();
    			}
    		}/*else { //쿠키가 없을 경우 처리
    			v="0";
    			op="+";
    		}
    		*/
    		if(operator.equals("=")) 
    		{
    			//연산 후 출력(이전 저장되어 있는 오퍼레이트를 가져와 계산)
    			int result=0;
    			if(op.equals("+")) 
    			{
    				result=Integer.parseInt(v)+value;
    			}
    			else if(op.equals("-")) 
    			{
    				result=Integer.parseInt(v)-value;
    			}
    			
    			//클라이언트가 쿠키가 있으면 받아와서 사용 그렇지 않을 경우 생성
    			if(cookies!=null) 
    			{ 
    				for(Cookie cookie:cookies) 
    				{
    					if("v".equals(cookie.getName())) 
    					{
    						cookie.setValue("0"); 
    						response.addCookie(cookie); 
    						System.out.println(cookie.getValue());
    					}
    					
    					else if("op".equals(cookie.getName())) 
    					{
    						cookie.setValue("+"); 
    						response.addCookie(cookie);
    					}
    				}
    			}
    			
    			System.out.println(result);
    			//	out.println("결과:"+result);
    			
    			//	add6.html 내용을 복사해서 갖고오기 파일 내용 시작
    			out.println("<!DOCTYPE html>");
    			out.println("<html>");
    			out.println("<head>");
    			out.println("<meta charset=\"UTF-8\">");
    			out.println("<title>Insert title here</title>");
    			out.println("</head>");
    			out.println("<body>");
    			out.println("	<form action=\"Add6\" method=\"post\">");
    			out.println("		<input type=\"text\" name=\"value\">");
    					
    			out.println("	<input type=\"submit\" name=\"operator\" value=\"+\">");
    			out.println("	<input type=\"submit\" name=\"operator\" value=\"-\">");
    			out.println("	<input type=\"submit\" name=\"operator\" value=\"=\">");
    			out.println("	<br>");
    			out.println("결과 : "+result);
    			out.println("	</form>	");
    			out.println("</body>");
    			out.println("</html>");
    			//	add6.html 파일 내용 끝
    		}
    		else 
    		{
    			int imsi = 0;
    			//이전 저장되어 있는 오퍼레이트를 가져와 계산만 하는 작업 그리고 결과를 임시 저장
    			if(op.equals("+")) 
    			{
    				imsi=Integer.parseInt(v)+value;
    				Cookie cookie=new Cookie("v",String.valueOf(imsi));
    				response.addCookie(cookie);
    				
    			}
    			else if(op.equals("-")) 
    			{
    				imsi=Integer.parseInt(v)-value;
    				Cookie cookie=new Cookie("v",String.valueOf(imsi));
    				response.addCookie(cookie);
    			}
    			//실시간으로 저장소에 저장되는 값을 확인
    			System.out.println(imsi);
    			//System.out.println("redirect before");
    			Cookie opcookie=new Cookie("op",operator);
    			response.addCookie(opcookie);
    			response.sendRedirect("add6.html"); //값과 상관없이 화면 전환
    			
    		}
    		//Cookie cookie=new Cookie("op",operator);
    		//response.addCookie(cookie);
    		//System.out.println("redirect after");
    	}
    }
    

     

    위의 내용에 추가된 부분이 있다. 이는 아래와 같다.

    위의 추가된 부분은 add6.html의 내용을 그대로 복사해와서 문자열 처리를 했다.

    이와 같이 복사를 한 이유는 결과값을 html로 보고 싶기 때문이다.

    눈으로 보여지는 것이 html처럼 보이게 하기 위함이다.

    add6.html을 실행하고 마지막에 "="버튼을 누르면 Add6.java 파일 서블릿이 작동한다. 

    이 서블릿에서는 자체적으로 결과를 포함하게 된다.

    요청은 html에서 url을 통해 실행된다.

    해당 파일이 웹에 열리면 add6.html 파일은 위치가 웹 컨텐츠에 있어서 따로 url주소가 필요없이 접근가능하다.

    localhost:9090/add6.html 에 접속하는 것과 같다.

    이는 별도의 어노테이션을 쓸 필요없다.

    위와 같은 방식은 작업량이 많다,

    이를 대체할 것이 JSP이다. JSP는 서블릿이다. 그런데 눈에 보이기는 html로 보인다.
    나중에 이를 이용한다.

     

    서블릿에 서블릿으로 정보를 보내서 다른 서블릿에서 정보를 처리하는 방식은 아래에서 한다.

    designatedroom87.tistory.com/280?category=899787

     

    RequestDispatcher

    서블릿과 서블릿 간의 데이터를 이동할 때 필요한 것이 RequestDispatcher 이다. 결과만 계산하고 보여주는 서블릿은 따로 만들어서 이를 처리한다. 기존의 Add6.java에서 출력될 내용을 자

    designatedroom87.tistory.com

     

    'JAVA > 웹 프로그래밍 - 서블릿' 카테고리의 다른 글

    서블릿의 doPost,doGet,Init,sevice 함수  (0) 2020.11.03
    RequestDispatcher  (0) 2020.11.03
    HttpSession  (0) 2020.11.02
    ServletContext  (0) 2020.11.01
    웹 브라우저에서 수의 덧셈을하고 출력하기  (0) 2020.11.01

    댓글

Designed by Tistory.