카테고리 없음

[헤드퍼스트 Servlet&Jsp] 8-1. 스크립트가 없는 페이지

haloaround 2017. 2. 19. 12:07

드디어 크롬 개발자도구 에서 확인하는 HTML 속 ${...} 를 이해할 수 있게 된다. :3


XPATH 와 자바스크립트 (ECMAScript) 에서 영감을 받아 만든 EL

웹 디자이너들이 친숙하게 사용할 수 있는

유지 보수가 평이한 EL




학습목표


빈 표준 액션태그 <jsp:useBean>


EL 최상위 변수 활용


EL 연산자: 프로퍼티 접근자 . / 컬렉션 접근자 []

산술연산자, 관계연산자, 논리연산자


EL 함수



Java Bean과
빈 표준 액션태그


Java Bean 은 클래스 변수에 대해 각각 게터/세터 메소드를 가진 일반적인 자바 클래스

JSP 에는 빈 관련 표준 액션이 있습니다. <jsp:useBean> / <jsp:getProperty>


속성이름(name), 생존범위(scope), 프로퍼티이름(property)


<jsp:useBean id="person" class="foo.Person" scope="request" />

먼저 실제 객체를 선언하고 초기화하는 태그


표준액션

빈 객체 식별자 person (없으면 만들고, 있으면 대체하고) 

빈 객체의 클래스타입 선언 

빈 객체의 속성 생존범위



<jsp:getProperty name="person" property="name" />

속성 빈 프로퍼티를 읽어오는 태그


표준액션

빈 객체 이름 식별 person

빈 객체의 프로퍼티 이름 (빈 클래스의 게터/세터메소드 확인)



<jsp:useBean id="person" class="foo.Person" scope="request" >

<jsp:setProperty name="person" property="name" value="Fred" />

</jsp:useBean>


<jsp:useBean> 몸체는 속성 빈을 찾지 못하고, 

새로운 빈을 만들었을 때에만 조건부로 실행되는 코드입니다.



빈 규약

- 클래스에서 자바 빈을 꺼내기 위한 규약


1) 반드시 인자가 없는 public 생성자가 있어야 합니다.

2) 게터메소드, 세터메소드가 있어야 프로퍼티로 인정됩니다.

3) JSP 표준액션으로는 프로퍼티 타입은 Primitive Type 만 허용합니다.
(프로퍼티 타입으로 객체를 사용하려면 스크립팅을 통해야 합니다.)



자바빈 다형성 기법

Type 참조타입 vs Class 객체타입

Person 빈

foo.Employee 객체 인스턴스


type 은 선언할 것이므로, 추상객체여도 관계없지만

class 는 인스턴스화 할 것이므로 실제 객체여야 합니다.

tpe x = new class()


Person 은 추상클래스, Employee 가 Person을 상속한 구체적인 클래스라면?

(상속 + 인터페이스 등 다형성 기법 모두) 


<jsp:useBean id="person" type="foo.Person" class="foo.Employee" scope="page" />

... foo.Person person = new foo.Employee();


type 은 참조 변수 

class 는 인스턴스 변수



<jsp:useBean id=
"person" type="foo.Person" scope="page" />

... class가 없는 경우, 자바빈은 먼저 존재해야 합니다.
그렇지 않으면 InstantiationException 이 발생합니다.

class 만 있으면 모를까~! type 만 있으면 안됩니다. 


scope 은 default "page" 입니다.




속성 param

param 속성으로 요청 파라미터 값을 빈 프로퍼티에 곧바로 설정할 수 있습니다. 그것도 요청 파라미터 이름을 가지고...


<jsp:useBean id="person" type="foo.Person" class="foo.Employee">

<jsp:setProperty name="person" property="name" param="userName" />

</jsp:useBean>



HTML 폼 코드를 수정해서-

입력필드 이름과 프로퍼티이름하고 동일하게 만듭니다.

param 속성을 명시하지 않아도 컨테이너가 자동적으로 설정합니다.


<jsp:useBean id="person" type="foo.Person" class="foo.Employee">

<jsp:setProperty name="person" property="name" param="userName" />

<jsp:setProperty name="person" property="name" param="empId" />

//<jsp:setProperty name="person" property="*" />

</jsp:useBean>


... 입력필드도 name, empId

... 프로퍼티 이름도 name, empId

... //심지어 모든 프로퍼티 설정까지


<jsp:setProperty> 액션은 String 형 요청 파라미터를 받아,

이를 int 형으로 변환한 다음

빈의 해당 프로퍼티 설정자를 호출합니다.


파싱 (parsing), 변환(conversion) 할 필요가 없어요!





자바를 사용하지 않고
자바 객체에 접근할 수 있는 방법

EL Expression Language 


프로퍼티가 객체일 경우에는?

즉, 프로퍼티의 프로퍼티 (내장 프로퍼티)

Person이 가진 Dog의 name 프로퍼티를 출력해봅시다.


>> 표현식 언어 EL 이 답입니다!



<html><body>

Dog's name is: ${person.dog.name}

</body></html>


EL ${person.dog.name}

Script <%= ((foo.Person) request.getAttribute("person")).getDog().getNmae() %>



EL의 필요성만 잠깐 살펴보았으니,

이쯤 끊고! 다음 포스트에서 EL 에 대해 더 자세히 정리해보고자 합니다.