빈즈(Beans)는 특정한 일을 독립적으로 수행하는 컴포넌트를 의미한다. 컴포넌트는 하나의 부품이라고 생각하면 쉽다.
JSP빈즈는 JSP와 연동하려고 만들어진 컴포넌트 클래스를 말한다. JSP 빈즈는 컨테이너에 위치하며, JSP에 데이터베이스 연동 등 프로그램적 요소를 모듈화할 수 있도록 도와주는 역할을 한다. 따라서 가능하면 JSP 코드 내에 스크립트릿을 사용하는 것보다는 빈즈를 만들어 사용하는 것이 좋다.
[ 빈즈 클래스 구조 ]
기본적으로 빈즈 클래스는 자바 클래스이므로, 자바 클래스 구성을 따른다. 다만 JSP 액션과 연동하기 위해 필요한 몇 가지 필수 구성의 차이가 있을 뿐이다. 하지만 이는 문법적인 제약이 아니기 때문에 규칙을 따르지 않더라도 컴파일 오류가 발생하지는 않는다. 다만 일반적인 매개변수가 없는 기본 생성자를 요구하므로 만일 매개변수가 있느 생성자를 구현하는 경우에는 반드시 기본 생성자를 명시적으로 선언해주어야만 문제가 발생하지 않는다.
[ 멤버 변수]
멤버 변수는 private로 선언해서 클래스 외부에서의 접근을 막는다. 따라서 멤버변수에 접근하려면 빈즈 클래스의 내부 메서드를 이용해야 한다. 임의의 메서드를 만들 수도 있지만, JSP 액션과의 연동과 호환성을 고려하여 getXxx, setXxx와 같은 이름을 사용해야 한다. 모든 멤버변수에 대해 getter 및 setter 메서드가 필요한 것은 아니므로 필요한 메서드만 정의해서 사용하면 된다.
[ getter, setter 메서드 ]
JSP 액션인 <jsp:setProperty name="ss" property="username" />에 의해 자동으로 호출되는 setter 메서드는 setUsername(String username)과 같은 형식으로 만든다. 여기에는 JSP 액션에서 지정한 property 이름의 첫 글자를 대문자로 하는 setXXX 형식의 메서드여야 한다는 규칙이 존재한다.
<jsp:getProperty name="ss" property="username" />에 의해 자동으로 호출되는 getter 메서드는 setter 메서드와 마찬가지로 public String getUsername()과 같이 선언되어 있어야 한다.
[ JSP에서 빈즈 선언 ]
JSP 빈즈 사용을 선언하는 방법은 다음과 같다.
<jsp:useBean id="mybean" scope="request" class="MyBean" />
- id는 빈즈 클래스의 인스턴스 이름으로 사용할 변수이다.
- class는 빈즈 클래스의 클래스 이름으로, 패키지 경로를 포함한다.
- scope는 빈즈 클래스의 범위로, page, request, session, application이 올 수 있다.
위의 JSP 빈즈 선언 소스코드는 자바로 표현하면 아래와 완전히 동일하다.
MyBean mybean = (MyBean)request.getAttribute("mybean");
if (mybean == null) {
mybean = new MyBean();
request.setAttribute("mybean", mybean);
}
소스코드를 보면 먼저 scope에 지정된 내장객체(위의 코드에서는 request)의 getAttribute를 이용해 해당 클래스의 인스턴스를 확인하고, null인 경우 새로운 인스턴스를 생성하는 것으로 되어 있다. 따라서 useBean 액션 이후의 JSP 페이지에서는 스크립트릿을 이용해 mybean을 참조변수로 활용할 수 있다. 이러한 특징을 이용해서 간단한 출력일 때는 getProperty를 이용하는 대신 표현식을 사용하는 경우도 많이 있다.
위 코드에서 보듯이 useBean 액션의 결과가 클래스의 인스턴스를 만드는 것이기는 하지만, id를 참조변수로 연결하는 과정이 무조건 새로운 인스턴스를 생성하는 것이 아니라 내장객체의 속성 관리를 이용한다는 점을 기억해야 한다.
[ JSP에서 빈즈 속성 설정 ]
JSP에서 빈즈를 선언한 다음, setProperty와 getProperty 액션을 통해 빈즈 값을 설정하고 가져올 수 있다.
<jsp:setProperty name="mybean" property="username" />
<jsp:setProperty name="mybean" property="userpasswd" />
- name은 빈즈 클래스의 인스턴스 이름으로, id 값에 설정했던 변수 이름이다.
- property는 속성 값으로 빈즈 클래스의 setXxx(Xxx는 속성 이름)메서드와 매칭될 속성 값이다.
그런데 만약 HTML 폼에서 입력 항목이 100개라고 가정하면, 100행에 걸쳐 setProperty를 해야 할 것이다. 개발자 입장에서는 엄청난 노가다를 해야하는 입장이다. 하지만 JSP는 다음과 같이 모든 HTML 폼 양식 항목과 빈즈 클래스 set 메서드를 대응시키는 방법을 제공한다.
<jsp:setProperty name="mybean" property="*" />
- '*' 하나로 모든 작업이 끝!!
setProperty의 액션은 다음 소스코드와 동일한 기능을 수행한다.
<%
mybean.setUserid(request.getParameter("username"));
mybean.setPasswd(request.getParameter("userpasswd"));
>%
[ 빈즈에서 JSP로 속성 데이터 가져오기 ]
빈즈에 설정된 값을 getProperty를 통해 읽어올 수 있다.
<jsp:getProperty name="mybean" property="username" />
<jsp:getProperty name="mybean" property="userpasswd" />
getProperty는 HTML 중간에 위치할 수 있기 때문에 HTML로 화면을 구성하고, 실제로 데이터의 출력이 필요한 부분에 넣어주면 된다. 아래 코드를 보자.
<tr>
<td>이름<td>
<td><jsp:getProperty name="mybean" property="username" /></td>
</tr>
getProperty 역시 setProperty와 마찬가지로 자바 코드로 변환할 수 있는데, 앞선 코드를 getProperty 액션을 사용하지 않는 형식으로 바꾸면 다음과 같다.
<tr>
<td>이름<td>
<td><%=mybean.getUsername() %></td>
</tr>
물론, 표현언어(Expression Language)로도 사용할 수 있다.
<tr>
<td>이름<td>
<td>${mybean.username}</td>
</tr>
'Programming > Servlet' 카테고리의 다른 글
서블릿(Servlet) url 매핑기법 2가지(web.xml 방식, 어노테이션 방식) (0) | 2020.07.30 |
---|---|
[JSP] JSTL(Jsp Standard Tag Library) 정리 - <c:set>,<c:out>,<c:remove>,<c:if>,<c:choose>,<c:when>,<c:otherwise>,<c:forEach>,<c:forTokens> 등 (1) | 2019.10.27 |
[JSP] 표현언어(Expression Language)란? (0) | 2019.10.09 |
(Servlet/JSP) setCharacterEncoding, setContentType 정리 (4) | 2019.10.02 |
JSP 내장객체를 활용한 간단한 twitter 구현하기 (0) | 2019.10.01 |