https://codeofenow.tistory.com/32
https://coco-log.tistory.com/40
ServletContext 클래스
1. 서블릿 간 자원(데이터) 공유하는 데 사용 
2. 컨테이너 실행 시 생성되며 컨테이너 종료 시 소멸
- 서블릿 간 자원 공유
- SetServletContext
@WebServlet("/setC")
public class SetServletContext extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		ServletContext context = getServletContext(); //ServletContext 객체 가져와 변수에 저장
		List member = new ArrayList();
		member.add("홍길동");
		member.add(50);
		context.setAttribute("member", member); //데이터 세팅
		out.print("<html><body>");
		out.print("member 자원 공유");
		out.print("</body></html>");
	}
}
- GetServletContext
@WebServlet("/getC")
public class GetServletContext extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		ServletContext context = getServletContext();
		List member = (ArrayList) context.getAttribute("member"); //세팅한 데이터 가져옴
		String name = (String) member.get(0);
		int age = (Integer) member.get(1);
		out.print("<html><body>");
		out.print("<p>이름 : "+name+"</p>");
		out.print("<p>나이 : "+age+"</p>");
		out.print("</body></html>");
	}
}
- 매개변수 설정 기능
=> 프로그램 시작, 초기화 시 가져와 사용
=> 공통 메뉴를 화면에 출력
- web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>servletAPI</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  <context-param> ////컨테이너 안에서 사용할 변수 선언
  	<param-name>menu_member</param-name>
  	<param-value>회원등록 회원조회 회원수정</param-value>
  </context-param>
  <context-param>
  	<param-name>menu_order</param-name>
  	<param-value>주문조회 주문등록 주문수정 주문취소</param-value>
  </context-param>
  <context-param>
  	<param-name>menu_goods</param-name>
  	<param-value>상품조회 상품등록 상품수정 상품삭제</param-value>
  </context-param>    
</web-app>
- ContextParamServlet
@WebServlet("/initMenu")
public class ContextParamServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		ServletContext context = getServletContext();
		String m_member = context.getInitParameter("menu_member"); //컨테이너에 초기선언된 변수 가져옴
		String m_order = context.getInitParameter("menu_order");
		String m_goods = context.getInitParameter("menu_goods");
		out.print("<html><body>");
		out.print("<ul><li>"+m_member+"</li><li>"+m_order+"</li><li>"+m_goods+"</li></ul>");
		out.print("</body></html>");
	}
}
https://mycool0905.github.io/web/java/servlet/jsp/2020/07/12/servlet-extended-API.html
- 파일 입출력 기능
=> 공통 메뉴를 화면에 출력
- /WEB-INF/menu/initMenu.txt
회원등록 회원조회 회원수정, 주문조회 주문등록 주문수정 주문취소, 상품조회 상품등록 상품수정 상품삭제
- ContextFileServlet
@WebServlet("/cFile")
public class ContextFileServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		ServletContext context = getServletContext(); //ServletContext 객체 사용 위해 가져옴
		
		InputStream inputS = context.getResourceAsStream("/WEB-INF/menu/initMenu.txt");
		//getResourceAsStream : 지정한 경로에 있는 자원 읽을 수 있는 InputStream 객체 리턴
		BufferedReader br = new BufferedReader(new InputStreamReader(inputS));
		
		String menu=null;
		String m_member=null;
		String m_order=null;
		String m_goods=null;
		
		while((menu=br.readLine()) != null) { //menu(inputS) 값 없어질 때까지 while문 실행
			StringTokenizer st = new StringTokenizer(menu,","); //쉼표로 문자열 나눔
			m_member = st.nextToken();
			m_order = st.nextToken();
			m_goods = st.nextToken();
		}
		
		out.print("<html><body>");
		out.print("<ul><li>"+m_member+"</li><li>"+m_order+"</li><li>"+m_goods+"</li></ul>");
		out.print("</body></html>");	}
}
https://mycool0905.github.io/web/java/servlet/jsp/2020/09/22/cookie-and-session.html
쿠키 & 세션
- 웹페이지 연동 방법 (세션 트래킹)
1. hidden 태그
HTML의 hidden 태그를 이용해 웹 페이지들 사이의 정보 공유
2. URL Rewriting
GET 방식으로 URL 뒤에 정보를 붙여서 다른 페이지로 전송
3. 쿠키
클라이언트 PC의 Cookie 파일에 정보를 저장한 후 웹페이지들이 공유
4. 세션
서버 메모리에 정보를 저장한 후 웹페이지들이 공유
- 쿠키
웹페이지들 간 공유된 정보를 클라이언트 PC에 저장 
-> 필요할 때 여러 웹페이지들이 공유, 사용하도록 매개 역할함
저장용량 제한 있음 (4kb) 
보안 취약 
클라이언트 브라우저에서 사용 유무를 설정함 
도메인 당 쿠키 만들어짐 (웹사이트 당 하나의 쿠키)
- 종류
1. Persistence 쿠키 
생성위치: 파일로 생성 
종료시기: 쿠키를 삭제하거나 쿠키 설정 값이 종료된 경우 
최초 접속 시 전송 여부: 최초 접속 시 서버로 전송 
용도: 로그인 유무 또는 팝업창을 제한할 때 
2. Session 쿠키 
생성위치: 브라우저 메모리에 생성 
종료시기: 브라우저를 종료한 경우 
최초 접속 시 전송 여부: 최초 접속 시 서버로 전송 X 
용도: 사이트 접속 시 Session 인증 정보를 유지할 때(Session 기능과 같이 사용)
- 쿠키 실행 과정
1 클라이언트 => 브라우저로 사이트 접속 
2 서버 => 사이트 정보 저장된 쿠키 생성, 브라우저로 전송 
3 브라우저 => 받은 쿠키 정보를 쿠키 파일에 저장 
4 클라이언트 브라우저 재접속 => 서버가 브라우저에 쿠키 전송 요청 & 브라우저는 쿠키 정보를 서버에 전달 
5 서버 => 쿠키 정보 이용해 작업 수행
- Cookie 클래스 메소드
getComment() : 쿠키에 대한 설명 가져옴 
getDomain() : 쿠키의 유효한 도메인 정보 가져옴 
getMaxAge() : 쿠키 유효 기간 가져옴 
getName() : 쿠키 이름 가져옴 
getPath() : 쿠키의 디렉터리 정보 가져옴 
getValue() : 쿠키의 설정 값 가져옴 
setComment(String) : 쿠키에 대한 설명 설정 
setDomain(String) : 쿠키의 유효한 도메인 설정 
setMaxAge(int) : 쿠키 유효 기간 설정 
setValue(String) : 쿠키 값 설정
- 로그인 (hidden 태그)
- login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 창</title>
</head>
<body>
	<form action="login" method="post" name="formLogin">
		<label for="user_id">아이디 : </label>
		<input type="text" id="user_id" name="user_id">
		<label for="user_pw">비밀번호 : </label>
		<input type="text" id="user_pw" name="user_pw">
		<input type="hidden" name="phone" value="010-1111-2222">
		<input type="hidden" name="address" value="서울시 종로구">
		<input type="submit" value="로그인">
		<input type="reset" value="다시 입력">
	</form>
</body>
</html>
- LoginServlet
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		String phone = request.getParameter("phone");
		String address = request.getParameter("address");
		
		out.print("<html><body>안녕하세요 "+id+"님<br>");
		out.print("로그인 성공하셨습니다.<br>");
		out.print("<br>로그인 정보<br>");
		out.print("아이디 : "+id);
		out.print("<br>비밀번호 : "+pw);
		out.print("<br>전화번호 : "+phone);
		out.print("<br>주소 : "+address+"</body></html>");
		
	}
}// 
안녕하세요 bb님 
로그인 성공하셨습니다. 
로그인 정보 
아이디 : bb 
비밀번호 : cc 
전화번호 : 010-1111-2222 
주소 : 서울시 종로구
- 로그인 (url)
- login.html 재사용 (action 수정)
- LoginServlet2
@WebServlet("/login2")
public class LoginServlet2 extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		String phone = request.getParameter("phone");
		String address = request.getParameter("address");
		
		out.print("<html><body>안녕하세요 "+id+"님<br>");
		out.print("로그인 성공하셨습니다.<br>");
		out.print("<br>로그인 정보<br>");
		out.print("아이디 : "+id);
		out.print("<br>비밀번호 : "+pw);
		out.print("<br>전화번호 : "+phone);
		out.print("<br>주소 : "+address);
		address=URLEncoder.encode(address,"utf-8"); //한글이므로 따로 인코딩
		out.print("<br><a href='/servletLink/second?id="+id+"&pw="
		+pw+"&address="+address+"'>두번째 서블릿으로 보내기</a>"); //? => get 방식 데이터 전송 
		out.print("<br></body></html>");
		
	}
}
※ url get 전송 방식 
매핑이름?이름=값&이름2=값2&...
- SecondServlet
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String id = request.getParameter("id"); //LoginServlet에서 get방식으로 넘어온 id의 값 받음
		String pw = request.getParameter("pw");
		String address = request.getParameter("address");
		
		out.print("<html><body>");
		if (id != null && id.length() != 0) {
			out.print("<p>로그인 성공</p>");
			out.print("<p>첫번째 서블릿에서 넘겨준 아이디 : "+id+"</p>");
			out.print("<p>첫번째 서블릿에서 넘겨준 비밀번호 : "+pw+"</p>");
			out.print("<p>첫번째 서블릿에서 넘겨준 주소 : "+address+"</p>");
		} else {
			out.print("<p>로그인하지 않았습니다</p>");
			out.print("<p>다시 로그인하세요</p>");
			out.print("<a href='/servletLink/login.html'>로그인하기</a>");
		}
		out.print("</body></html>");
		
	}
}
- 로그인 (쿠키)
- SetCookie
@WebServlet("/setC")
public class SetCookie extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		Date d = new Date();
		Cookie c = new Cookie("cookieTest",URLEncoder.encode("오늘은 화요일","utf-8"));
		//Cookie(쿠키 이름, 저장될 내용)
		//일반적 쿠키 => Persistence 쿠키
		c.setMaxAge(24*60*60); //쿠키 유효기간 (초 기준) => 하루
		response.addCookie(c); //쿠키를 브라우저로 전송
		out.print("현재 시간 : "+d);
		out.print("<br>문자열을 Cookie에 저장");
	}
}
※ @WebServlet 어노테이션이 중복인 프로젝트가 하나만 서버 접속돼있으면 정상 작동
- GetCookie
@WebServlet("/getC")
public class GetCookie extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		Cookie[] allValues = request.getCookies(); //쿠키는 배열로 전달됨
		
		for (int i=0;i<allValues.length;i++) {
			if(allValues[i].getName().equals("cookieTest")) { //쿠키 이름 확인
				out.print("<h2>쿠키 값 => "+
			URLDecoder.decode(allValues[i].getValue(),"utf-8")
				+"</h2>");
			}
		}
	}
}// 
쿠키 값 => 오늘은 화요일 
F12 - Application - Cookies 확인
=> Expiration 다음날로 설정돼있음
=> 창 닫고 다시 켜도 쿠키 유지됨
- 로그인 (Session 쿠키)
- SetCookie
@WebServlet("/setC")
public class SetCookie extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		Date d = new Date();
		Cookie c = new Cookie("cookieTest",URLEncoder.encode("오늘은 화요일","utf-8"));
		c.setMaxAge(-1); //세션 쿠키 설정
		response.addCookie(c); 
		
		out.print("현재 시간 : "+d);
		out.print("<br>문자열을 Cookie에 저장");
	}
}
- GetCookie 재사용
// 
쿠키 값 => 오늘은 화요일 
F12 - Cookies
=> 유효기간이 Session으로 설정돼있음
=> 브라우저 종료 후 재접속 시 쿠키 삭제돼있음
'Programming > 국비학원' 카테고리의 다른 글
| 220929 - 세션 바인딩, JSP (0) | 2022.09.30 | 
|---|---|
| 220928 - 서블릿 - 쿠키, 세션 (0) | 2022.09.29 | 
| 220926 - 서블릿 -커넥션 풀, 서블릿 확장 API (포워드 / 바인딩) (0) | 2022.09.27 | 
| 220923 - 서블릿 - DB 연결, 커넥션풀 (0) | 2022.09.24 | 
| 220922 - 서버 - 서블릿 예제 (0) | 2022.09.23 |