티스토리 뷰

반응형

계산기는 대충 완성되었다. 물론, Backspace나 CE 같은건 모르겠고, 일단 Clear는 만들어줘야지?
Clear 하는 방법: 쿠키를 없앤다!

//Calc3.java
package com.newlecture.web;

import java.io.IOException;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
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;

//import jdk.internal.org.jline.reader.ScriptEngine;

@WebServlet("/calc3")
public class Calc3 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				
		Cookie[] cookies = request.getCookies(); //쿠키를 배열로 읽어온다
				
		String number = request.getParameter("number");
		String operator = request.getParameter("operator");
		String dot = request.getParameter("dot");
		
		String result = "";
				
		if(cookies != null)	//브라우저에서 null을 아무 값도 안 줄경우 조건문
			for(Cookie c : cookies)	//쿠키변수 c를 선언, c를 하나씩 돌면서 쿠키의 개수만큼 반복
				if(c.getName().equals("result")) {	//쿠키의 값이 result와 같은 조건문
					result = c.getValue();	//result에 쿠키 값을 저장
					break;
				}
		
		if(operator != null && operator.equals("=")) {	//조건문, opartor이 null이 아니고, =인 경우
			/* ScriptEngine으로 구현 */
			ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
			try {
				result = String.valueOf(engine.eval(result));
			} catch (ScriptException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		ㅊ
		else if(operator != null && operator.equals("C")) {	//조건문, opartor이 null이 아니고, C인 경우 빈문자열 반환
			result = "";
		}
		
		
			
		
		else {
			result += (number == null)?"":number;	//조건문, number가 null이면 빈문자열, null아니면 number 누적
			result += (operator == null)?"":operator;	//조건문, operator가 null이면 빈문자열, null아니면 operator 누적
			result += (dot == null)?"":dot;	//조건문, dot이 null이면 빈문자열, null아니면 dot 누적
		}
	
		Cookie resultCookie = new Cookie("result", result);	//resultCookie 생성, 생성되는 **위치가 중요!! 쿠키를 저장하기 바로전에 생성하자
		/*쿠키를 비우기 */
		if(operator != null && operator.equals("C"))
			resultCookie.setMaxAge(0);	//MaxAge가 0이면 바로 쿠키를 없앤다.
		response.addCookie(resultCookie);		
		response.sendRedirect("/calcpage"); //calcpage로 이동, 경로가 같음.
			
		
		
		}
	}
	


전체코드에서 어렵지 않게 몇줄만 추가해주면 된다.

else if(operator != null && operator.equals("C")) {	//조건문, opartor이 null이 아니고, C인 경우 빈문자열 반환
			result = "";
		}

조건문을 추가한다. 위의 operaor가 "=" 를 찾는 조건문을 그대로 복사해서 "C"로 변경해준다.
여기서 그리고 result값을 ""빈 문자열로 반환하면 끝!? 
하지만 출력은 문제 없이? 된다. 
사실 출력창에는 C누르면 0이 코드 상 0이 오는게 정상이다. 그게 Cookie 값이 없다는 말이니깐.
간단하게 코드를 보면 String result = "0" 이라게 cookies가 없다는 비어있다는 말이다.
그러면 화면을 확인해보자!

	/*calcpage.java 일부*/

	Cookie[] cookies = request.getCookies(); //쿠키를 cookies 배열로 저장
		
		String result = "0";
		if(cookies != null)	//브라우저에서 null을 아무 값도 안 줄경우 조건문
			for(Cookie c : cookies)	//쿠키변수를 선언하고 쿠키의 개수만큼 반복
				if(c.getName().equals("result")) {	//쿠키의 값이 result와 같은 조건문
					result = c.getValue();	//result에 쿠키 값을 저장
					break;
				}

 그렇다면 어떻게 구현해야 할까?
cookie를 비워주면 된다! 쿠키 clear함수가 따로 있을까????

/* calc3.java  일부 */
Cookie resultCookie = new Cookie("result", result);	//resultCookie 생성, 생성되는 **위치가 중요!! 쿠키를 저장하기 바로전에 생성하자
		/*쿠키를 비우기 */
		if(operator != null && operator.equals("C"))
			resultCookie.setMaxAge(0);	//MaxAge가 0이면 바로 쿠키를 없앤다.
		response.addCookie(resultCookie);		
		response.sendRedirect("/calcpage"); //calcpage로 이동, 경로가 같음.

센스있는 사람들은 기억할지도 모른다. setMaxAge() 함수를!
나는 기억이 안났지만 보고,,, 오 맞네? 이런생각이 들었다.
자~ C가 들어왔을때 조건문 처리를 해주고 MaxAge를 0으로 해주면?
쿠키를 안살려준다는 말 = 쿠키 Clear!
 자 이렇게 구현하고 나면 

C버튼 후 쿠키 없음 확인

분명 C를 눌렀는데 아무리 찾아봐도 쿠키가 없네!? :) 완벽하군.

반응형
댓글
공지사항