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 (지시자들) : <%@ ~ 으로 시작함.
- page : 페이지 환경을 정의 함. 하위 속성으로 13개 존재함.
예) 문자 인코딩, 응답 컨덴츠 타입 등 - taglib : JSP에서 이용 가능한 태크 라이브러리를 지정함.
- 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 지시자 속성
- import : 생성된 서블릿 클래스에 추가될 자바 import문을 정의
- 기본값
- javax.servlet
- javax.servlet.http
- javax.servlet.jsp
- isThreadSafe : 생성된 서블릿 클래스가 SingleThreadModel을 구현 할지 결정함. 기존값 true
- true - 스레드 안전 함. (SingleThreadModel이 아님)
- false - SingleThreadModel 임.
- contentType : MIME 타입과 문자 인코딩을 설정. 기본값은 ?
- isELIgnored : EL 표현식을 무시할 것인지 결정, 기본값은 false
- isErrorPage : 현재 페이지가 JSP 오류 처리용 페이지인지를 정의 합니다. 기본값은 false
만약 true 이면 내장 예외사항 객체(Throwable)를 사용할 수 있음. - errorPage : 이 페이지에서 잡지 못한 예외사항을 보낼 오류 페이지 URL를 정의. URL로 정의된 페이지는 바로 위의 속성 true 이어야 함(isErrorPage)
- language : scriplet,표현식, 선언문에 사용할 스크립팅 언어를 정의. 현재 java 유일
- extends : JSP가 상속할 부모 클래스를 정의함.
- session : 내장 session 객체를 가질지 여부를 결정. 기본값 true
- buffer ; 내장 out 객체(JspWriter) 버퍼링을 어떻게 관리할지 결정
- autoFlush : 자동적으로 버퍼링된 출력을 비울 것인지(flush)를 결정 합니다. 기본값 true
- info : 변환될 페이지에 포함할 String 값을 기술 합니다. 이 값을 나중에 getServletInfo() 메소드로 접근할 수 있음.
- 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-ignoredpage 설정isELIgnoredEL 기능함EL 무시됨명시되지 않음명시되지 않음Vfalse명시되지 않음Vtrue명시되지 않음Vfalse명시되지 않음VfalsetrueVtruefalseV스크립팅 가능 여부
DD설정scripting-invalid스크립팅기능함스크립팅무시됨명시되지 않음VtrueVfalseV