[필독][기초] / JSP [part 1]

2016. 1. 5. 15:14language/jsp

1. JSP란?

아래 나오는 모든 예제는 ROOT 애플리케이션에 작성한다.
웹 애플리케이션 작성 실습에서 DocuementBase 가 C:/www/myapp 인 애플리케이션을 ROOT 애플리케이션으로 변경했었다.
JSP는 C:/www/myapp 아래에, 자바는 C:/www/myapp/WEB-INF/src 아래 자바 팩키지 이름의 서브디렉토리에 생성한다. 이클립스를 사용하지 않고 일반 에디터를 사용한다.

JSP는 마이크로소프트의 ASP가 인기를 끌자 ASP에 대한 자바측 대응 기술로 등장했다.
JSP는 서블릿 기반 기술이다.
JSP는 톰캣과 같은 서블릿 엔진에 의해 서블릿1으로 변환 후에 서비스된다.
서블릿은 동적으로 HTML 페이지를 만들어주는 기술이지만 자바 코드와 HTML 코드의 분리에 어려움이 있었다.
서블릿은 HTML디자인을 자바 문자열로 만들어서 출력스트림의 메소드에 인자로 전달해야만 한다.
이것은 자바코드에 HTML디자인이 삽입된다는 의미이다.
이와 반대로 JSP는 HTML디자인에 자바 코드가 삽입된다.
이로서 JSP는 서블릿의 가지고 있는 디자인과 코드의 분리의 어려움을 어느정도 개선했다고 할 수 있다.2
JSP는 복잡한 디자인을 가진 동적으로 만들어지는 HTML을 사용자에게 보여줘야 할 때 유용한 기술이다.
/hello.jsp 

<html>
<body>
Hello World!
</body>
</html>


클라이언트가 웹브라우저를 통해 hello.jsp를 요청한다.
만일 이 요청이 첫번째 요청이었다면 톰캣은 hello.jsp로부터 서블릿을 만든다.
hello.jsp가 ROOT애플리케이션의 최상위 디렉토리에 위치한다면
{톰캣홈}\work\Catalina\localhost\_\org\apache\jsp\hello_jsp.java 이 변환된 서블릿이다.
톰캣은 이 서블릿을 컴파일한 후 객체를 생성하고 서블릿 객체의 서비스 메소드를 호출한다.
이후 hello.jsp에 대한 요청이 들어오면 서블릿 컨테이너는 일단 hello.jsp파일이 변경되었는지를 체크한다.
hello.jsp가 변경되지 않았다면 객체가 이미 로딩되어 있는지 확인한다.
만일 객체가 메모리에 있다면 객체의 서비스 메소드를 호출하고 로딩되지 않았다면 먼저 객체를 생성한다.
hello.jsp가 변경되었다면 서블릿 컨테이너는 hello.jsp로부터 서블릿을 만든다.

2. 지시어(Directives)

지시어(Directives)는 JSP 페이지의 전반적인 정보를 서블릿/JSP 엔진에게 제공한다.
지시어는 page, include, taglib 3개가 있다.


 

2.1 page 지시어

용법 : <%@ page {attribute="value"} %>
attribute="value" 설명
language="scriptLanguage" 페이지를 컴파일할 서버측 언어가 무엇인지 기술(대부분 java)
import="importList" 페이지가 import 하는 자바팩키지 리스트 기술 (,로 구분)
session="true | false" 페이지에 세션 데이터가 이용되는지의 여부(디폴트 true)
errorPage="error_uri" JSP 익셉션을 다루는 에러 페이지의 상대경로를 나타냄.
isErrorPage="true | false" 페이지가 에러를 핸들링하는 페이지인가의 여부를 기술(디폴트 false)
contentType="ctinfo" 클라이언트로 보내질 응답의 MIME 타입과 캐릭터셋 설정
pageEncoding="charset" JSP파일의 캐릭터셋을 의미
contentType에서 지정한 캐릭터셋과 동일하게 지정한다.

생략하면 디폴트 값이 적용되는 속성이 많다.
따라서 모든 속성을 정의해 줄 필요는 없다.
page 지시어는 여러번 쓸 수 있다.
contentType 속성은 단 한번만 정의할 수 있고 대부분 첫번째 나오는 페이지 지시어에서 정의한다.
import 속성은 여러번 지정할 수 있다.
다음 예에서 확인한다.


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.HashMap,java.util.ArrayList" %>


위에서 page 지시어를 2번 사용했다.
contentType 속성과 import 속성만 주목하자.
contentType 속성으로 웹브라우저가 받을 컨텐츠는 HTML문서이고 문서의 문자셋은 UTF-8이라고 설정했다.
UTF-8은 현재 인터넷에서 가장 인기있는 문자셋이다.
두번째 페이지 지시어는 import 속성을 정의했다.
JSP안의 자바 코드에서는 java.util.HashMap과 java.util.ArrayList가 사용될 것이다.
첫번째 페이지 지지어에서 import 속성을 정의할 수 있지만 그렇게 하는 것은 좋지 않다.
위를 다음과 같이 바꿀 수 있다.


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.ArrayList" %>


보기 편하다는 이유 하나로 이렇게 코딩하는 것을 권장한다.


 

2.2 include 지시어

inlcude 지시어는 JSP 가 서블릿으로 변환시에 텍스트나 소스를 삽입하기 위해 사용한다.
삽입되는 문서는 웹 애플리케이션내에 존재해야 한다.
예) <%@ include file="header.jsp" %>
include 지시어는 서블릿으로 변환할 때 한번만 사용된다.
모든 JSP페이지가 결합된 후 하나의 서블릿은 변환된다.


 

2.3 taglib 지시어

taglib 지시어는 JSP 페이지가 커스텀 태그 라이브러리를 이용함을 기술한다.
태그 라이브러리란 서블릿으로 변환할 때 자바 코드로 바뀌는 태그를 만드는 기술이다.
대부분 HTML로 구성된 JSP에서 자바코드를 피해, 디자이너에게도 친근할 수 있는 태그를 사용하는 것은 코드와 디자인 관리를 효율적으로 할 수 있는다는 이론적인 이점이 있었으나 너무 많고 다양한 태그 라이브러리가 등장한 결과 이점보다는 부작용이 부각되었다.

다음은 태그 라이브러리를 사용할 때 taglib 지시어를 사용하는 방법이다.
커스텀 태그 라이브러리는 각각의 커스텀 태그 집합을 구별하는 prefix 와 uri 로 유일하게 구별된다.
<%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %>
태그라이브러리 지시어 속성(url, prefix) 
uri : 커스텀태그 라이브러리를 고유하게 이름짓는 URI 참조
prefix : 커스텀 태그 라이브러리를 구별하는데 쓰이는 Prefix 정의

태그 라이브러리를 만드는 방법은 다루지 않겠다.

 

 

 

 

출처 : http://www.java-school.net/jsp/JSP

 

 

도움이 되셨다면 공감을 부탁드립니다. ^^