서블릿에서 사용되는 저장소
HTTP의 특징 중에 하나가 stateless. 클라이언트에 대한 정보를 기억하지 못함. 그렇기 때문에 저장소가 필요하다. 각 저장소는 접근 범위와 생존 기간이 다르다.
-
application
- 접근 범위 : context 어디서나 접근 가능 (모든 사용자가 공유)
- 생존 기간 : appilcation 시작부터 종료까지
- 저장소가 context마다 딱 한 개 있다.
-
session
- 접근 범위 : 클라이언트 개별 저장소, 클라이언트가 접근하는 page내
- 생존 기간 : 로그인 - 로그아웃(session 객체 유지되는 동안)
- 사용자 수 만큼의 저장소가 생기기 때문에 서버에 부담 → 사용 최소화
-
request
- 접근 범위 : 요청을 받은 페이지 내에서
- 생존 기간 : 요청이 처리되는 동안
- 요청할 때마다 생성, 각 request마다 독립적
- forward시 한 jsp페이지에서 다른 jsp페이지로 request를 넘겨줄 수 있다. 그 사이에 속성을 더 추가해서 넘겨줄 수도 있음.
→ 제일 우선적으로 고려되어야 할 저장소
- 저장소를 이용하기 편리한 건 session이지만 서버 부담이 있기 때문에 request를 사용하거나 그게 안 될 때 session에 저장하고, session에서 잠깐 저장하고 삭제하는 것도 방법
URL 패턴(@WebServlet)
//@WebServlet(urlPattern={"/hello", "/hello/*"}, loadOnStartup=1)
//loadOnStartup : early init, 숫자는 early init하는 것 중 우선순위
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {...}
우선순위
1. exact mapping - /login/hello.jsp
2. path mapping - /login/
3. extension mapping - .jsp
4. default mapping - /(모든주소)
- /login/hello.jsp를 검색창에 입력했을 때, 맨 위에서부터 순서대로 url패턴을 비교하여 일치하는 url패턴의 메서드가 처리
- get방식으로 요청을 받는 경우에 url패턴이 중요할텐데.. 사실 패턴이 어떨 때 쓰이는지 모르겠다. 정확한 url을 항상 줘야 할 수밖에 없지 않나..?
요청시 매핑 된 url을 통해 서블릿이 실행되는 과정
- sevletMappings : url과 서블릿 이름을 저장한 map객체
- default value(/)에는 주로 정적 리소스(image, txt, css)를 등록하여 고정된 응답을 받도록하고, 그조차 없으면 404에러를 내게함
- 그 외의 url을 등록할 때는 동적인 리소스(서블릿)를 등록함
- spring은 children, servletMapping에 다른 값을 등록안하고 모든 url을 default로 받아서 (DefaultServlet이 아닌,)DispatcherServlet이 처리하게 함.
Spring은 DispatcherServlet안에 children, servletMapping같은 구조를 내부에 가진다.
- servlet과 spring의 서블릿 등록 관련 설정은 두 개의 web.xml에서 할 수 있는데 개별 web.xml가 전체 web.xml설정을 덮어쓴다.
++ jsp파일이 servlet으로 변환된 파일의 저장 경로
C:\Users\hka\Documents\workspace-sts-3.9.17.RELEASE.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\ch222\org\apache\jsp
→ jsp파일을 수정했는데 반영이 안될 때 clean tomcat work directory를 하거나 이 경로의 jsp, class파일을 삭제해보자