728x90
쿠키
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
<form action="calc" method="post">
<div>
<label>계산할 값을 입력하세요.</label>
</div>
<div>
<input type="text" name="v">
</div>
<div>
<input type="submit" name="button" value="+">
<input type="submit" name="button" value="-">
<input type="submit" name="button" value="=">
</div>
</form>
</div>
</body>
</html>
package com.jsp.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("/calc")
public class Calc extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
// 사용자가 보낸 쿠키 읽기
Cookie[] cookies = request.getCookies();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
String v_ = request.getParameter("v");
String op = request.getParameter("button");
int v = 0;
if(!v_.equals("")) {
v = Integer.parseInt(v_);
}
// 계산
if(op.equals("=")) {
int x = 0;
for(Cookie c : cookies) {
if(c.getName().equals("value")) {
// getValue는 string형인데 정수형으로 바꿔줘야하기 때문에 Integer 사용
x = Integer.parseInt(c.getValue());
break;
}
}
// 지금 사용자가 전달한 value 값
int y = v;
String operator="";
for(Cookie c : cookies) {
if(c.getName().equals("op")) {
operator = c.getValue();
break;
}
}
int result = 0;
if(operator.equals("+")) {
result=x+y;
}else {
result=x-y;
}
PrintWriter out = response.getWriter();
out.printf("계산 결과는 %d\n입니다.", result);
// 값을 저장
}else {
// 쿠키 값으로 보낼 수 있는 것은 url에서 사용할 수 있는 문자형임 -> 쿠키 생성
Cookie valueCookie = new Cookie("value",String.valueOf(v));
Cookie opCookie = new Cookie("op",op);
// 쿠키가 사용될 때 그 url과 관련된 서블릿에게만 값이 전달될 수 있도록 함
// 즉, 쿠키가 어느 경우에 사용자로부터 전달되어야 하는지에 대한 경로를 말함
// ex) /특정 디렉토리 및 경로/
// 클래스명이 아니라 url명이므로 Calc가 아닌 calc
valueCookie.setPath("/calc");
opCookie.setPath("/calc");
// 설정한 시간 이후로는 쿠키가 만료
// 브라우저가 닫히거나 클라이언트 컴퓨터가 꺼져도 시간 전까지는 쿠키가 살아있어야 함
// 만료 시간을 정하지 않은 opCookie는 브라우저가 닫히면 쿠키가 사라짐
valueCookie.setMaxAge(60*60*24);
// 클라이언트에게 쿠키 보내기
response.addCookie(valueCookie);
response.addCookie(opCookie);
}
}
}
쿠키로 보낼 수 있는 값은 문자형만 가능하다.
서블릿마다 쿠키가 다르기 때문에 어떤 범위의 서블릿을 실행할 때
특정 쿠키를 가져가게 하는 경로를 setPath()로 설정한다.
그리고 setMaxAge()를 설정하면 브라우저가 닫혀도 그 기간 내에는 쿠키가 유지될 수 있다.
Application, Session, Cookie의 차이점
Application
사용 범위 : 전역 범위에서 사용하는 저장 공간
생명 주기 : WAS가 시작해서 종료할 때까지
저장 위치 : WAS 서버의 메모리
Session
사용 범위 : 세션 범위에서 사용하는 저장 공간(특정 사용자만 사용할 수 있는 공간)
생명 주기 : 세션이 시작해서 종료할 때까지
저장 위치 : WAS 서버의 메모리
Cookie - 서버 자원을 빌리지 않기 때문에 서버에 부담을 주지 않음
사용 범위 : Web Browser별 지정한 path 범위 공간(특정 url에서만 데이터를 사용할 때 쿠키 사용)
생명 주기 : Browser에 전달한 시간부터 만료 시간까지
저장 위치 : Web Browser의 메모리 또는 파일
→ 기간을 오래 가져가려고 한다면 Cookie에 저장해야 한다.
→ Session을 사용할 때 브라우저를 닫는다면 Session ID라는 쿠키가 사라진다.
그때 새로운 브라우저를 열면 Session ID가 달라진다.(새로운 Session ID를 부여받는다는 것)
즉, 매번 새로운 Session ID값의 저장소를 만들게 된다면 서버 자원을 낭비하는 것이기 때문에
Cookie를 사용한다.
서버에서 페이지 전환해주기(redirection)
// -- 생략 --
}else {
// -- 생략 --
// 사용자에게 백지를 돌려주지 않기 위해 사용
response.sendRedirect("calc.html");
}
728x90
'강의 정리하기 > JSP와 Servlet' 카테고리의 다른 글
Jasper와 다양한 JSP 태그들 (0) | 2023.07.06 |
---|---|
Service 함수의 GET 메소드와 POST 메소드 (0) | 2023.07.03 |
상태 유지를 위한 방법 (0) | 2023.03.27 |
예제 (0) | 2023.03.27 |
GET , POST 요청과 필터 (0) | 2023.03.19 |