* 본 글은 [뉴렉처]의 Servlet&JSP 프로그래밍 강의를 듣고 정리한 글입니다.
2020 Servlet&JSP 프로그래밍
www.youtube.com
쿠키 삭제하기
계산기에서 C 버튼을 누르면 누적된 값들이 삭제되도록 코드 수정
- 누적된 값들을 삭제하는 것은 사실 쿠키를 삭제하는 것
- 1) [Calc3.java] 사용자가 입력한 값에 따라 로직을 다르게 구현하는 블럭에, C에 대한 로직(쿠키 삭제)을 추가
- C에 대한 로직: 누적된 값을 삭제(쿠키 삭제)
- 연산식 자체를 비워버리면 됨 > 연산을 빈 문자열로 만듦
- exp = “”;
//사용자가 입력한 값이 =이라면 누적된 값을 계산
if(operator != null && operator.equals("=")) {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
exp = String.valueOf(engine.eval(exp));
} catch (ScriptException e) {
e.printStackTrace();
}
}
//사용자가 입력한 값이 C라면 누적된 값 삭제(쿠키 삭제)
else if(operator != null && operator.equals("C")) {
exp = "";
}
//사용자가 입력한 값이 value, operator, dot이라면 누적
else {
exp += (value == null) ? "" : value;
exp += (operator == null) ? "" : operator;
exp += (dot == null) ? "" : dot
}
- 결과: 쿠키가 정상적으로 삭제되지 않음
- 연산식을 만들어 C 버튼 클릭
- 정상적으로 작동되었다면 입력창에 0이 떠야 하지만, 아무것도 안 뜸
- [CalcPage.java] 누적된 값이 없다면 입력창에 0을 띄우는 코드가 있음
- String exp = “0”;
- [CalcPage.java] 누적된 값이 없다면 입력창에 0을 띄우는 코드가 있음
- 개발자 도구>Response Headers 확인
- 전달된 쿠키가 없어야 하는데, 서버에서 클라이언트로 ‘exp= ‘라는 쿠키가 전달됨
- [Calc3.java] 쿠키 객체를 생성할 때 만료날짜를 0으로 설정
- 만료날짜가 0이라는 의미: 브라우저를 끄지 않아도 쿠키가 소멸될 수 있음
- 만료날짜를 따로 설정하지 않으면 브라우저를 꺼야 쿠키가 삭제됨
- 사용자가 입력한 값이 C일 때만 연산식 쿠키의 만료날짜를 0으로 설정
- C 버튼을 누르면 누적된 값들이 브라우저로 가서 바로 소멸됨 (쿠키가 남지 않고 삭제됨)
- if(operator != null && operator.equals("C")) {
expCookie.setMaxAge(0);
}
- 만료날짜가 0이라는 의미: 브라우저를 끄지 않아도 쿠키가 소멸될 수 있음
//쿠키에에서 값을 읽어와 사용자가 입력한 값에 덧붙인 값을 쿠키로 저장
Cookie expCookie = new Cookie("exp", exp);
// 브라우저를 끄지 않아도 C 버튼을 누르면 쿠키가 삭제됨
if(operator != null && operator.equals("C")) {
expCookie.setMaxAge(0);
}
//서버에서 클라이언트로 exp의 쿠키 보내기
response.addCookie(expCookie);
//계산기에서 버튼을 클릭하면 빈 화면이 출력되지 않고 CalcPage.java의 화면이 출력됨
response.sendRedirect("calcpage");
계산기에서 C 버튼을 누르면 누적된 값들이 삭제되도록 코드를 수정한 결과
- 연산식을 만들어 C 버튼 클릭
- 정상적으로 0이 출력됨 (쿠키가 삭제됨)
- 개발자 도구>Response Headers 확인
- 전달된 쿠키가 없음
완성된 코드
- 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;
@WebServlet("/calc3")
public class Calc3 extends HttpServlet {
@Override
protected void service(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException
{
Cookie[] cookies = request.getCookies();
//사용자가 입력한 값들을 받는 문자열
String value = request.getParameter("value");
String operator = request.getParameter("operator");
String dot = request.getParameter("dot");
//쿠키에서 값을 읽어와 사용자가 입력한 값에 덧붙임
String exp = "";
if(cookies != null) {
for(Cookie c : cookies) {
if(c.getName().equals("exp")) {
exp = c.getValue();
break;
}
}
}
//사용자가 입력한 값이 =이라면 계산을 위한 로직 구현
if(operator != null && operator.equals("=")) {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
exp = String.valueOf(engine.eval(exp));
} catch (ScriptException e) {
e.printStackTrace();
}
}
//사용자가 입력한 값이 value, operator, dot이라면 누적
else {
exp += (value == null) ? "" : value;
exp += (operator == null) ? "" : operator;
exp += (dot == null) ? "" : dot;
}
//사용자가 입력한 값이 C라면 누적된 값 삭제(쿠키 삭제)
else if(operator != null && operator.equals("C")) {
exp = "";
}
//쿠키에에서 값을 읽어와 사용자가 입력한 값에 덧붙인 값을 쿠키로 저장
Cookie expCookie = new Cookie("exp", exp);
// 브라우저를 끄지 않아도 C 버튼을 누르면 쿠키가 삭제됨
if(operator != null && operator.equals("C")) {
expCookie.setMaxAge(0);
}
response.addCookie(expCookie);
response.sendRedirect("calcpage");
}
}
- CalcPage.java
package com.newlecture.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;
@WebServlet("/calcpage")
public class CalcPage extends HttpServlet {
@Override
protected void service(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException
{
Cookie[] cookies = request.getCookies();
String exp = "0";
if(cookies != null) {
for(Cookie c : cookies) {
if(c.getName().equals("exp")) {
exp = c.getValue();
break;
}
}
}
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.write("<!DOCTYPE html>");
out.write("<html>");
out.write(" <head>");
out.write(" <meta charset=\\"UTF-8\\">");
out.write(" <title>계산기 웹 프로그램</title>");
out.write(" <style>");
out.write(" input{");
out.write(" width: 50px;");
out.write(" height: 50px;");
out.write(" }");
out.write(" .output{");
out.write(" height: 50px;");
out.write(" background: #e9e9e9;");
out.write(" font-size: 24px;");
out.write(" font-weight: bold;");
out.write(" text-align: right;");
out.write(" padding: 0px 5px;");
out.write(" }");
out.write(" </style>");
out.write(" </head>");
out.write(" <body>");
out.write(" <form action=\\"calc3\\" method=\\"post\\">");
out.write(" <table>");
out.write(" <tr>");
out.printf(" <td class = \\"output\\" colspan=\\"4\\">%s</td>", exp);
out.write(" </tr>");
out.write(" <tr>");
out.write(" <td><input type=\\"submit\\" name=\\"operator\\" value=\\"CE\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"operator\\" value=\\"C\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"operator\\" value=\\"BS\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"operator\\" value=\\"÷\\"></td>");
out.write(" </tr>");
out.write(" <tr>");
out.write(" <td><input type=\\"submit\\" name=\\"value\\" value=\\"7\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"value\\" value=\\"8\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"value\\" value=\\"9\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"operator\\" value=\\"x\\"></td>");
out.write(" </tr>");
out.write(" <tr>");
out.write(" <td><input type=\\"submit\\" name=\\"value\\" value=\\"4\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"value\\" value=\\"5\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"value\\" value=\\"6\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"operator\\" value=\\"-\\"></td>");
out.write(" </tr>");
out.write(" <tr>");
out.write(" <td><input type=\\"submit\\" name=\\"value\\" value=\\"1\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"value\\" value=\\"2\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"value\\" value=\\"3\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"operator\\" value=\\"+\\"></td>");
out.write(" </tr>");
out.write(" <tr>");
out.write(" <td></td>");
out.write(" <td><input type=\\"submit\\" name=\\"value\\" value=\\"0\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"dot\\" value=\\".\\"></td>");
out.write(" <td><input type=\\"submit\\" name=\\"operator\\" value=\\"=\\"></td>");
out.write(" </tr>");
out.write(" </table>");
out.write(" </form>");
out.write(" </body>");
out.write("</html>");
}
}
'☕ Java 웹 프로그래밍 > Servlet & JSP' 카테고리의 다른 글
[Servlet&JSP] 계산기 프로그램을 서블릿 하나로 합치기 (0) | 2023.06.05 |
---|---|
[Servlet&JSP] GET과 POST에 특화된 service( )메소드 (0) | 2023.06.04 |
[Servlet&JSP] 계산기 서블릿 완성하기 (0) | 2023.06.03 |
[Servlet&JSP] 처음이자 마지막으로 동적인 페이지를 서블릿으로 직접 만들기 (0) | 2023.06.02 |
[Servlet&JSP] 동적인 페이지(서버 페이지)의 필요성 (0) | 2023.06.02 |