서블릿과 jsp

정호윤·2023년 6월 24일

스프링

목록 보기
9/15

spring에서는 @Controller,@RequestMapping 에너테이션을 사용
서블릿에서는 @WebServlet 에너테이션을 사용.@Controller와 @RequestMapping 두개를 합친 형태의 에너테이션.class 하나당 하나의 url밖에 mapping 못 한다.

반드시 class가 HttpServlet을 상속(extends) 받아야 한다.service메서드가 반드시 있어야 한다.이 메서드는 반드시 HttpServletRequest req,HttpServletResponse res를 매개변수로 받아야 한다.

spring에 비해서 전체적으로 제약사항이 많다.뭔가 노드 express랑 비슷한거 같기도 하고

서블릿 클래스에서는 반드시 세개의 메서드가 존재한다.init,service,destroy
이들중 init,destroy 메서드는 servlet container가 자동으로 호출해준다.

서블릿은 싱글톤이라 하나의 객체만 생성한다.이미 만들어진 서블릿 객체가 있을시 만들어놓은 객체를 사용하고 없을 때만 확인해서 새로 만든다.

jsp는 결국 서블릿과 똑같다.jsp 파일이 jspServlet에 의해서 java 파일로 변한다.그리고 이게 class 파일로 변환을 거쳐서 서블릿 인스턴스로 변한다.
<% %> 안에 자바 코드를 넣을수 있다.java 파일로 변환시 service() 메서드 안에 만들어진다.
<%! %> class 영역에 코드가 만들어진다.별개의 메서드 선언도 가능
<%=%> html 영역에서 값을 찍을 때 사용한다.

서블릿과 spring은 둘다 싱글톤이다.객체를 하나만 만들고 사용한다.
서블릿은 미리 객체를 만들어놓지 않는다.최초 1회 요청이 들어오면 그 때 객체를 만들어서 사용한다.반면 spring은 미리 객체를 만들어놓는다.

jsp에는 기본객체가 존재한다. _jsp service 메서드의 지역변수로서 존재한다.
request,pageContext,response,session,application 등등
request 타입:HttpServletRequest 요청 정보가 담겨있는 객체
response 타입:HttpServletResponse 요청에 응답을 작성할 때 사용
session 타입:HttpSession Http session을 구현한 객체.세션 정보 저장에 사용
application 타입:ServletContext web application 전체에서 공유하는 객체
config 타입:ServletConfig jsp 페이지에 대한 설정 정보가 담긴 객체
page 타입:object jsp 페이지 객체 자신
pageContext 타입:PageContext jsp 페이지의 context 정보를 제공
out 타입:JspWriter 응답에 포함될 내용을 출력할 때 사용
exception 타입:throwable 예외가 발생했을 때 생성되는 예외 객체

유효범위와 속성에 대해서 알아보자!scope attribute
spring에는 4개의 저장소가 존재한다
4개의 저장소는 1.접근범위 2.생존기간에 따라서 구분된다.저장소는 map 형태로 데이터를 저장한다.

pageContext
지역변수들을 저장한다.모든 기본객체들이 pageContext에 저장된다.
범위는 하나의 jsp 파일이다.어차피 하나의 메서드 안에 들었는데 뭐하러 기본 객체들을 따로 저장소에 저장하고 쓰냐??el을 사용하기 위해서 그렇다${}.el은 지역변수에 바로 접근할수가 없다.el에서 쓰려면 반드시 pageContext에 저장을 하고 써야한다.
요청 할 때 마다 값이 바뀐다.

application
web app 전체에서 접근 가능한 저장소이다.전체 단 하나만 존재하는 저장소.모든 jsp 페이지에서 접근 가능하기에 개별적인 로그인 정보들을 저장하기에는 알맞지 않음

session
클라이언트랑 1:1로 대응하는 개별 저장소.id,pwd를 저장한다.
login 하면 생기고 logout하면 사라진다.사용자마다 한개씩 가지기에 서버에 부담이 크다.최소한으로 줄여주는게 좋음.여러개의 jsp 페이지에서 접근 가능

request
클라이언트에서 요청 할 때 마다 하나씩 생긴다.보통은 요청 - 응답 과정을 거친후 하나의 jsp 파일에서 끝난다.하지만 forward를 통해서 다른 jsp 페이지로 request 저장소를 넘겨줄수 있다.

void setAttrubute(String name,Object value) name value 형태로 저장소에 저장
Object getAttribute(String name) name과 일치하는 속성의 값을 반환
void removeAttribute(String name) 지정된 name의 속성을 삭제
Enumeration getAttributeNames() 기본 객체에 저장된 모든 속성의 이름을 반환

url 패턴
@WebServlet(urlPatterns={"/hello","/hello/*"},loadOnStartup=1)
이런식으로 url 여러개를 등록할수 있다.loadOnStartup 설정하면 빠른 초기화 설정됨.뒤에 숫자는 우선순위.서블릿은 spring과 다르게 늦은 초기화이다.
url 패턴 우선순위

servlet context 안에는 servletMappings와 children이라는 멤버를 가지고 있다.요청이 올시 servletmapping에서 일치하는게 있는지 확인하고 서블릿 정보가 저장된 children에서 일치하는걸 찾는다.

spring에서는 이런거 안 쓴다!! 모든 요청ㅇ르 dipatcherServlet이 모든 요청을 받고 dispatcherServlet 내부에 저장되어 있는 url에서 확인한다.
app의 web.xml에서 dispatcherServlet을 등록한걸 확인할수 있다.

EL

<%
// Person 객체를 service 메서드의 iv로 저장했다.하지만 el에서는 iv 를 사용할수 없다.
Person person = new Person();
// pageContext 저장소에 저장해줘야 el에서 사용할수 있다.
request.setAttrubute("person" person);
pageContext의 reqeust 기본 객체에 저장한것

%>

<%= person.getCar().getColor()%>
person.getCar().getColor(){person.getCar().getColor()}{person.car.color}
객체에 getter,setter가 정의되어 있다면 메서드를 생략하고 변수 이름만으로 가져올수 있다.

profile
개발자로 취직을 희망합니다.

0개의 댓글