EL 내장 객체

Download Report

Transcript EL 내장 객체

• JSP도 결국 servlet입니다.
JSP 작성부터, 컨테이너가 서블릿을 작성할 때까지
• 얼마나 많은 요청을 받았는지 출력하는 JSP
<% %> 사이에 있는 것이 스크립틀릿이고,
out 은 내장객체입니다
• 패키지를 import 하기 위해서는 ‘page 지시자’를 사용합니다.
• 지시자(directive)는 시작 부분에 문자(@)가 포함됩니다.
• Page 지시자가 import할 패키지가 여럿이라면, 쉼표(,)를 이용해 분리하고,
전체 패키지명은 인용부호(“)로 묶어야 합니다
• 스크립틀릿(scriplet) & 표현식(expression)
• 표현식(expression)의 내용은 out.println()의 매개변수가 됩니다
• 스크립틀릿 안에서 변수 선언하기
• 모든 스크립틀릿 코드와 표현식 코드는 service() 메소드 안으로 들어갑니다
• 스크립틀릿 안에 선언된 모든 변수는 지역 변수입니다
• 스크립틀릿, 지시자, 표현식 외에 또 다른 JSP 요소 : declaration
• 컨테이너가 생성한 서블릿 클래스
• 선언문
• 내장객체(implicit object)
• 내장 객체
• 결과출력
• 클라이언트 요청정보 저장
• 응답 정보 저장
• HTTP 세션 정보 저장
• 웹 애플리케이션 정보 저장
• 페이지 설정 정보 저장
• 예외 객체
• 페이지 정보 저장
• 페이지를 구현한 자바 클래스 인스턴스
• Request 객체
메소드
설명
getCharacterEncoding()
클라이언트 요청정보 인코딩방식
getContentLength()
요청 정보의 길이
getContentType()
요청정보의 컨텐트 타입
getContextPath()
컨텍스트 경로
getMethod()
요청 정보 전송 Method
getProtocol()
클라이언트가 요청한 프로토콜
getRemoteAddr()
웹서버에 연결한 IP주소
getRequestURL()
웹 브라우저가 요청한 URL경로
getServerName()
연결할 때 사용한 서버이름
getServerPort()
실행중인 포트(port)
• Response 객체
메소드
설명
addCookie(Cookie cookie)
쿠키 데이터 기록
addHeader(String name, String value)
Response 헤더 내용 기록
containsHeader(String name)
지정된 헤더에 name 설정 여부 리턴
sendError(int status-code)
에러 response 를 전송
sendRedirect(String location)
현재 페이지를 다른 페이지로이동
setStatus(int status-code)
HTTP response 상태 코드 설정
setBufferSize(int size)
출력 버퍼 크기 설정
setContentType(String type)
전달할 내용의 MIME 타입 설정
setHeader(String name, String value)
지정된 이름과 값을 response 헤더 설정
flushBuffer()
버퍼의 내용을 클라이언트로 전송
getBufferSize()
출력 버퍼 크기 리턴
encodeURL(String url)
세션 ID와 URL를 합해 전송코드로 변환
encodeRedirectURL(String url)
encodingURL과 동일
sendRedirect에 세션ID를 넘길 때 사용
• 컨테이너에 의해 생성된 서블릿의 API
– 컨테이너는 JSP 파일을 HttpJspPage 인터페이스를 구현한 서블릿 클
래스로 변환하여 생성합니다.
jspInit()
jspDestroy()
_jspService()
– jspInit(), jspDestroy() 는 재정의 해도 무방하나, _jspService()는
재정의 해선 안됩니다.
• JSP 초기화 하기
– 일반 서블릿에서 서블릿 초기화 파라미터 설정하는 방식과 유사하게
JSP 초기화 파라미터를 설정합니다
• jspInit() 재정의 ( jspDestroy()도 재정의)
• 이처럼 jspInit() 메소드 안에서 JSP가 application 생존범위(scope) 속성으로
설정할 수 있습니다.
• JSP 내에 있는 속성들
• 내장객체를 이용한~
• 하지만, JSP에서는 pageContext 내장 객체만 가지고도
모든 생존범위 속성을 읽고 설정할 수 있습니다
• pageContext로 속성 접근하기
– pageContext는 자신에 설정되어 있는
page 범위 속성뿐만 아니라, 다른 생존범
위의 속성에도 접근할 수 있을 정도로 막강
합니다
– 다른 생존범위 속성을 참조하려면, 메소드
매개변수로 범위를 나타내는 정수값을 넘
겨야 합니다.
• pageContext를 이용한 속성 사용/설정 예제
• Page 지시자 속성
– import
• 생성될 서블릿 클래스에서 추가될 자바 import 문을 정의
– isThreadSafe
• 생성될 서블릿 클래스가 SingleThreadModel을 구현할 지 결정.
SingleThreadModel을 구현할 필요가 없다는 의미
– contentType
• MIME 타입과 문자 인코딩 설정
– isELIgnored
• EL표현식을 무시할 것인지 결정
– isErrorPage
• 현재 페이지가 JSP 오류 처리용 인가?
– errorPage
• 이 페이지에서 잡지 못한 예외사항을 보낼 오류 페이지 URL을 정의
• JSP에 자바 코드를 넣지 않는 것이 추세랍니다.
– 프로젝트에 포함되는 인력이 모두 프로그래머는 아니죠.
• Person은 JavaBean입니다. 그래서, 빈과 관련된 표준 액션
(standard action)을 사용할 수 있습니다.
– 표준 액션을 사용하면, JSP에서 스크립팅 코드를 모두 없애고도
Person 객체의 name 프로퍼티 값을 출력할 수 있습니다
• <jsp:useBean> 과 <jsp:getProperty>
– <jsp:useBean>은 빈을 선언하고 초기화 하는 태그입니다
빈 객체 식별자
빈 객체의 클래스 타입 선언
빈 객체 속성 scope
– <jsp:getProperty>는 속성 빈 프로퍼티를 읽어오는 태그입니다
Bean 객체 이름을 적습니다.
<jsp:useBean>태그의 id 값과
동일해야 합니다
프로퍼티 이름을 적습니다. 이 이름으로 빈
클래스의 getter/setter 를 찾아냅니다
• <jsp:useBean>은 객체를 생성하기까지 합니다
– <jsp:useBean>태그는 person 이라는 속성 객체를 찾다가 못 찾으면,
하나 만듭니다.
• <jsp:setProperty>
• <jsp:useBean>은 몸체를 가질 수 있습니다
<jsp:useBean> 몸체에 있는 코드는 조건부로 실행됩니다
즉. 빈을 못 찾고 새로운 빈을 생성할 때에만 실행됩니다
• <jsp:useBean> 태그에 type 속성을 추가하여 다형성 누리기
Example 1)
여기서 , class 속성은 레퍼런스
타입과 실제 할당되는 객체타입을
함께 표현하게 됩니다.
Example 1 에서 Person이 abstract class이고 이것을 상속한 Employee 클래스가 있다면
아래와 같은 에러가 발생합니다
java.lang.InstantiationError : example.el.model.Person
따라서, 참조 변수의 타입은 Person이더라도, 실제 할당되는 인스턴스의 타입은
Employee가 되도록 하려면, type 속성을 사용해야 합니다
Example 2)
• 서블릿을 거치지 않고, 바로 JSP로 요청을 날릴 경우
ELExamPage4.jsp
ELExamResult4.jsp
 표현식 때문에 깔끔해 보이진 않네요
• Param 속성으로 요청 파라미터 값을 빈 프로퍼티에 곧바로 설정할
수 있습니다.
ELExamResult4.jsp
ELExamResult4.jsp
• 더 쉽게 처리할 수 있는 방법~
request 파라미터의 이름과 bean 프
로퍼티의 이름이 동일한 경우
Value 속성을 명시하지 않아도 컨테이
너가 자동으로 설정해 줍니다
Bean의 모든 프로퍼티 이름과
request 파라미터 이름이 같다면~
Bean 태그는 기본 타입 프로퍼티를 자
동으로 변환합니다.
• 프로퍼티가 String도 기본형도 아닌 경우엔?
ELExamResult6.jsp
ELExamServlet4.jsp
ELExamResult6.jsp
스크립팅을 쓰게 되면 제 값이 출력은 되지만, 표준 액션을 사용하니 제대로 출력이 되질 않
습니다.
• EL ( Expression Language )
– EL을 사용하면 내장 프로퍼티 즉 프로퍼티의 프로퍼티를 출력하는 것
은 일도 아닙니다.
①
②
③
①
②
③
• EL
– EL 표현식은 항상 중괄호 {} 로 묶고, 제일 앞에 달러 기호 ($)를 붙입
니다
${person.name}
– 표현식의 첫 번째 변수는 내장 객체일 수도 있고, 속성일 수도 있으니
주의해야 합니다
• ${firstThing.secondThing}
EL 내장 객체
속성
pageScope
requestScope
sessionScope
applicationScope
page 생존범위에 바인딩된 속성
request 생존범위에 바인딩된 속성
session 생존범위에 바인딩된 속성
application 생존범위에 바인딩된 속성
param
paramValues
header
headerValues
cookie
initParam
pageContext
 map (요것들은 map 이지만, pageContext는 map이 아닙니다
 pageContext 만 제외하고, EL 내장 객체는 JSP 스크립팅에서
사용하던 내장 객체와 다릅니다
• 빈 프로퍼티와 Map 값에 접근하기 위해 도트연산자(.) 를 사용할
수 있습니다
– 표현식의 도트연산자 왼쪽은 반드시 맵 또는 빈이어야하고,
pageContext 를 제외하곤 전부
map 이라고 한거 기억나죠?
pageContext는 빈(bean)입니다
그러니, 모두 dot 연산자로 접근할
수 있겠네요.
– 오른쪽은 반드시 맵의 키이거나 빈 프로퍼티여야 합니다
• [] 연산자
${person.name}
• person이 bean이고, bean의 프로퍼티가 name일 경우를 말합니다
– 하지만, person이 빈이 아니라 배열이거나 리스트, 맵 일 경우에는 아
래의 표현과 사용할 수도 있고 약간 의미가 다릅니다
${person[“name”]}
• person은 맵, 빈, 배열, 리스트 변수일 수 있습니다
• 따옴표로 둘러쌓인 문자열은 맵키일 수도 있고, 빈 프로퍼티 이거나 리스트,
배열의 인덱스 일 수도 있습니다
• []연산자 사용 예-array
ELExamServlet7.java
ELExamPage7.java
• []연산자 사용 예-List
ELExamServlet8.java
ELExamPage8.java
• Bean이나 Map이라면 []와 dot(.) 연산자를 모두 사용할 수 있습니
다
ELExamServlet9.java
ELExamPage9.java
• 또 다른 예제
ELExamServlet10.java
ELExamPage10.java
• EL 내장객체 사용하기
EL 내장 객체
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
cookie
initParam
pageContext
JSP에 있는 내장 객체와는 다릅니다
(pageContext 만 빼고)
• <jsp:include> 표준 액션
contact.jsp
header.jsp
• 앞에서의 결과 소스보기
재사용할 페이지에선 <html> <body> 태그를 작성하지 않는 게
좋습니다~