금요일, 3월 29
Shadow

#028 스크립트가 없는 JSP

스크립트가 없는 페이지

속성이 string이 아니라 person 객체가 인스턴스라면?

서블릿 코드
foo.Person p = new foo.person();
p.setName(“evam”);
request.setAttribute(“person”, “p);

JSP코드 :
<html>
<body>
Person is : <%= request.getAttribute(“person:) %>
</body>
</html>

표준 액션을 사용하려면
<html>
<body>
<jsp:useBean id =”person” scope =”request” />
Person created by servlet : <jsp:getProperty name =”person” property =”name” />
</body>
</html>

<jsp:useBean>은 객체를 생성하기까지 합니다.

<jsp:useBean id =”person” scope=”request” />
_jspService() 메소드 내에 다음과 같은 코드로 바뀝니다.

foo.Person person = null;
synchronied(request){
person=(foo.Person)_jspx_page_context.getAttribute(“person”, pageContext.REQUEST_SCOPE);

if(person ==null){
person = new foo.Person();
_jspx_page_context.setAttribute(“person”, person, pageContext.REQUEST_SCOPE);
}
}

<jsp:useBean> 태그안에 <jsp:setProperty> 태그를 코딩하면 조건부로 프로퍼티 설정을 한다는 말입니다.
<jsp:useBean id =person.person scpoe =page>
<jsp:setProperty name = person property=name value=Fred/>
</jsp:useBean>

빈 참조에 다형성 기법을 사용할수 있습니까?
<jsp:useBean> 태그에서 class 는 객체를 못찼았을 경우 새로 생성할 클래스를 결정합니다. 또한 생선된 서블릿 코드내에서 객체를 참조할 참조 변수의 타입을 결정합니다.

JSP useBean 태그
<jsp:useBean id = “person” class”foo.Person” scope=”page />

생성된 서블릿 코드
foo.Person person = null;
if(person ==null){
person = new foo.Person();

<jsp:useBean> 태그에 type 속성을 추가하면 됩니다.
Person 객체가 추상 객체라면, 해당 객체를 속성에서 찾지 못하는 경우, 새로 생성해야하는데 이경우 문제가 된다.
원래
<jsp:useBean id=”person” scope=”page”/>
이런결과가 나오죠
java.lang.Instantiationerror:foo.Person
왜냐하면 컨테이너는 아래코드를 실행하려고 무지 노력하겠죠
new foo.Person();

type 속성으로 작성한 JSP
<jsp:useBean id =”person” type=”foo.Person” scope=”page”>
생성된 서블릿 코드
foo.Person person = null;
if(person ==null){
person = new foo.Employee();

type ==참조타입
class == 객체타입

type은 선언할 것이므로 추상 객체여도 관계없지만 class는 인스턴스화 할것이므로 실제 객체여야 합니다.
type x = new class()

스크립팅 없이, 빈에 요청 파라미터를 설정할수 있다.
<jsp:useBean id = “person” type=foo.Person”>
<jsp:setProperty name = “person” property=”name” param=”username”/>
</jsp:useBean>

<html>
<body>
<from action=TestBean.jsp>
name : <input type=”text” name=”userName”>
ID# :<input type =”text” name=”userID”>
<input type=”submit”>
</form>
</body>
</html>

더 낳은 방식이 있다.
<jsp:useBean id = “person” type=foo.Person”>
<jsp:setProperty name = “person” property=”name“/>
</jsp:useBean>

<html>
<body>
<from action=TestBean.jsp>
name : <input type=”text” name=”name“>
ID# :<input type =”text” name=”userID”>
<input type=”submit”>
</form>
</body>
</html>

빈태그는 기본 타입 프로퍼티를 자동으로 변환합니다.

type이 Employee인 경우
<html><body>
<jsp:usebean id =”person” type=”foo.Employee”>
<jsp:setproperty name=”person” property=”*”/>
</jsp:usebean>
person is : <jsp:getProperty name=”person” property=”name” />
ID is : <jsp:getProperty name=”person” property=”empID”/>

표현식언어(EL)가 답이다.
<html><body>
Dog’s name is : ${person.dog.name}
</body>
</html>

같은 의미
<%((foo.Person) request.getAttribute(“person”)).getDog().getName() %>

JSP 표현식언어를 파헤쳐 봅시다.
EL 표현식은 항상 중괄호로 묶고 제일앞에 달러 기호룰 붙입니다.
표현식의 첫번째 변수는 내장 객체일수도 있고 속성일수도 있으니 주의해야 합니다.
EL내장객체
pageScope
requestScope
sessionScope
applicationScope
param
paramValue
header
headerValues
cookie
initParam
pageContext

또는
속성 : page, request, session, application 생존범위에 바인딩된 속성

도트연산자 사용하기
1. 표현식에서 도트 연산자 왼쪽은 반드시 맵 또는 빈이어야 합니다.
2. 표션식에서 도트연산자 오른쪽은 반드시 맵의 키이거나 빈의 프로퍼티 이어야 하니다.
3. 오른쪽에 오는 값을 식별자로 일반적인 자바 명명규칙을 따라야 합니다.
${person.name}= ${person[“name”]}
[]를 사용할 경우 배열과 리스트인경우 문자로된 인덱스 값은 숫자로 자동으로 바뀐다.

[]안에 내장 표현식을 쓸수 있습니다.
서블릿 코드
java.util.Map musicMap=new java.util.HashMap();
MusicMap.put(“Ambient”,”Zero 7″);
MusicMap.put(“Surf”, “Tahiti 90”);
request.setAttribute(“musicMap”, musicMap);

String[] musicTypes={Ambient”,”Surf”};
request.setAttribute(“MusicType”, musicTypes);

d이코드는 제대로 동작합니다.
Music is ${musicMap[MusicType[0]}
Music is ${musicMap[:Ambient”]}
music is Zero 7

쿠키와 초기화 파라미터 정보
쿠키 username의 값을 출력해 봅시다.
<%
Cookie{] cookies = request.getCookies();

for(int i = 0; i < cookies.length; i++){
if((cookies[i].getName()).equals(“userName”)){
out.println(cookie[i].getValues());
}
}
%>

EL에서는 Cookie 내장 객체를 사요하면 된다.
${cookie.userName.value}

———————————————————-핵심정리 : JSP 표현식 언어 종합
ㅇ EL 표현식은 항상 중괄호로 묶고 앞에 달러 기호를 붙입니다.
ㅇ 표현식에서 첫번째 변수는 내장객체이거나 아니면 다음 4가지 생존범위에 속하는 속성입니다. (page, request, session, application)
ㅇ 도트 연산자는 맵 키 이름이나 빈 프로퍼티 이름으로 값을 읽습니다. 예를 들어 ${foo.bar}에서 foo가 맵이라면 bar는 키가 될것이며, foo가 빈이라면 bar는 당연히 프로퍼티가 되겠죠 여하튼 사용자는 그 값을 읽을수 있죠. 그리고 도트 연산자의 경우 오른쪽에 어떤것이 오더라도 그 이름은 자바 명명규칙을 따라야 합니다.
ㅇ 도트연산자 오른쪽에 자바 식별자로서 부적절한 이름은 절대 올수 없습니다. ${foo.1}과 같이 코딩할수 없습니다.
ㅇ [] 연산자는 도트연산자보다 훨씬 기능이 강력합니다. 왜냐구오, [] 연산자는 배열과 리스트값도 읽을수 있으니까. [] 안에 변수를 포험한 표현식을 쓸수 있으며, 얼마든지 많은 []을 포함할수 도 있습니다.
ㅇ 예를들어 musicList 가 ArrayList라고 해봅시다. musicList의 첫번째 값을 읽으려면 ${musicList의 첫번째 값을 읽으려면 ${musicList[“0”]}로 해도 됩니다. EL에서는 인덱스 값에 따옴표를 허용합니다.
ㅇ []안에 있는것에 따옴표가 없다면 컨테이너는 이 값이 무엇인지 실행해봅니다. 따옴표가 있다면 그리고 연산자 왼쪽이 배열이나 리스트가 아니라면, 프로퍼티나 키 이름이라고 생각하면 되겠죠
ㅇ 딱하나만 빼고 EL 내장객체는 모두 맵입니다. 맵 내장객체만 있으면 4가지 생존 범위 객체에 묶여 있는 속성, 요청 파라미터값, 헤더값, 쿠키값, 컨텍스트 초기화 파라미터에 접근하수 있지요. 맵 타입이 아닌 객체는 pageContext뿐인데, 이는 pageContext 객체 참조 변수입니다.
ㅇ EL 내장 생존범위 객체하고 실제 속성이 묶여 있는 객체하고 헛깔리지 마세요 즉 requestScope 내장 객체하고 실제 JSP request 내장객체하고 구분해야 합니다. EL에서 request 객체에 접근할수 있는 유일한 길은 pageContext 내장 객체를 통해서 입니다.
ㅇ EL 함수를 사용하면 일반 자바 클래스에 있는 정적인 공용 메소드를 호출할수 있습니다. 함수 이름하고 실제 메소드 이름이 일치할 필요는 없죠
ㅇTLD파일을 사용해서 함수와 실제 정적인 메소드를 서로 매핑합니다.
<function>태그에 함수를 정의하는데 그 하위 태그인<name>에는 함수 이름을 <function-class>에는 경로까지 기술한 함수 클래스명을 <function-signature>에는 함수의 리턴 타입과 인자가 어떻게 된는지 작성합니다.
ㅇ JSP에서 함수를 사용하려면, taglib 지시자 이름공간을 선언해야 합니다. taglib 지시자에 있는 앞 첨자를 가지고 컨테이너는 코딩에서 호출한 함수가 어는 TLD에 있는 지 파악하는데 사용합니다.

———————————————————-핵심정리 : 빈관련 표준 액션 리뷰
ㅇ <jsp:useBean 표준 액션은 이미 존재하는 빈 또는 존재하지 않아 새로 만든 빈에 댛나 참조 변수를 정의합니다.
ㅇ JSP에서 빈을 참조할때 사용할 변수 이름을 <jsp:usebean> id 속성에 정의해야 합니다 .
ㅇ <jsp:useBean>에 scope 속성이 없으면, 디폴트로 page 생존범위 입니다.
ㅇ class 속성은 옵션입니다. 이 속성은 새로운 빈을 만들어야 하는 경우 클래스타입을 정의합니다. 타입은 추상 클래스가 아닌, 공용 실제 클래스여야 합니다. 그리고 인자가 없는 디폴트 생성자가 있어야 합니다.
ㅇ <jsp:usebean>의 type 속성에는 빈을 캐스트할 타입을 정의합니다. 여기에는 반드시 캐스트 가능한 타입을 설정해야 하니다.
ㅇ type 속성만 정의하고 class 속성을 정의하지 않았다면, 빈은 반드시 존재해야 하니다. 왜냐하면 새로운 빈을 인스턴스화 할 class 속성을 정의하지 않았기 때문입니다.
ㅇ <jsp:useBean> 태그는 몸체를 가질수 있습니다. 여기에는 <jsp:useBean>의 결과로 새로운 빈이 만들어졌을때 실행해야 할 내용이 들어갑니다.
ㅇ <jsp:useBean>몸체를 정의하는 가장큰 목적은 <jsp:setProperty>를 이용해서 새로 만든 빈 프로퍼티를 설정하기 위해서입니다.
ㅇ <jsp:setProperty>에는 name속성과 property 속성이 반드시 있어야 합니다. property속성에는 프로퍼티 이름 또는 와일드카드(*)가 들어갈수 있습니다.
ㅇ <jsp:setProperty>에서 value 속성을 코딩하지 않앗다면, 컨테이너가 자동으로 동일한 이름의 요청 파라미터값을 설정합니다. property 속성에 와일드카드를 사용한 경우, 동일한 이름의 요청 파라미터값을 컨테이너가 알아서 설정합니다. 똑같은 것이 없읆대에는 영향이 없습니다.
ㅇ 요청 파라미터 값하고 프로퍼티 이름하고 같지 않을 경우에도 특정 요청 파라미터로 값을 설정하고 싶으면, <jsp:setProperty>에 프로퍼티를 설정할수 있습니다. 실제 클래스 타입에 있다고 해서 모두 다 되는것은 아니라는 말이죠
ㅇ 프로퍼티값으로 String이나 기본형이 될수 있습니다. <jsp:setProperty> 표준 액션이 자동으로 이를 변환합니다.

———————————————————-핵심정리 : include 리뷰
ㅇ 다음 두가지 포함 (include)메커니즘을 사용하여 재사용 가능한 컴퓨넌트를 구축할수 있습니다. (include 지시자와 <jsp:include> 표준액션)
ㅇ include 지시자는 전환시에 포함(jsp-> java)작업을 합니다. 그것도 딱 한번만 따라서 include 지시자는 배포된 다음 거의 수정을 하지 않는 컨텐츠에 적합한 메커니즘
ㅇ incldue 지시자는 포함할 파일 내용 전부를 복사하여 붙여 넣습니다. 컨테이너는 이 파일을 합쳐 하나로 만든 다음 컴파일하고 서블릿 코드를 생성합니다. 런타임시, include 지시자를 ㅏ진페이지는 두 파일을 합쳐 하나로 만든 JSP를 포함할수 있습니다.
ㅇ 두 메커니즘 모두 동적 컨텐츠를 포함할수 있습니다. 예를 들면 EL 표현식이 잇는 JSP를 포함할수 있습니다.
ㅇ include 지시자는 여러 지시자 중 코딩 위치에 민감한 유일한 지시자 입니다. ioncldue 지시자가 있는 바로 그위치에 컨텐츠가 포함됩니다.
ㅇ include 지시자의 속성과 <jsp:include> 표준 액션의 속성ㅇ느 그 이름이 다릅니다. 지시자는 file 속성을 사용하고, 표준액션은 page 속성을 사용하니다.
ㅇ 재사용 가능한 컴포넌트로 만들려면 시작, 마침 태그를 제거하세요 모든 브라우저가 중간에 들어간 시작, 마침 태그를 제대로 출력하는것이 아니기 떄문이지요, 재사용 가능한 컴포넌트는 다른 컴포넌트에 포함/삽입된다는 것을 늘 염두에 두고 설계, 구현해야 합니다.
ㅇ <jsp:include>몸체에 <jsp:param>태그를 사용하여 요청 파라미터를 설정할수 있습니다.
ㅇ <jsp:forward>의 몸체에도 <jsp:raram> 태그를 사용할수 있습니다.
ㅇ <jsp:param> 태그는 <jsp:include> 또는 <jsp:forward> 태그내에서만 의미가 있습니다.
ㅇ <jsp:param> 파라미터가 요청 파라미터에 있는 것이라면 이전 값을 덮어쓰고, 그렇지 않으면 욫어에 새로운 파라미터를 생성합니다.
ㅇ 포함될 자원은 다음과 같은 제약이 있습니다. 포함될 자원에 응답 상태코드를 바꿀수 없으며, 헤더를 설정할수 없습니다.
ㅇ <jsp:forward> 표준 액션은 동일 웹 애플리케이션에 있는 다른 자원으로 요청을 보냄
ㅇ 포워딩 작업 직전, 응답 버퍼 내용을 먼저 비웁니다. 따라서 응답을 넘겨받은 자원은 아주 깨끗한 상태에서 출력 스트림 작업을 하지요 포워딩 전에 혹 쓰여진 내용이 있다면 모두 버려진다는 것을 염두에 두세요
ㅇ 포워딩 전에 응답을 보냈다면 클라이언트는 내보내진 응답을 받지, 포워딩된 응답을 받지 못합니다. 물론 flush()이후 출력스트림에 쓰여진 내용도 받지 못하지요

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.