본문 바로가기

백엔드 개발/SpringMVC

서블릿과 JSP(3)

1.URL 패턴 

@WebServlet("/Hello")
public class HelloServlet extends HttpServlet{

}

우리는 위와 같이 하나의 클래스에 대해 한번의 맵핑만 해왔다. 따라서 HelloServlet에 결과 처리를 요청하려면 무조건 "~~/Hello" 라는 유일무이한 통로만 이용해야 했다.

@WebServlet(urlPatterns={"/hello", "/hello/*"}, ;loadOnStartup=1)
public class HelloServlet extends HttpServlet{

}

하지만 위와 같이 하나의 클래스에 대하여 여러가지 통로로 매핑할 수 있다. 

urlParttern은 하나의 클래스에 갈 수 있는 여러가지 통로를 배열로서 나타낸 형태이다. 

위의 예제에서 HelloServlet을 이용하려면 /hello를 쳐도 되고, /hello/~~~ 다른 말을 더 쳐도 다 HelloServlet으로 이동한다. 

 

*은 모든 것을 뜻한다. 따라서 /hello/*은 hello/do, hello/goood, ... 등 아무거나 와도 된다는 소리이다. 

loadOnStartup =1은 해당 서블릿의 객체를 미리 만들어 초기화 하겠다는 소리다.

원래 서블릿은 늦은 초기화가 원칙이다. 미리 객체를 안 만들어두다가 요청이 들어오면 그 때 만든다.

2. 서블릿의 작동구조 (추가)

(1)mapping의 종류

종류 URL pattern 매칭되는 브라우저 URL 예시
1. exact mapping /login/hello.do http://localhost/ch2/login/hello.do
2. path mapping /login/* http://localhost/ch2/login/
http://localhost/ch2/login/hello
http://localhost/ch2/login/hello.do
http://localhost/ch2/login/test/
http://localhost/ch2/login/brother
3. extension mapping *.do http://localhost/ch2/hi.do
http://localhost/ch2/login/hello.do
4. default mapping  / http://localhost/ch2/
http://localhost/ch2/login/hello
http://localhost/ch2/login/hello.do
http://localhost/ch2/login/test/
http://localhost/ch2/login/brother
(기본 주소만 치면 다 걸림)

번호에 따라 우선순위로 적용된다. 

제일 먼저 브라우저에 적은 URL과 정확하게 일치하는 URL pattern이 있는지 찾는다. 있으면 글로 간다.

 

정확히 일치하는 URL 주소가 없다면,

두 번째 우선순위는 브라우저 URL의 맨끝 세부 주소를 뺀 경로 주소가 모두 일치하는 URL pattern이 존재하는지 찾는다. 

URL 패턴을 /login/* 로 적으면 맨 끝 세부주소가 무엇이든 상관없이 경로주소가 /login/으로 끝나는 녀석이면 전부 매핑된다. 

 

그 마저도 없다면 맨 끝 확장자가 브라우저에 쓴 것과 일치하는 URL 패턴이 있는지 찾는다.

 

다 없으면, 기본주소만 치면 나오는 default page로 이동한다.  

 

 

(2)서블릿의 작동구조(추가)

앞에서 배웠던 children 명부를 통해 요청 처리할 서블릿이 존재하고, 해당 서블릿의 객체가 존재하는지 여부를 체크하기 전에, 브라우저 요청이 어떤 서블릿으로 매핑이 되는지 찾는 과정이 추가 되었다.

 

a. ~~/hello 라는 URL 로 요청이 들어왔다면, com.fastcampus.ch2.HelloServlet이라는 서블릿이랑 매핑이 된다. 

그러면 ServletContext가 해당 서블릿이 있는지 체크하고, 해당 서블릿이 객체를 가지고 있는지 본다. 있으면 그 객체로 요청을 넘긴다. 

 

b. ~~/hello.jsp라는 URL 요청이 들어왔다. 이 경우 완벽히 일치하는 URL 패턴이 존재하지 않는다. 따라서 두번째 경로 주소가 일치하는 녀석이 있는지 찾아봤는데 ~~/* URL 패턴은 없다. 따라서 경로주소 일치하는 URL 패턴도 없다. 그러면 세번째로 확장자가 일치하는 녀석을 찾는다 *.jsp라고 있다! 따라서 jsp란 서블릿과 매핑이 된다.

 

c. 만약에 ~~/hello.do 라는 URL 요청이 들어왔다면, 해당 요청에 완전 일치하는 URL 패턴, 경로주소가 같거나 확장자가 일치하는 URL 패턴도 없다 따라서 맨 마지막 default page로 간다. default page를 보여주는 servelt을 DefaultServlet이라 한다. 

아파치에서는 DefaultServlet 대신 DispatcherServlet을 쓰도록 설정해놨다. 

 

** 번외 ** 

Spring 환경에서는 서블릿이나 JSP를 쓰지 않는다. (JSP는 view로 쓰긴 하지만 등록을 하진 않는다.)

따라서 servletMapping이나 children도 쓰지 않는다. 

 

따라서 브라우저에서 어떤 URL로 요청을 보내던 무조건 default로 가게 되고, DispatcherServlet으로 가게 된다. 

그러면 어떻게 URL들을 구분하여 무슨 요청인지 파악할까? 

 

Spring에서는 DispatcherServlet 내부에  위와 같은 Mapping을 다 가지고 있다. 

따라서 내부에서 처리한다. 

3. EL (Expression Language)

(1) EL 을 쓰는 이유

JSP에 자바 코드를 쓸 때 편리하게 쓸려고. 

맨 위가 jsp 속에 java 코드 쓰는 문법, 맨 밑이 jsp에서 쓰는 EL 문법. 이렇게 간단히 쓸 수 있다.

(2) EL을 쓰려면 request 객체 내의 저장소에 이용할 값들을 저장해둬야 한다.

EL은 지역변수를 그대로 쓰지 못한다 따라서

request.setAttribute("key",value)로 값을 저장해야한다. 

그러면 request 객체 내부에 map 형식으로 있는 저장소에 이름-값 형태로 저장된다.

그러면 EL 쓸 수 있다. 

 

EL 은 Null 을 출력하지 않는다. 공백으로 보여준다. 

문자열 + 숫자는 java에서는 "1"+ 1 = 11이 되는데 , EL에서는 문자열을 숫자로 바꿔서 

"1"+1 = 2가 나옴. 

EL은 문자열 형태의 숫자를 숫자로 바꿔준다. 

계산 시에는 빈 문자(" ")랑 Null을 0으로 바꾼다.

 

empty 배열, 컬렉션 

-> empty null 혹은 empty 빈 컬랙션, 빈 배열 = ture

안이 비었으면 true를 반환