이제 진짜 웹 서버와 연결해 볼 차례
HTTP 통신은 2가지의 특징이 있어요.
⚫ 비연결지향
클라이언트의 요청에 대한 서버의 응답이 처리되면 둘의 연결은 끊어지게 되는데요. 불필요한 커네션으로 인한 리소스의 낭비가 생기지 않도록 비연결을 지향해요.
⚫ 상태없음
클라이언트와 서버의 커넥션이 끊어지면 클라이언트의 상태, 정보 등을 유지하지 않아요.
하지만, 클라이언트의 상태를 알아야 할 경우(예: 인증, 로그인 유지 등)가 생기기 때문에 상태를 유지할 필요가 생겼어요.
그때 application, session, cookie를 사용해요.
session.setAttribute("설정한 세션아이디", 세션에 넣을 값);
session.setMaxInactiveInterval(60*60); // 60분동안 세션 유지
session.setMaxInactiveInterval(-1); // 세션의 시간을 무한대로 설정
session.getAttribute("설정한 세션아이디");
session.removeAttribute("설정한 세션아이디");
session.invalidate(); // 세션 전체 제거, 무효화
-> 저장위치 : 클라이언트(=접속자 pc)
-> 저장형식 : text
-> 만료시점 : 쿠키 저장시 설정(브라우저가 종료되도, 만료시점이 지나지 않으면 자동 삭제가 안됌)
-> 용량제한 : 하나의 도메인당 20개
-> 속도 : 세션보다는 빠름
-> 보안 : 세션보다는 안좋다
-> 저장위치 : 해당 브라우저
-> 저장형식 : Object
-> 만료시점 : 브라우저 종료시 삭제(기간 지정은 가능)
-> 용량제한 : 서버가 허용하는 한 용량제한 없음
-> 속도 : 쿠키보다는 느림
-> 보안 : 쿠키보다 좋다
아래 파일의 결과를 각각 application, session, cookie로 구현해보자.
(application의 액션은 calc2 / session의 액션은 calc3 / cookie의 액션은 calc4)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="calc2~4" method="post">
<div>
<label>입력 : </label>
<input type="text" name="value">
</div>
<div>
<input type="submit" name="operator" value="+">
<input type="submit" name="operator" value="-">
<input type="submit" name="operator" value="=">
</div>
</form>
</body>
</html>
10
package com.koreait.web.servlet;
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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/calc2")
public class MyServlet2 extends HttpServlet{
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// application 저장소 선언
ServletContext application = arg0.getServletContext();
PrintWriter out = arg1.getWriter();
String value_ = arg0.getParameter("value");
String op = arg0.getParameter("operator");
int value = 0;
if(!value_.equals("")) {
value = Integer.parseInt(value_);
}
// 계산
if(op.equals("=")) {
int x = (int) application.getAttribute("value");
int y = value;
String operator = (String) application.getAttribute("op");
int result = 0;
if(operator.equals("+")) { // 더하기 결과
result = x + y;
}else { // 빼기 결과
result = x - y;
}
out.println("결과 값 : " + result);
}else{ // + or - => application 영역에 값을 저장
application.setAttribute("value", value);
application.setAttribute("op", op);
}
}
}
package com.koreait.web.servlet;
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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/calc3")
public class MyServlet3 extends HttpServlet{
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// session 객체
HttpSession session = arg0.getSession();
PrintWriter out = arg1.getWriter();
String value_ = arg0.getParameter("value");
String op = arg0.getParameter("operator");
int value = 0;
if(!value_.equals("")) {
value = Integer.parseInt(value_);
}
// 계산
if(op.equals("=")) {
int x = (int) session.getAttribute("value");
int y = value;
String operator = (String) session.getAttribute("op");
int result = 0;
if(operator.equals("+")) { // 더하기 결과
result = x + y;
}else { // 빼기 결과
result = x - y;
}
out.println("결과 값 : " + result);
}else{ // + or - => application 영역에 값을 저장
session.setAttribute("value", value);
session.setAttribute("op", op);
}
}
}
package com.koreait.web.servlet;
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("/calc4")
public class MyServlet4 extends HttpServlet{
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// session 객체
// HttpSession session = arg0.getSession();
// cookie
Cookie[] cookies = arg0.getCookies();
PrintWriter out = arg1.getWriter();
String value_ = arg0.getParameter("value");
String op = arg0.getParameter("operator");
int value = 0;
if(!value_.equals("")) {
value = Integer.parseInt(value_);
}
// 계산
if(op.equals("=")) {
System.out.println(" = 조건 도착 ");
int y = value;
int x = 0;
// cookies 꺼내기
// for문 방식
// cookie는 배열로 값이 담겨있기 때문에 배열로 꺼내온다.
// Cookie c = cookies[0];
// if( c.getName().equals("value")) {
// x = Integer.parseInt(c.getValue());
// }
// forEach 방식
for(Cookie c : cookies) {
if(c.getName().equals("value")) {
x = Integer.parseInt(c.getValue());
break; // 조건에 맞으면 for문을 끝냄
}
}
String operator = "";
for(Cookie c : cookies) {
if(c.getName().equals("op")) {
operator = c.getValue();
break; // 조건에 맞으면 for문을 끝냄
}
}
int result = 0;
if(operator.equals("+")) { // 더하기 결과
result = x + y;
}else { // 빼기 결과
result = x - y;
}
out.println("결과 값 : " + result);
}else{
System.out.println(" else 조건 도착 ");
// cookie로 저장
Cookie valueCookie = new Cookie("value", String.valueOf(value));
Cookie opCookie = new Cookie("op", op);
// 사용자에게 cookie가 전달된다.
arg1.addCookie(valueCookie);
arg1.addCookie(opCookie);
arg1.sendRedirect("calc4.html");
}
}
}
출처
https://media.giphy.com/media/dwmNhd5H7YAz6/giphy.gif
https://media.giphy.com/media/3o6Mb9EC7mNqXl9x7y/giphy.gif