Servlet 데이터를 저장하는 객체

최주영·2023년 5월 23일
0

Servlet

목록 보기
3/9
post-thumbnail

✅ 서버에서 데이터를 저장하는 객체

  • HttpServletRequest 객체
    -> 1회용 데이터를 저장하는 저장소 -> 요청하고 응답이 완료될때까지 유지
    -> (요청, 응답이 끝나면 날라감)
    -> 일회용 객체를 보완하기위해서 (즉 객체가 유지되기위해서) 밑에 객체들이 만들어짐

  • HttpSession 객체 -> getSession() 메소드 이용
    -> 원하는시점에 생성해서 원하는 시점까지 저장할 수 있는 저장소
    -> 인증의 수단으로 사용
    -> session을 삭제하는 메소드 : invalidate()

  • ServletContext -> getServletContext() 메소드 이용하거나, getServletConext()를 이용
    -> 서버가 실행되고 종료될때까지 유지하는 저장소 = 서버가 꺼질때 까지

위 3개의 객체 모두 setAttribute 메소드를 통해서 데이터 저장 가능!

-- shareDataServlet.java

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 각 객체에 데이터 저장하기
		// HttpServletRequest 객체에 데이터 저장하기
		
		request.setAttribute("requestdata", "requestDataTest");
		
		
		// HttpSession 객체 이용하기
		// 1. HttpSession 객체를 생성 
		//    -> HttpServletRequest 제공하는 getSession() 메소드 이용
		HttpSession session = request.getSession();
		// 2. HttpSession.setAttribute() 메소드를 이용해서 저장
		session.setAttribute("sessiondata", "sessionDataTest");
		
		
		// ServletContext 객체 이용하기
		// 1. ServletContext 객체 생성
		//  -> HttpServletRequest 제공하는 
		// getServletContext() 메소드 이용하거나, getServletConext()를 이용
		ServletContext context = request.getServletContext(); // 방법 1
		context = getServletContext();  // 방법 2
		context.setAttribute("contextdata", "contextDataTest");
		
		
		RequestDispatcher rd = 
				request.getRequestDispatcher("/checkData.do");
		rd.forward(request, response);
	
	}


-- CheckDataServlet.java
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String requestData = (String)request.getAttribute("requestdata"); // 키 값을 통해서 값 저장
		
		HttpSession session = request.getSession();// 키 값을 통해서 값 저장
		String sessionData=(String)session.getAttribute("sessiondata");
		
		ServletContext context = getServletContext(); // 키 값을 통해서 값 저장
		String contextData = (String)context.getAttribute("contextdata"); 
		
		response.setContentType("text/html;charset=utf-8"); // response 객체를 이용하여 html 인식할 수 있도록 설정 (한국어 깨지지 않도록 설정)
		PrintWriter out= response.getWriter(); 
		
		String html="<h3>request : "+requestData+"</h3>";
		html+="<h3>session : "+sessionData+"</h3>";
		html+="<h3>context : "+contextData+"</h3>";
		html+="<button onclick=\"location.assign('/02_servletdata/checkData.do');\">checkdata 재요청</button>";
		html+="<button onclick=\"location.assign('/02_servletdata/deleteSession.do');\">seesion삭제</button>";
		out.write(html);
		
		// 위 checkdata 재용처 버튼클릭해서 URL이바껴도 requestData만 없어지고 
		// sessionData와 contextData는 유지됨 -> 즉 url이 바껴도 HttpSession과 ServletContext 객체는 살아있음
        // 위 session삭제 버튼 누르면 HttpSession 객체가 사라짐
      	// session 삭제버튼 화면은 바로 밑에있음
        // ServletContext 객체는 서버 끄면 삭제됨
	}
    
    
-- DeleteSessionServlet.java
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		HttpSession session = request.getSession(); 
		session.invalidate(); // HttpSession 객체의 session값을 삭제하는 메소드
		
		response.sendRedirect("/02_servletdata/checkData.do"); // 삭제한 후에 전 화면으로 이동
						  // 경로	: checkData.do 만 써도됨
	}

✅ HttpServleteRequest 객체가 제공하는 정보

  • request.getContextPath() -> 해당 프로젝트의 path 만 나옴
  • request.getHeader("Referer") -> 해당 페이지의 전 페이지의 주소만 나옴
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// HttpServleteRequest 객체가 제공하는 정보
		// 1. ContextRoot 가져오기 = 프로젝트 path만 가져오기
		String contextPath=request.getContextPath();
		System.out.println(contextPath); // contextRoot;
		
		// 2. HttpRequest의 header 정보 가져오기
		String userAgent = request.getHeader("User-Agent");
		System.out.println(userAgent);
		
		// 이전 페이지정보
		String prevPage = request.getHeader("Referer");
		System.out.println(prevPage);// 바로 이전 주소가 나옴
		
		// 3. 요청한 주소에 대한 정보를 가져오기
		String uri = request.getRequestURI(); // 메인주소만 나옴 (URI)
		System.out.println(uri); 
		StringBuffer url = request.getRequestURL();  // 전체주소가 나옴 (URL)
		System.out.println(url); 
		
		// URI와 URL의 차이점
		// URI= 식별자, URL=식별자+위치
		// https://elancer.co.kr은 URL
		// elancer.co.kr은 URI
		// URI가 URL보다 더 큰 범위이다
	}


✅ HpptSession 객체를 이용해서 로그인

// LoginServlet (폼으로 받아온 값들 이용)
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String userId = request.getParameter("userId");
		String password= request.getParameter("password");
		
		if(userId.equals("admin")&& password.equals("1234")) {
			System.out.println("로그인 성공");
			HttpSession session = request.getSession(); // 로그인되면 그 정보들이 유지되어야하기때문에 HttpSession 객체 사용
			session.setAttribute("loginId", userId);
		}else {
			System.out.println("로그인 실패");
		}
		
		response.sendRedirect(request.getContextPath()+"/mainView.do"); // 해당 매핑 페이지로이동
	}
    
// MainViewServlet.java
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		HttpSession session = request.getSession();
		String loginId=(String)session.getAttribute("loginId"); // 해당 키값이 없으면 null로 반환됨
		String html="";
		
		if(loginId!=null) {
			html+="<h2>"+loginId+"님 환영합니다</h2>";
		}else {
			html+="<h2>로그인 후 이용이 가능합니다.</h2>";
		}
		
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write(html);
		
	}
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글