본문 바로가기

Study/JSP

[JSP]서블릿(Servlet)과 EL표현식

서블릿(Servlet)

서블릿(Servlet)은 jsp파일이 실행되기 위해 java파일로 변환된 것을 말하며, jsp와 java 코드를 함께 수행 가능하다. 서블릿 응답 정보의 내용 형태는 html인데, java 페이지에서 직접 표현하려면 html 페이지를 java 코드 내에서 모두 작성해야 하기 때문에 번거롭고 복잡하다. 그래서 서블릿에서는 액션태그를 통한 페이지 이동, 즉 forward 방식으로 jsp 페이지를 보여주게 된다. 페이지를 이동할 때 주소줄에 jsp 페이지 주소가 그대로 노출되면 보안상의 위험이 있어, 서블릿에서 정해놓은 가상 주소를 대신 노출시키고 포워딩으로 화면만 이동하는 것이다.

 

정리하면 jsp는 정적/동적 데이터를 같이 처리하는 페이지고, 서블릿은 java 코드를 사용해서 jsp 페이지와 연결하여 웹을 개발하는 기술이다. java파일이 서블릿으로 동작하기 위해 거쳐야 하는 과정은 다음과 같다. 여기서 web.xml은 배포 서술자로서, 프로젝트의 시작 지점이며 웹 페이지가 실행될 때 제일 먼저 읽히는 파일이다.

1. javax.servlet.Servlet 인터페이스 구현(잘 안 씀) 또는 javax.servlet.http.HttpServlet 클래스 상속

2. doGet(), doPost() 오버라이딩  ->  HttpServletRequest, HttpServletResponse 객체 구현

3. IOExeption / ServletException 예외 처리

4. web.xml 파일 또는 @WebServlet 어노테이션(서블릿 3.0 이상)을 통해 주소 매핑

 

서블릿 실행 구조는 클라이언트의 요청 정보를 서블릿 컨테이너(WAS)가 서블릿으로 전달하고, 서블릿의 응답을 다시 컨테이너가 클라이언트에게 전달한다. 서블릿 최초 생성 시에는 서블릿의 init() 메서드가 호출되며 이후부터는 호출되지 않는다. 서블릿 컨테이너는 jsp를 서블릿으로 전환해주는 역할을 하는데, Apache Tomcat 같은 WAS를 뜻한다. 서블릿 컨테이너는 워크스페이스에서 아래 경로로 들어가면 존재하는 jsp 파일로 찾을 수 있다.

.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\프로젝트\org\apache\jsp

 

EL표현식

EL표현식(Expression Language)은 jsp의 표현식(<%= %>)이나 out.println() 형태 출력문을 대신한다. 간편하고 오류 발생 확률이 낮으며, 전달받은 파라미터를 자동으로 캐스팅(형 변환)한다. 앞서 JSTL과 함께 사용을 했었는데, JSTL에서 변수를 영역객체로 받아왔듯이 EL표현식 변수도 영역객체로 받는다. 영역 정보를 생략하면 pageScope - requestScope - sessionScope - applicationScope 순으로 호출하여 데이터가 있는 최초의 영역에서 멈춘다.

 

아래는 jsp 페이지에서 JSTL/EL표현식을 사용하여 서블릿과 연결한 예시다. request 영역객체에 정보를 저장하여 포워딩 방식으로 넘겼으며, 만약 복수 객체일 때는 List/Set 등 컬렉션 객체를 사용하면 된다. 여기서는 get방식으로 페이지가 실행되기 때문에 doPost()는 오버라이딩하지 않았다. 코드 실행은 항상 서블릿에서 해야 한다.

코드를 보면 JSP 표현식보다 EL표현식을 사용한 것이 더 간단하다. 또한 student 객체의 모든 정보는 private이지만 EL표현식을 사용하면 접근 가능하고, JSTL의 set 태그로 변수명을 축약할 수도 있다.

 

EL표현식의 내장객체는 영역객체 외에도 param(파라미터), header, cookie, pageContext 등과, 배열을 저장하는 paramValues, headerValues가 있다. 그리고 연산자로는 [ ], ( ), 삼항, empty, 산술(+, -, *, div, mod), 논리(and, or, not), 비교(eq, ne, lt, le, gt, ge)가 있다. [ ]는 배열, empty는 값이 null이거나 크기가 0일 때 true를 반환하고, 비교 연산자는 순서대로 (=, !=, <, <=, >, >=)이다.

위 코드는 form 태그로 id, pass, hobby(배열) 파라미터값을 받아와서 모두 출력하고, 아래 코드는 숫자 2개와 id를 받아와서 연산자를 사용하는 코드다.

원래 파라미터값은 String 타입이지만 EL표현식으로 출력할 때는 자동 캐스팅이 된다.

페이지를 실행했을 때 JSP(java;서블릿) - JSTL/EL표현식 - html - JavaScript 순으로 실행되기 때문에 JSTL에서 JS값은 사용 불가능하다. 반대로 EL표현식 데이터를 " " 안에 넣으면 JS로 출력이 가능하다.

<script type="text/javascript">
	alert("자바스크립트 : ${requestScope.var}");
</script>

 

코드 예시

아래는 서블릿과 EL표현식을 사용한 두 가지 예시다. 먼저 web.xml 파일 <welcome-file-list> 다음 위치에 서블릿 경로와 가상 주소(url-pattern)를 지정한다. 이때 *.com 같은 형식으로 적으면, 끝에 .com이 붙는 모든 주소를 해당 서블릿으로 연결시킨다는 뜻이 된다. 이 방식 대신 어노테이션을 사용해도 된다.

그리고 서블릿에 코드를 작성한다. 여기서는 doGet() 내에서 doPost()를 호출했고, request와 session 영역에 변수 생성 후 attributeTest 페이지로 전달했다.

위에서 스크립틀릿 내에 생성한 변수는 jsp 코드 밖에서 사용이 불가능하다.

 

아래는 배열과 컬렉션 객체를 array 페이지로 전달하는 예시 코드다.

이 코드는 jsp와 EL표현식 두 방식으로 출력하는데, 컬렉션 객체의 경우 반복문을 사용하지 않아도 똑같이 출력된다.