티스토리 뷰

 

 

JSP 페이지의 주용 기능 중 하나는 데이터를 보여주는 기능이다. 흔하게 볼 수 있는 게시판을 예로 들면 글 목록 보기, 글쓰기, 글 읽기 등의 기능이 이에 해당.

 

그런데 이런 데이터를 보여주는 기능과 단순하게 화면을 출력하는 부분이 하나의 JSP에 뒤섞여 있으면 문제가 생긴다.

 

능을 확장하거나 코드를 재사용하기가 상당히 어려워진다. 그렇기에 JSP에서는 데이터를 자바빈(JavaBean)이라는 클래스에 담아서 값을 보여준다.

자바빈 클래스는 데이터를 저장하는 필드 , 데이터를 읽어올 때 사용되는 메서드 , 그리고 값을 저장할 때 사용되는 메서드로 구성됩니다. ( getter / setter / 사용자 정의 생성자 ) 

 

useBean은 자바빈 객체를 생성하는 액션태그이다.

[1] 기본 생성자가 반드시 존재해야한다. (인자가없는 디폴트 생성자)

사용 이유

-JSP페이지에 뷰 부분과 로직 부분을 같이 작성하게되면 굉장히 복잡해지게 됩니다. 

그런 것을 피하기 위해 JSP 페이지의 로직부분을 모듈화해서 분리함으로써 프로그램의 효율을 높이는 것이 사용하는 목적입니다.

 

 

 

■자바빈 문법

자바빈은 클래스이므로 기존의 자바 클래스를 작성하는 방법과 동일하다.

자바빈의 경우 데이터를 담을 프로퍼티(맴버변수)와 데이터를 가져오거나 세팅하는 기능을 하는 메서드로 구성된다.

package test;  // 자바빈만 모아놓을 패키지, 생략가능
 
public class MemberBean 
{
    // 아이디, 비밀번호, 주소, 전화를 담을 프로퍼티(맴버변수)
    // 프로퍼티에 직접 접근할 수 없게 private를 사용한다.
    private String id;
    private String pw;
    private String addr;
    private String tel;
    
    /* 데이터를 가져오거나(get), 세팅하는(set)
    *  기능을 하는 메서드를 만든다.
    *  - 데이터를 가져오는 경우 - get메서드
    *  - 데이터를 세팅하는 경우 - set메서드
    */
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPw() {
        return pw;
    }
    public void setPw(String pw) {
        this.pw = pw;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel= tel;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }    
}

 

■ JSP에서 자바빈을 사용하기 위한 액션태그 (3 가지 )

 

 

자바빈 액션태그는 <jsp:useBean>, <jsp:getProperty>, <jsp:setProperty> 3가지가 있다.

 

<jsp:useBean>

 :  JSP페이지에서 사용할 자바빈 객체를 지정 해주는 기능을 합니다.

id - JSP 페이지에서 자바빈 객체에 접근할 때 사용할 이름을 명시합니다.
class - 패키지 이름을 포함한 자바빈 클래스의 완전한 이름을 입력합니다.
scope - 자바빈 객체가 저장될 영역을 지정. page, request, sessioin, application중 하나를 값으로 가집니다.

 

ㆍ문법

<jsp:useBean id="빈이름" class="자바빈 클래스 이름" scope="범위" />

ㆍ속성

  1.  -id   : JSP페이지에서 자바빈 객체에 접근 할 때 사용하는 이름이다.
  2.  class  : 패키지 이름을 포함한 자바빈 클래스의 완전한 이름을 입력
  3. scope  : 자바빈 객체가 저장될 영역을 지정. page, request, session, application 중 하나를 값으로 갖는다. 기본값은 page 

 

useBean은 자바빈 객체를 생성하는 액션태그이다. 위에서 작성한 자바빈을 이용한 간단한 예를 들어보자.

<jsp:useBean id="member" class="test.MemberBean"/>
 
 
위의 액션태그를 코드로 바꾸면 아래와 같다.
 
 
MemberBean member = (MemberBean)request.getAttribute("member");
if(member == null){
    member = new MemberBean();
    request.setAttribute("member", member)
}

태그에서 id 속성("member") 에 지정한 이름의 속성 값이 있을 경우 그 객체를 그대로 사용하고,

member==null 즉 , member에 값이 없을 경우 새로운 객체를 생성한다.

 

맨윗줄이 이러한 행동들을 한번에 해주는 useBean 태그의 기능이다.


<jsp:useBean>액션 태그에서 중요한 점은 객체를 생성할 뿐만 아니라 지정한 영역에 저장한다. 그리고 이미 영역에 객체가 존재하면 그 객체를 사용한다.

<jsp:useBean>액션 태그의 scope 속성값에 따라 객체는 서로 다른 기본 객체에 저장된다.

ㆍscope 속성 사용

 -속성의 값에 따라 서로 다른 기본 객체에 저장된다. 즉, type 속성을 사용하면 지정한 영역에 이미 객체가 존재한다고 가정한다.

-type에 선언된 ex) type="reques"이면 request 기본 객체의 id속성(id="member")이 없을 경우

  1. page : pageContext 기본 객체

  2. request : request 기본 객체

  3. session : session 기본 객체

  4. application : application 기본 객체

 

결과적으로, <jsp:useBean> 태그를 사용하면 영역별로 공유할 데이터를 쉽게 저장할  수 있다.

<jsp:setProperty>

-프로퍼티는 자바빈에 저장되는 값을 나타낸다.

-메서드 이름을 사용해서 프로퍼티의 이름을 결정

-프로퍼티 값을 변경하는 메서든느 프로퍼티의 이름 중 첫 글자를 대문자로 변환한 무낮열 앞에 set을 붙은디ㅏ.

 또한 프로퍼티 값을 읽어 오는 메서드는 프로퍼티의 이름 중 첫 글자를 대문자로 변환한 문자열 앞에 get을 붙임

ㆍ문법

<jsp:setProperty name="자바빈" property="이름" value="값" />

 

ㆍ태그의 속성

  1. name : 프로퍼티 값을 변경할 자바빈 객체의 이름. <jsp:useBean> 액션 태그의 id 속성에서 지정한 값을 사용

  2. property : 값을 지정할 프로퍼티의 이름

  3. value : 프로퍼티 값. 표현식 사용가능 OR EL(${값})을 사용할 수 있다.  (value대신 param속성 사용 가능 단, 파라미터 값을 프로퍼티 값으로 사용할 때 ) 함께 사용 불가능

Property 속성값을 * 를 주면 모든 프로퍼티 값이 세팅된다. 그러나 폼으로부터 넘어오는 파라미터의 이름과 개수가 프로퍼티의 이름과 개수와 일치해야 한다.

<jsp:useBean id="testBean" class="com.bean.testBean" scope="page">

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

</jsp:useBean>

 

 

setProperty는 생성된 자바빈 객체에 프로퍼티 값을 지정하는 기능을 한다. 위에서 사용한 MemberBean의 id 프로퍼티 값을 abcd로 변경하고 싶다면 다음과 같이 지정하면 된다.

 

<jsp:getProperty>

   - 자바빈 객체에서 저장된 프로퍼티 값을 사용하기 위해 사용된다.

<jsp:getProperty name="자바빈이름" property="프로퍼티명" vlaue="" />

- name  : 속성은 자바빈 객체의 이름을 명시한다. (필수)

- property : 속성은 프로퍼티 명을 기술한다. (필수)

 

. 자바빈 프로퍼티 타입에 따른 값 매핑

 

자바빈 필드 타입이 int이면 어떻게될까?

 

<jsp:setProperty name="number" property="width" value="100" />

 

 

setProperty에서 value는 알맞게 100인 int형으로 변환되어 처리된다. 

 

 

실무환경)

 

cf> useBean 액션태그가 MVC패턴에서의 사용 부적합 이유

 

MVC모델을 사용할 경우 로직은 자바 클래스에서 처리를 하게 되는데 클래스에서는 useBean태그를 사용할수가 없다. 그래서 request.getParameter() 메서드를 사용해서 파라미터의 값을 읽어와 자바 객체에 저장하거나 또는 비슷한 모듈을 사용한다.  따라서 MVC모델을 사용할 경우 useBean태그를 사용할 일이 많지 않다.

 

하지만 오직 jsp만을 가지고 구현해야하는 경우에는 쓰인다.

 

또한 JSP2.0부터는 EL 표현언어가 추가되면서 이러한 액션 태그들을 사용하는 것 보다 훨 간결하게 코드를 이용해 프로퍼티 값을 읽어올 수 있다. 

ex)JSP에서 액션태그를 사용한 코드 <jsp:getProperty name="memberInfo" property="email" />

ex) 표현언어를 사용한 코드 ${memberInfo.email}