JSP 자바빈즈란?
JSP 자바빈즈는 JSP의 표준 액션 태그로 접근할 수 있는 자바 클래스로서 값을 가지는 속성(멤버변수)과 값을 설정하는 메소드(setter), 값을 추출하는 메소드(getter)로 이루어져 있습니다. 자바빈즈는 하나의 JSP 페이지에 종속적으로 사용되는 것이 아니라, 여러 JSP 페이지에서 사용될 수 잇습니다. 자바빈즈는 다른 자바 클래스와 마찬가지로 자바 객체입니다.
장점
- 폼 데이터 처리 용이
클라이언트로 부터 입력을 받아 처리하기 위해서, 만약 50개의 질의 문자열이 있으면 50번의 request.getParameter( )를 통해 추출해야하므로 상당히 수고스럽다. 그렇지만 자바빈즈를 사용하면 액션 태그를 한 번만 사용해서 모든 질의 문자열의 값을 추출하여 객체에 저장할 수 있습니다. - 자바빈즈 활용 범위 확장용이
웹에서 사용하는 HTTP 프로토콜의 무상태 특성 때문에 상태정보 유지 기술이 필요합니다. 여러 페이지에서 사용해야 하는 데이터는 자바빈즈를 이용하여 쉽게 유지하여 여러 범위에서 사용할 수 있습니다. - 컴포넌트 기반 구현 가능
JSP 페이지 내에서 필요한 비즈니스 로직을 컴포넌트로 만들어 활용하면 JSP 페이지의 크기는 작아지고, 각 JSP 페이지에서 필요로 하는 기능은 컴포넌트 재활용을 통해 구현되므로 웹 애플리케이션을 효과적으로 구현할 수 있습니다.
개발 규약
JSP 페이지 내에서 자바빈의 활용은 표준 액션 태그로 수행합니다. <jsp:useBean>, <jsp:setProperty>, <jsp:getProperty> 가 JSP 자바빈즈를 활용할 때 사용하는 표준 액션 태그입니다. 이 액션 태그를 활용하여 자바빈즈 객체가 올바르게 사용되려면 자바빈즈 객체가 정해진 조건에 따라 만들어져 있어야 합니다.
이렇게 자바빈즈로서 동작하게 하기 위해 자바빈즈를 생성할 때 지켜야 하는 규칙을 JSP자바빈즈 개발 규약이라고 합니다.
다음은 JSP 자바빈즈 개발 규약입니다.
- 패키지화
JSP 페이지에서 자바빈즈를 사용할 때 기본 패키지에 있으면 인식이 안 됩니다. 그래서 반드시 패키지화가 되어 있어야 합니다. -
기본생성자 존재
자바빈즈의 객체 생성은 <jsp:useBean> 액션 태그로 생성하는데 객체가 생성될 때 기본 생성자를 이용하기 때문에 반드시 기본 생성자가 있어야 한다. 기본 생성자는 인자값이 없는 생성자를 말한다. - 멤버변수의 접근자는 private로 선언
자바빈즈 객체의 속성 값은 외부에서 직접 접근할 수 없도록 private으로 선언합니다. 자바빈즈 객체의 속성값은 메소드로만 접근하게 해야 합니다. - getter 메소드
private로 선언한 멤버 변수의 값을 반환하는 메소드를 작성합니다. 메소드는 값을 반환하는 기능으로 구성되며, 메소드의 반환 타입은 반환하는 멤버변수의 타입으로 지정합니다. 이 메소드의 이름을 만드는 규칙은 get 다음에 멤버변수의 이름을 붙인다. 이때 이름의 첫글자는 대문자로 변경하고, 두 번째 글자부터는 대소문자, 철자 동일하게 추가합니다. - setter 메소드
private로 선언한 멤버 변수의 값을 설정하는는 메소드를 작성합니다. 이 메소드의 이름을 만드는 규칙은 set 다음에 멤버변수의 이름을 붙인다. 이 메소드는 멤버변수 값을 수정하는 기능으로 구성되어야 하며, 값을 수정만 하므로 반환 값과 반환 타입은 지정할 필요가 없고 수정할 값을 처리하는 매개변수를 선언해야 합니다. 이때 이름의 첫글자는 대문자로 변경하고, 두 번째 글자부터는 대소문자, 철자 동일하게 추가합니다. - getter와 setter 접근자는 public으로 선언
private으로 선언한 멤버변수의 값을 추출하는 getter 메소드와 setter 메소드의 접근자는 누구나 접근이 가능 하도록 public으로 선언합니다. 자바빈즈의 getter와 setter 메소드를 public으로 선언해야 JSP 페이지에서 이 메소드를 호출할 수 있습니다.
JSP 자바빈즈 생성과 사용
1. 자바빈즈 생성하기
먼저 패키지를 생성합니다.
클래스 생성
생성한 패키지를 선택한 후 마우스 오른쪽 버튼을 눌러 [New] - [Class]를 선택합니다.
생성할 클래스 이름은 HelloBean입니다. 클래스 이름을 입력한 후 <Finish>를 선택합니다.
생성된 HelloBean 클래스의 초기 형태입니다.
package job.study.beans; public class HelloBean { public HelloBean() { // TODO Auto-generated constructor stub } }
이제 다음와 같이 클래스의 멤버 변수를 private로 정의하고 생성자에서 초기값을 지정합니다.
package job.study.beans; public class HelloBean { private String name; private String number; public HelloBean() { // TODO Auto-generated constructor stub this.name = "이름이 없습니다."; this.number = "번호가 없습니다."; } }
getter / setter 메소드 추가
getter 메소드와 setter 메소드가 추가될 위치에 포커스를 놓고 그림와 같은 방법으로 자동으로 추가합니다.
[Source] - [Generate Getters and Setters]
아래 화면에서 처럼 getter/setter 메소드를 작성할 멤버변수를 선택합니다.
여기서는 [Select All]을 선택하여 모든 멤버변수에 대한 getter/setter 메소드를 생성합니다.
멤버변수의 선택이 끝나면 [OK]를 선택합니다.
아래는 getter/setter 메소드가 추가된 HelloBean 클래스 입니다.
package job.study.beans; public class HelloBean { private String name; private String number; public HelloBean() { // TODO Auto-generated constructor stub this.name = "이름이 없습니다."; this.number = "번호가 없습니다."; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
2. 자바빈즈 사용하기
자바빈즈를 사용하는 방법을 자바코드와 액션코드를 비교하여 확인해보자
객체 생성
//자바 코드 HelloBean hello = new HelloBean(); //표준 액션 태그 <jsp:useBean class="job.study.bean.HelloBean" id="hello">
<jsp:useBean> 액션 태그로 객체가 생성되면 주어진 자바빈즈 클래스에서 기본 생성자만 호출됩니다. 따라서 JSP자바빈즈 객체는 기본 생성자가 있어야 합니다.
속성은 다음과 같다.
- id 속성
주어진 페이지에서 자바빈즈 객체를 식별할 수 있는 유일한 명칭을 지정할 때 사용합니다. 이 id 속성의 값을 가지고와 각각의 객체를 구분합니다. id 속성의 값을 지정할 때 규칙은 유일해야하고 대소문자를 구분한다 그리고 영문자, 숫자, _(언더바) 문자로 시작해야 합니다. - class 속성
사용하려는 자바빈즈 객체의 실제 클래스명을 패키지명과 함께 지정 합니다. - type 속성
자바빈즈 클래스의 객체에 접근할 떄 어떠한 타입으로 접근할 것인지를 지정합니다. 이 속성이 생략되면 기본으로 주어진 자바빈즈 클래스의 타입으로 접근하지만, 특별히 부모 type으로 접근하게 하려면 type 속성을 사용하여 부모 타입으로 지정합니다. 빈 객체는 JSP 컴파일 단계에서 이 속성으로 지정되는 클래스 타입으로 변환됩니다. - scope 속성
scope 속성값으로 page, request, session 그리고 application 중 하나를 지정할 수 있다 이 속성이 생략되면 기본값으로 page가 적용됩니다.
- page : 하나의 JSP 페이지에서만 사용
- request : 요청이 처리되는 동안 forward, include 된 페이지 간에 사용
- session : 클라이언트 단위로 사용
- application : 웹 애플리케이션 단위로 사용
getter 메소드 호출
//자바 코드 hello.getName(); //표준 액션 태그 <jsp:getProperty property="name" name="hello">
<jsp:useBean> 액션 태그로 자바빈즈 객체를 생성한 후 속성 값을 추출할 때, 즉, getter 메소드를 호출하여 필요한 기능을 수행하고 그 결과를 주어진 위치에 출력할때 사용합니다.
속성은 다음과 같다.
- name 속성
사용하려는 자바빈의 <jsp:useBean> 태그에서 정의해 놓은 id 속성값과 동일하게 지정합니다. - property 속성
property 속성에는 값을 추출하려는 자바빈즈 객체의 멤버변수 이름을 지정합니다.
setter 메소드 호출
//자바 코드 hello.setName("codegizer"); //표준 액션 태그 <jsp:setProperty property="name" name="hello" value="codegizer">
<jsp:useBean> 액션 태그로 자바빈즈 객체를 생성한 후 속성 값을 수정할 때, 즉, getter 메소드를 호출하는 표준 액션 태그입니다.
속성은 다음과 같다.
- name 속성
사용하려는 자바빈의 <jsp:useBean> 태그에서 정의해 놓은 id 속성값과 동일하게 지정합니다. - property 속성
property 속성에는 값을 수정하려는 자바빈즈 객체의 멤버변수 이름을 지정합니다. - value 속성
자바빈즈 객체의 속성을 변경하려는 값을 지정합니다. - param 속성
질의 문자열에서 param 속성에 할당된 값과 같은 name의 값으로 자바빈의 속성값을 설정합니다.//자바 코드 hello.setName(request.getParameter("irum")); //표준 액션 태그 <jsp:setProperty property="name" name="hello" param="irum">
- 설정값 생략
만일 값을 지정하지 않으면 질의문자열에서 멤버변수와 같은 name을 찾아서 자동으로 설정됩니다.//표준 액션 태그 <jsp:setProperty property="name" name="hello"> //자바 코드 hello.setName(request.getParameter("name"));
-
property = "*"
property 속성에 *(와일드카드)를 표기하는 방법은 자바빈 객체의 속성값들을 초기화하는 매우 강력한 방법이다. 클라이언트로부터 입력받은 질의 문자열을 추출하여 자바빈즈 객체에 바인딩하는 데 편리합니다.//표준 액션 태그 <jsp:setProperty property="*" name="hello"> //자바 코드 hello.setName(request.getParameter("name")); hello.setNumber(request.getParameter("number"));
※주의할 점
setter 메소드 호출시 자바빈즈 객체의 멤버변수와 같은 이름으로 추출되므로 자바빈즈의 멤버 변수 이름과 질의 문자열의 파라미터 이름을 대소문자까지 동일하게 지정해야지만 값이 올바르게 설정됩니다.
3. HelloBean 객체를 표준 액션 태그들을 사용하여 활용해보자.
example17.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Java Bean</title> </head> <body> <jsp:useBean class="job.study.beans.HelloBean" id="hello" /> <jsp:getProperty property="name" name="hello" /><br> <jsp:getProperty property="number" name="hello" /><br> <jsp:setProperty property="name" name="hello" value="codegizer"/><br> <jsp:setProperty property="number" name="hello" value="12345"/><br> <hr> <jsp:getProperty property="name" name="hello" /><br> <jsp:getProperty property="number" name="hello" /><br> </body> </html>
실행결과
실행결과를 보면 처음에는 이름와 번호가 없다고 출력되고 있다. 그 이유는 HelloBean 클래스를 다시 살펴보면 생성자에서 멤버변수를 위와 같이 초기화 했기 때문이다. 그리고 그 다음 줄에는 setProperty로 설정한 값이 이후의 getProperty에 의해 출력되는 것을 볼 수 있다.
이번에는 질의 문자열을 전달하여 파라미터가 반영되도록 코드를 수정해보자
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Java Bean</title> </head> <body> <jsp:useBean class="job.study.beans.HelloBean" id="hello" /> <jsp:getProperty property="name" name="hello" /><br> <jsp:getProperty property="number" name="hello" /><br> <jsp:setProperty property="name" name="hello" param="a"/> <jsp:setProperty property="number" name="hello" param="b"/> <hr> <jsp:getProperty property="name" name="hello" /><br> <jsp:getProperty property="number" name="hello" /><br> </body> </html>
실행결과
실행결과를 보면 질의문자열에서 전달한 a와 b의 값이 setProperty에 의해 자바빈즈 객체에 설정되어 출력되는 것을 볼 수 있다.
마지막으로 질의문자열에 각 파라미터를 setProperty롤 자바빈즈 객체의 멤버변수와 매칭하는 부분을 와일드 카드로 바꿔서 다시 한번 실행해보자.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Java Bean</title> </head> <body> <jsp:useBean class="job.study.beans.HelloBean" id="hello" /> <jsp:getProperty property="name" name="hello" /><br> <jsp:getProperty property="number" name="hello" /><br> <jsp:setProperty property="*" name="hello"/> <hr> <jsp:getProperty property="name" name="hello" /><br> <jsp:getProperty property="number" name="hello" /><br> </body> </html>
실행결과
주소표시줄의 질의문자열을 보면 파라미터 이름이 name와 number로 바뀐 것을 볼 수 있다. 이것은 앞에서 와일카드 사용시 주의할 점을 설명했듯이, 질의 문자열의 파라미터 이름을 HelloBean 자바빈즈 객체의 멤버변수의 이름와 동일하도록 지정한 것이다.