Blog

빠르게 배우는 JSP – 1

November 18, 2013

빠르게 배우는 JSP – 1

빠르게 JSP를 학습하자

난 JSP를 쓰고싶진 않다, 그런데 뭔진 알고 싶다. 프레임워크에 늪에 빠지지 않는 유일한 방법은 빠르게 탐색하고 나오는 것 뿐

내장 객체 Implicit Object

서블릿은 컨테이너는 서블릿에 몇 가지 객체를 전달하는데, JSP에서는 이들을 명시적으로 지정하지 않고 사용할 수 있는 것 같음. 예를들어

<%
   String userName = request.getParameter("userName");
%>

request 는 결국 서블릿 컨테이너에 의해 서블릿에 전달되는 javax.servlet.http.HttpServletRequest 다. 이외에도 response, out, session, application 등 많다. 자세한 내용은 여길 참조

지시어 Directive

지시어는 page, include, taglib, attribute, variable 등 다양하다. 일단 page directive 부터 알아보자. page directive 는 JSP 변환기에 JSP 페이지의 특성을 전달한단다.

  • session
  • import
  • contentType
  • pageEncoding

등등 이 있다. page directive 는 페이지의 어느 위치에나 있을 수 있지만 contentType 이나 pageEncoding 의 경우 템플릿 데이터와 컨텐츠를 출력하는 자바 코드보다 당연히 먼저 나와야 한다. 그리고 여러번 사용할 수 있지만 한 페이지 내에서 같은 속성의 다른 값을 가질 수는 없다. 물론 import 속성은 예외!

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>

include directive 는 당연히 파일을 포함하는 것.

<%@ include file="url" %>

선언문 Declaration

JSP 페이지 내에서 사용할 변수와 메소드를 선언할 때도 있을 거다. 선언문은 그럴 때 쓴다. 예를들어

<%!
    private int add(int num1, int num2) {
        int sum = num1 + num2;
        return sum;
    }
%>

이 때, JSP 내부에서 무엇인가를 선언할때는 주의해야 할 점이 한가지 있다. 인스턴스 변수를 선언하면 안됌 앞선 포스팅에서도 말 했듯이 JSP는 기본적으로 멀티스레드 환경에서 동작한다. 따라서 변할 수 있는 변수를 사용해서는 안된다.

스크립틀릿 Scriptlet

스크립틀릿JSP 내부에서 Java 코드를 쓸 수 있게 해준다. 예를 들어 다음과 같은 스크립틀릿을 이용해 서블릿에 전달될 내장객체 Request 에 데이터를 저장 할 수 있다.

<%
   request.setAttribute("product", product);
%>

익스프레션 Expression

<%= java.util.Calendar.getInstance().getTime() %>

익스프레션Expression 의 평가 결과는 내장 객체인 Print.out에 전달된다. (화면에 출력된다는 뜻인 듯)

Forward, Include Method

JSP 실행 중간에, 다른 JSP 파일을 호출할 수 있다. 이 때 Forward 메소드는 실행 흐름, 즉 제어를 다시 원래의 JSP로 돌려주지 않는다. 반면 Include 는 돌려준다. 이 두 가지 메소드는 response.sendRedirect 와는 좀 다릅니다. sendRedirect 는 Get 방식으로 URI 에 인자를 지정하지만, forward, includerequest.setAttribute 를 통해 파라미터를 지정합니다. 마치 POST 처럼요. 다음과 같이 사용할 수 있을거에요

<%
    request.setAttribute("NAME", "HOON");
    RequestDispatcher dp = 
            request.getRequestDispatcher("other.jsp");
    dp.forward(request, response);
%>

Expression Language

EL은 기존 JSP 문법을 더 쉽게 사용할 수 있도록 해준다. 일례로,

<%= request.getAttribute("result") %>
${result}

위의 Expression 을 아래의 Expression Language 로 바꿀 수 있다. 중요한것은, Attribute가 어느 내장객체에서 온 것인지 모를 수 있다는 점이다. 따라서 JSP는 우선순위를 정해 두었다.

page -> request -> session -> application

아니면, 직접 scope 를 지정할 수 있다. ${pageScopre.result}, ${requestScopre.result}, ${sessionScopre.result}, ${applicationScopre.result}

이 외에도, Expression Language 에는 많은 내장객체가 있다. cookie, param 등등. 이것들을 ${param["COLOR"]} 혹은 ${param.COLOR} 처럼 활용할 수 있겠다, 배열이라면 ${paramValues.ANIMAL[0]} 처럼 사용한다.

이 외에도 Expression Language 에는 연산자가 있다. ${(param.NUM1 gt 0) and (param.NUM2 gt 0)} 그렇다. 별거 없다. ${gender == "femail"} 그렇다. 비교도 별거 없다.

이외에도, 자바의 정적 메서드를 EL 에서 호출할 수 있다. ${m:squareroot(param.NUM)} 처럼. 근데, 이걸 하기 위해서는 TLD(Tag Library Descriptor) 파일을 만들어 여기에 정적메소드를 등록해야 한다. 별로다. 그래서 안한다.

이어지는 표준액션, JSTL 등은 빠르게 배우는 JSP 2부에서!