본문으로 바로가기

JSP 자바빈(JavaBean)과 <jsp:useBean> 액션태그

category 코딩/JSP 2016. 11. 16. 11:53






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


그런데 이런 데이터를 보여주는 기능과 단순하게 화면을 출력하는 부분이 하나의 JSP에 뒤섞여 있으면 문제가 생긴다. 기능을 확장하거나 코드를 재사용하기가 상당히 어려워진다. 그렇기에 JSP에서는 데이터를 자바빈(JavaBean)이라는 클래스에 담아서 값을 보여준다.






자바빈(JavaBean) 작성방법


자바빈은 클래스이므로 기존의 자바 클래스를 작성하는 방법과 동일하다. 자바빈의 경우 데이터를 담을 프로퍼티(맴버변수)와 데이터를 가져오거나 세팅하는 기능을 하는 메서드로 구성된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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;
    }    
}
cs



수동으로 get, set메서드를 만들 수 있으나 프로퍼티가 많을 경우 상당히 번거롭다. 이럴 경우 간단히 메서드를 만드는 방법이 있다.






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


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



1. <jsp:useBean>



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


<태그의 속성>

  • id : JSP페이지에서 자바빈 객체에 접근 할 때 사용하는 이름이다.

  • class : 패키지 이름을 포함한 자바빈 클래스의 완전한 이름을 입력

  • scope : 자바빈 객체가 저장될 영역을 지정. page, request, session, application 중 하나를 값으로 갖는다. 기본값은 page 


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



1
2
3
4
5
6
7
8
9
10
11
<jsp:useBean id="member" class="test.MemberBean"/>
 
 
위의 액션태그를 코드로 바꾸면 아래와 같다.
 
 
MemberBean member = (MemberBean)request.getAttribute("member");
if(member == null){
    member = new MemberBean();
    request.setAttribute("member", member)
}
cs



태그에서 id 속성에서 지정한 이름의 속성 값이 있을 경우 그 객체를 그대로 사용하고, 없을 경우 새로운 객체를 생성한다. 이것이 useBean 태그의 기능이다.


scope 속성을 사용할 경우 속성의 값에 따라 서로 다른 기본 객체에 저장된다.


  • page : pageContext 기본 객체

  • request : request 기본 객체

  • session : session 기본 객체

  • application : application 기본 객체




2. <jsp:setProperty>



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


<태그의 속성>

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

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

  • value : 프로퍼티 값. 표현식 사용가능


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



1
2
<jsp:useBean id="member" class="test.MemberBean"/>
<jsp:setProperty name="member" property="id" value="abcd" />
cs



property 속성의 값을 * 로 지정할 수 있다. 이럴 경우 각각의 프로퍼티의 값을 같은 이름을 갖는 파라미터의 값으로 설정한다.



1
2
<jsp:useBean id="member" class="test.MemberBean"/>
<jsp:setProperty name="member" property="*" />
cs



위 코드의 경우 id 파라미터의 값을 id 프로퍼티의 값으로, pw 파라미터의 값을 pw 프로퍼티의 값으로, tel 파라미터의 값을 tel 프로퍼티의 값으로, addr 파라미터의 값을 addr 프로퍼티의 값으로 지정하게 될 것이다.




3. <jsp:getProperty>



<jsp:getProperty name="자바빈" property="이름" />


<태그의 속성>

  • name : <jsp:useBean> 액션 태그의 id 속성에서 지정한 값을 사용

  • property : 값을 가져올 프로퍼티의 이름




자바빈 예제


  • Member 테이블 쿼리


1
2
3
4
5
6
7
create table member
(
    id varchar2(20not null primary key,
    pw varchar2(20not null,
    addr varchar2(20),
    tel varchar2(20)
);
cs



  • 패키지 구조




  • join.jsp


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<html>
<head>
    <title>회원가입 화면</title>
</head>
<body>
        <form action="joinProcess.jsp" method="post">
            <table border="2">
                <tr>
                    <td>아이디</td>
                    <td><input type="text" name="id" /></td>
                </tr>
                <tr>
                    <td>비밀번호</td>
                    <td><input type="password" name="pw" /></td>
                </tr>
                <tr>
                    <td>주소</td>
                    <td><input type="text" size="20" name="addr"/></td>
                </tr>
                <tr>
                    <td>전화</td>
                    <td><input type="text" name="tel"/></td>
                </tr>
            </table>
            <br><br><input type="submit" value="회원가입">
        </form>    
</body>
</html>
cs


  • joinProcess.jsp


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import="test.model.MemberDAO" %>     
<html>
<head>
    <title>회원가입 처리 JSP</title>
</head>
<body>
        <%
            // 한글 인코딩 처리
            request.setCharacterEncoding("euc-kr");
        %>
        
        <b>회원가입 정보를 확인하세요.</b>
        <br/><br/>
        
        <!-- 자바빈 액션태그 사용 -->
        <jsp:useBean id="memberBean" class="test.bean.MemberBean" />
        <jsp:setProperty name="memberBean" property="*" />
 
        <%
            // 회원가입을 처리할 DAO클래스의 객체를 생성한다.
            MemberDAO dao = MemberDAO.getInstance();
        
            // 회원정보를 담고있는 memberBean 객체를 DAO클래스로 전달한다.
            dao.joinMember(memberBean);
        %>
        
        <b>회원가입이 되었습니다.</b><br>
        
        <b><%=memberBean.getId() %></b>님의 회원정보입니다. <br/><br/>
        
        <table border="2">
                <tr>
                    <td>아이디</td>
                    <td><%=memberBean.getId()%></td>
                </tr>
                <tr>
                    <td>비밀번호</td>
                    <td><%=memberBean.getPw()%></td>
                </tr>
                <tr>
                    <td>주소</td>
                    <td><%=memberBean.getAddr()%></td>
                </tr>
                <tr>
                    <td>전화</td>
                    <td><%=memberBean.getTel()%></td>
                </tr>
            </table>
        </table>
</body>
</html>
cs



  • DBConnection.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package test.model;
 
import java.sql.Connection;
import java.sql.SQLException;
 
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
 
// DB 커넥션을 담당하는 클래스
public class DBConnection 
{
    public static Connection getConnection() throws SQLException, NamingException, 
    ClassNotFoundException{
            Context initCtx = new InitialContext();
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            DataSource ds = (DataSource) envCtx.lookup("jdbc/orcl");
            Connection conn = ds.getConnection();
            return conn;
    }
}
 
cs



  • MemberBean.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package test.bean;
 
// 회원정보를 담을 자바빈
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 getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }    
}
 
cs



  • MemberDAO.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package test.model;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
 
import test.bean.MemberBean;
 
// 회원가입 처리를 담당하는 클래스
public class MemberDAO 
{
    private static MemberDAO instance;
    private MemberDAO(){}
    
    //싱글톤 패턴
    public static MemberDAO getInstance(){
        if(instance == null ) instance = new MemberDAO();
        return instance;
    }
    
    // 회원가입 메서드
    public void joinMember(MemberBean bean) {
        
        Connection conn = null;
        PreparedStatement pstm = null;
 
        try {
            // 쿼리
            StringBuffer query = new StringBuffer();
            query.append("INSERT INTO MEMBER VALUES(?,?,?,?)");
            // 커넥션 연결
            conn = DBConnection.getConnection();
            // 쿼리생성
            pstm = conn.prepareStatement(query.toString());
            
            // MemberBean에 담긴 값을 가져와 쿼리문에 세팅한다.
            pstm.setString(1, bean.getId());
            pstm.setString(2, bean.getPw());
            pstm.setString(3, bean.getAddr());
            pstm.setString(4, bean.getTel());
 
            // 쿼리실행
            pstm.executeUpdate();
            // 완료시 커밋
            conn.commit(); 
 
        } catch (Exception sqle) {
            try {
                conn.rollback(); // 오류시 롤백
            } catch (SQLException e) {
                e.printStackTrace();
            }
            throw new RuntimeException(sqle.getMessage());
        } finally {
            try {
                if (pstm != null) {
                    pstm.close();
                    pstm = null;
                }
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (Exception e) {
                throw new RuntimeException(e.getMessage());
            }
        }
    } // end joinMember()
}
 
cs




소스코드 다운로드 (war파일)


TEST_JavaBean.war



위에서 DB 연결은 JNDI를 이용하였다, 소스코드를 실행하기 전에 JNDI관련 포스팅을 읽어보면 도움이 될 것이다.






RSS구독 링크추가 트위터 이메일 구독