2013년 9월 7일 토요일

[Head First]Servlets & JSP 내용정리-7장

Chapter.07 - JSP가 되어보자


JSP가 서블릿되기


JSP 요소들

  • 스크립틀릿(scriptlet) : <% %>
  • 지시자(directive) : <%@ %>
  • 표현식(expression) : <%= %>
  • 선언문(declaration) : <%! %>

내장 객체들

               API _____ 내장객체
         JspWriter _____ out
HttpServletRequest _____ request
HttpServletResponse _____ response
       HttpSession _____ session
    ServletContext _____ application
     ServletConfig _____ config
      JspException _____ exception
       PageContext _____ pageContext
            Object _____ page
** JspWriter와 PrinterWriter는 커스템 개발에서 기능상 차이가 있음.

설명들

  • MyJSP.jsp -> MyJSP_jsp.java -> MyJSP_jsp.class -> MyJSP_jsp Servlet
  • <% %> : 스크립틀릿 (scriptlet), 자바코드를 작성할 수 있다.
  • 지시자 : 컨테이너가 페이지를 자바 코드로 변환할 때 특별한 지시를 내릴 수 있도록 고안됨.
  • tomcat 환경의 JSP에서 생성된 servlet 코드 위치
    • $jsp_src_loc : jsp source location path 위치 변수
    • $tomcat_home : 톰캣 설치 홈
    • $eclipse_dev_plugin_home : 이클립스 개발 플러그인 홈
    • $serv_name : 서버명 , $webapp_name : web 어플리케이션 명
    • $jsp_src_loc = work/Catalina/$serv_name/$webapp_name/org/apache/jsp
    • 원래 환경 : $tomcat_home/$jsp_src_loc
    • eclipse 개발 환경 : $eclipse_dev_plugin_home/$jsp_src_loc
      $eclipse_dev_plugin_home = $workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1

page Directive(지시자) : 패키지를 import 할 때 사용됨.

  • 예1) 패키지 하나만 import할 경우 <%@ page import=”java.util.*” %>
  • 예2) 여러 패키지를 import를 할 경우 : <%@ page import=”java.util.*,java.io.*” %>
     혹은
    <%@ page import=”java.util.*” %>
            
    <%@ page import=”java.io.*” %>

Directive (지시자들) : <%@ ~ 으로 시작함.

  1. page : 페이지 환경을 정의 함. 하위 속성으로 13개 존재함.
    예) 문자 인코딩, 응답 컨덴츠 타입 등
  2. taglib : JSP에서 이용 가능한 태크 라이브러리를 지정함.
  3. include : 변환 시점에 현재 페이지에 포함할 코드난 문서를 정의

표현식 (JSP Expression) : out.println()를 대처 하기 위해서 사용된다.

  • <%= %> , 세미 콜론은 사용되지 않는다. out.print 구문에 들어가기 때문에
    <%= Counter.getCount() %> --> out.print(Counter.getCount()); 변환됨.
  • 절대 표현식에 세미 콜론을 넣지 않는다.
  • void를 리턴하는 메소드는 사용할 수 없음.

JSP 선언문 : 서비스 메소드나 여타 메소드의 바깥 쪽에 위치하게 함.

주석 : <%-- JSP Comment --%> , 자바소스 코드 주석으로 변경됨.

생성된 서블릿의 API

  • 톰캣에서 JSP 상속 클래스 : org.apache.jasper.runtime.HttpJspBase
  • 주요메소드
    • jspInit() : 서블릿 init() 메소드에서 호출함. (재정의 해도됨.)
    • jspDestory() : 서블릿의 destory() 메소드에서 호출함.(재정의 해도됨.)
    • _jspService() : 서블릿의 service() 메소드에서 호출함. (재정의 하면 안됨.) 그럼 ‘_’ 가 메소드 이름에 있음.

변환과 컴파일은 단한번만 이루어짐.
** 미리 컴파일하는 방법도 있음 : ?jsp_precompile=true|false , 컨테이너 마다 틀림 ,JSP 2.0에서 제시됨.

JSP 초기화

초기화 파라미터 설정
<servlet>
 <servlet-name>MyTestInit</servlet-name>
 <jsp-file>/TestInit.jsp</jsp-file>
 <init-param>
   <param-name>email</param-name>
   <param-value>cosmoslight.huni@gmail.com</param-value>
 </init-param>
</servlet>

jspInit() 재정의하기
<%!
 public void jspInit(){
   ServletConfig sConfig = getServletConfig();
   ------------------------------------------
   나중에 서블릿으로 변경될것을 미리 하고 getServletConfig()를 호출할 수 있음.
   String email = sConfig.getInitParameter(“email”);
   ServletContext ctx = getServletContext();
   ctx.setAttribute(“mail”,email);
   -------------------------------
   application 생존 범위로 설정 한다.
 }
%>

JSP내에 있는 속성들..

범위
Servlet에서
JSP에서 (내장객체를 사용)
Application
getServletContext().setAttribute(“foo”,barObj);
application.setAttribute(“foo”,barObj);
Request
request.setAttribute(“foo”,barObj);
request.setAttribute(“foo”,barObj);
Session
request.getSession().setAttribute(“foo”,barObj);
session.setAttribute(“foo”,barObj);
Page
제공하지 않음.
pageContext.setAttribute(“foo”,barObj);


PageContext클래스 로 할 수 있는 일들

  • 속성 접근 (변경 및 설정)
  • 내장 객체 얻기
  • 속성 변경 예제
    • page 생존 범위 설정 : <% pageContext.setAttribute(“foo”,new Float(3.141592)); %>
    • page 생존 범위 읽기 : <%= pageContext.getAttribute(“foo”) %>
    • session 생존 범위 설정 :
      <% pageContext.setAttribute(“foo”,fooObj,PageContext.SESSION_SCOPE); %>
    • session 생존 범위 읽기 :
    • <%= pageContext.getAttribute(“foo”,PageContext.SESSION_SCOPE) %>
      <%= session.getAttribute(“foo”) %> 와 동일
    • application 생존 범위 읽기 :
      <%= pageContext.getAttribute(“foo”,PageContext.APPLICATION_SCOPE) %>
      <%= application.getAttribute(“foo”) %> 와 동일
    • 어떤 생존 범위인지 모르는 속성 찾기 : <%= pageContext.findAttribute(“foo”)%>
      찾는 순서는 page 부터 가장 작은 범위로 부터 큰 범위로 즉 page > request > session > application

page 지시자 속성

  1. import : 생성된 서블릿 클래스에 추가될 자바 import문을 정의
    • 기본값
    • javax.servlet
    • javax.servlet.http
    • javax.servlet.jsp
  2. isThreadSafe : 생성된 서블릿 클래스가 SingleThreadModel을 구현 할지 결정함. 기존값 true
    • true - 스레드 안전 함. (SingleThreadModel이 아님)
    • false - SingleThreadModel 임.
  3. contentType : MIME 타입과 문자 인코딩을 설정. 기본값은 ?
  4. isELIgnored : EL 표현식을 무시할 것인지 결정, 기본값은 false
  5. isErrorPage : 현재 페이지가 JSP 오류 처리용 페이지인지를 정의 합니다. 기본값은 false
    만약 true 이면 내장 예외사항 객체(Throwable)를 사용할 수 있음.
  6. errorPage : 이 페이지에서 잡지 못한 예외사항을 보낼 오류 페이지 URL를 정의. URL로 정의된 페이지는 바로 위의 속성 true 이어야 함(isErrorPage)
  7. language : scriplet,표현식, 선언문에 사용할 스크립팅 언어를 정의. 현재 java 유일
  8. extends : JSP가 상속할 부모 클래스를 정의함.
  9. session : 내장 session 객체를 가질지 여부를 결정. 기본값 true
  10. buffer ; 내장 out 객체(JspWriter) 버퍼링을 어떻게 관리할지 결정
  11. autoFlush : 자동적으로 버퍼링된 출력을 비울 것인지(flush)를 결정 합니다. 기본값 true
  12. info : 변환될 페이지에 포함할 String 값을 기술 합니다. 이 값을 나중에 getServletInfo() 메소드로 접근할 수 있음.
  13. pageEncoding : JSP 문자 인코딩을 합니다. 기본값으 “ISO-8859-1” (contentType이나 XML 문서문법에서 정의 하지 않은 경우에만 기본값이 적용됨.)

스크립틀릿은 협업 개발시 비프로그램머가 보기 아주 어렵다.

EL :


  • 정의 : 표현식 언어(Expression Language) , JSP 2.0 이후 부터 공식적으로 지원
  • 형식 : ${....}
  • JSP에서 스크립팅항목을 사용하지 못하게 하는 방법 : <scripting-invalid>
  • EL을 무시하도록 만들기 (EL은 기본적으로 가능 상태) : <el-ignored> 나 <%@ page isELIgnored 속성
    페이지 지시자가 DD 보다 우선 순위를 가짐.
    <web-app ...>
     <jsp-config>
       <jsp-property-group>
       <url-pattern>*.jsp</url-pattern>
       <scripting-invalid>true</scripting-invalid>
       <el-ignored>true</el-ignored>
     </jsp-config>
    </web-app>
    ** <%@ page isScriptingEnabled=”false” %> JSP 2.0 초안 존재하다가 최종 스펙에서 삭제됨.

    EL 기능 설정 문제

    DD의 설정
    el-ignored
    page 설정
    isELIgnored
    EL 기능함
    EL 무시됨
    명시되지 않음
    명시되지 않음
    V

    false
    명시되지 않음
    V

    true
    명시되지 않음

    V
    false
    명시되지 않음
    V

    false
    true

    V
    true
    false
    V


    스크립팅 가능 여부

    DD설정
    scripting-invalid
    스크립팅
    기능함
    스크립팅
    무시됨
    명시되지 않음
    V

    true

    V
    false
    V