Step03_Scope (HttpSession)
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/index.jsp</title>
</head>
<body>
<h1>인덱스 페이지 입니다</h1>
<ul>
<li><a href="${pageContext.request.contextPath }/fortune">오늘의 운세</a></li>
<li><a href="${pageContext.request.contextPath }/member">회원 한명의 정보 보기</a></li>
<li><a href="${pageContext.request.contextPath }/test/fortune.jsp">서블릿을 거치치 않으면?</a></li>
<li><a href="${pageContext.request.contextPath }/test/play.jsp">놀러가기</a></li>
</ul>
<form action="${pageContext.request.contextPath }/test/save.jsp" method="post">
<input type="text" name="nick" placeholder="닉네임 입력..."/>
<button type="submit">닉네임 기억 시키기</button>
</form>
<br />
<form action="${pageContext.request.contextPath }/test/save" method="post">
<input type="text" name="nick" placeholder="닉네임 입력..."/>
<button type="submit">닉네임 기억 시키기</button>
</form>
</body>
</html>
/test/save.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String nick=request.getParameter("nick");
//HttpSession 객체에 "nick" 이라는 키값으로 입력한 nick 저장하기
session.setAttribute("nick", nick);
//60 초 동안 다시 요청을 해오지 않으면 자동으로 삭제되도록 설정
//생략하면 기본 30분
session.setMaxInactiveInterval(60);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/test/save.jsp</title>
</head>
<body>
<p> <strong><%=nick %></strong> 이라는 닉네임을 기억 하겠습니다. </p>
<p>60 초 동안 아무런 요청을 하지 않거나 웹브라우저를 닫으면 자동 삭제 됩니다.</p>
<a href="../index.jsp">인덱스로 이동하기</a>
</body>
</html>
String nick=request.getParameter("nick");
파라미터 값을 가져왔다.
session.setAttribute("nick", nick);
가져온 파라미터 값을 HttpSession 객체에 원하는 키값으로 저장했다.
session.setMaxInactiveInterval(60);
session 유지 시간에 대하여 초단위로 설정해놨다. 예시에서는 60초.
SaveServlet
package test.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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("/test/save")
public class SaveServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String nick=req.getParameter("nick");
//HttpSession 객체에 "nick" 이라는 키값으로 입력한 닉네임을 저장하려고 하는데...
HttpSession session=req.getSession();
session.setAttribute("nick", nick);
session.setMaxInactiveInterval(60);
//근데 html 응답하기가 구찮네... ㄷ ㄷ
//jsp 페이지한테 대신 응답하라고 떠넘기자!
//forward 이동은 보안되는 폴더인 /WEB-INF/ 안에 있는 jsp 페이지로도 가능하다
RequestDispatcher rd=req.getRequestDispatcher("/WEB-INF/views/monkey.jsp");
rd.forward(req, resp);
}
}
forward 이동은 보안되는 폴더인 /WEB-INF/ 안에 있는 jsp 페이지로도 가능하다
/WEB-INF/views/monkey.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/WEB-INF/views/monkey.jsp</title>
</head>
<body>
<%
String nick=(String)session.getAttribute("nick");
%>
<p> <strong><%=nick %></strong> 이라는 닉네임을 기억 하겠습니다. </p>
<p>60 초 동안 아무런 요청을 하지 않거나 웹브라우저를 닫으면 자동 삭제 됩니다.</p>
<a href="../index.jsp">인덱스로 이동하기</a>
</body>
</html>
FortuneServlet.java
package test.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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("/fortune")
public class FortuneServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 오늘의 운세를 얻어오는 비즈니스 로직을 수행했다고 가정하자
String str="동쪽으로 가면 귀인을 만나요";
//2. 로직의 수행결과 데이터(model) 을 HttpServletRequest 객체에 속성으로 담는다.
req.setAttribute("fortuneToday", str);
System.out.println("여기는 서블릿!");
/*
* - 요청 전달자 객체( RequestDispatcher )
*
* HttpServletRequest 객체의
*
* .getRequestDispatcher("요청을 전달받을 webapp 폴더 안에 있는 jsp 페이지의 위치")
*
* 메소드를 이용해서 얻어낼수 있다.
*/
RequestDispatcher rd=req.getRequestDispatcher("/test/fortune.jsp");
//3. 지정된 jsp 페이지로 응답을 대신 하라고 위임한다.
rd.forward(req, resp);
}
}
String str="동쪽으로 가면 귀인을 만나요";
req.setAttribute("fortuneToday", str);
원하는 글귀를 fortuneToday라는 key 값으로 HttpServletRequest에 담았다.
RequestDispatcher rd=req.getRequestDispatcher("/test/fortune.jsp");
rd.forward(req, resp);
지정된 jsp페이지로 응답을 위임한다.
/test/fortune.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/test/fortune.jsp</title>
</head>
<body>
<%
// fortuneTody 라는 키값으로 담긴 String type 얻어내기
String fortune=(String)request.getAttribute("fortuneToday");
%>
<p>오늘의 운세: <strong><%=fortune %></strong></p>
</body>
</html>
FortuneServlet.java에서 fortuneToday라는 키값으로 담아둔 값을 getAttribute로 가져와 사용한다. 여기서 FortuneServlet.java를 거치지 않고 바로 fortune.jsp로 이동하면 fortuneToday 값이 설정되지 않았기 때문에 null이 뜬다.
MemberServlet.java
package test.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 test.member.dto.MemberDto;
@WebServlet("/member")
public class MemberServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 회원 한명의 정보를 읽어오는 비즈니스 로직 수행 했다고 가정
MemberDto dto=new MemberDto(1, "김구라", "노량진");
//2. 로직 수행 결과 데이터를 HttpServletRequest 객체에 "dto" 라는 키값으로 담고
req.setAttribute("dto", dto);
//3. /test/member.jsp 페이지로 응답을 위임 시켜서 회원 한명의 정보를 응답하기
RequestDispatcher rd=req.getRequestDispatcher("/test/member.jsp");
rd.forward(req, resp);
}
}
같은 맥락으로 String type이 아닌 다른 type으로 회원정보와 같은 여러 정보를 한번에 전달하는 것도 가능하다. (예시에서는 미리 setter getter 메소드로 만들어둔 MemberDto 객체를 활용했다.)
/test/member.jsp
<%@page import="test.member.dto.MemberDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/test/member.jsp</title>
</head>
<body>
<%
MemberDto dto=(MemberDto)request.getAttribute("dto");
%>
<p>번호 : <%=dto.getNum() %></p>
<p>이름 : <%=dto.getName() %></p>
<p>주소 : <%=dto.getAddr() %></p>
</body>
</html>
/test/play.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/test/play.jsp</title>
</head>
<body>
<%
//HttpSession 객체에 "nick" 이라는 키값으로 저장된 값이 있는지 읽어와 본다.
String nick=(String)session.getAttribute("nick");
%>
<h1>play.jsp 페이지 입니다.</h1>
<%if(nick==null){ %>
<p>session 영역(scope) 에 "nick" 이라는 키값으로 저장된 값이 없습니다.</p>
<%}else{ %>
<p>
<strong><%=nick %></strong> 님 놀러 오였네요? 신나게 놀다 가세요!
<a href="logout.jsp">세션에 저장된 nick 삭제(로그아웃)</a>
</p>
<%} %>
</body>
</html>
기존에 아이디를 저장해놓은 세션 key값(예시에서는 nick)을 가져와서 사용하였다.
/test/logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/test/logout.jsp</title>
</head>
<body>
<%
String nick=(String)session.getAttribute("nick");
//세션 영역에 "nick" 이라는 키값으로 저장된값 삭제하기
session.removeAttribute("nick");
//session.invalidate(); //세션 초기화 도 가능
%>
<p> <strong><%=nick %></strong> 님 로그 아웃 되었습니다.</p>
<a href="${pageContext.request.contextPath }/">인덱스로 가기</a>
</body>
</html>
String nick=(String)session.getAttribute("nick");
세션에 저장되어 있던 key 값을 가져온다.
session.removeAttribute("nick");
해당 key으로 저장된 값을 삭제한다.
session.invalidate();
세션을 초기화하는 방법도 있다.