Hoon222y

[JSP & Servlet] 7장. JSP와 자바 빈즈 본문

코딩/교육

[JSP & Servlet] 7장. JSP와 자바 빈즈

hoon222y 2019. 1. 16. 21:39

Chap07 JSP와 자바 빈즈

 


7.1  빈즈(beans) 개요

- 특정한 일을 독립적으로 수행하는 컴포넌트


- 엔터프라이즈 자바 빈즈(EJB) : 서로 다른 시스템에서 사용, 로컬 자바 빈 : 하나의 시스템에서 사용

서블릿, JSP는 컨테이너에 종속되므로, 컨테이너를 벗어나면 사용할 수 없음

빈은 컨테이너와 무관함

뷰와 모델을 분리해서 컨테이너와 관련없이 순수한 자바 클래스인 빈을 이용할 수 있음

 

7.1.1 자바 빈즈

- 컴포넌트에는 공통의 규격이 있어야 함

- 초기에는 서로다른 회사에서 GUI 컴포넌트를 만들고, 이들을 조합해서 프로그램을 개발할 수 있도록 하는것이 초기 목적이었다. 

- 자바 빈즈는 순수한 자바 클래스이지만 컴포넌트로 사용하려면 지켜야하는 규칙이 있음


7.2. JSP와 빈즈 연동

- JSP 빈즈는 JSP 에서 사용할 수 있는 자바 컴포넌트로, 빈즈 액션과 결합해서 웹프로그램을 간단하게 할 수 있음.


빈즈 클래스 구조

- 빈즈 클래스는 자바 클래스이므로 일반적인 자바 클래스 구성을 따름

- 일반적인 빈즈는 매개변수가 없는 기본생성자를 요구하므로 만일 매개변수가 있는 생성자를 구현하는 경우에는 반드시 기본 생성자를 명시적으로 선언해주어야 한다. 

- 빈즈 클래스의 접근 지정자는 public이어야 함

- 모든 멤버 변수가 반드시 private해야 함

- getter, setter를 이용해 멤버 변수에 접근해야 하며, 이 둘은 접근 지정자가 public이어야 함(모든 멤버 변수에 대해 getter, setter를 만드는것이 아니라 필요한 메서드만 정의해서 사용  )

캡슐화를 하는 것임

JSP는 컨테이너에 의해 관리되고 실행됨. 빈은 사용자가 생성. 따라서 JSP와 자바 빈즈는 동일 패키지일 수 없음. 외부 클래스에 접근하기 위해서 public으로 설정

가능하면 JSP 코드 내에 스크립트릿을 사용하는 것보다 빈즈를 만들어 사용하는 것이 좋음

1
2
3
4
5
6
7
8
9
10
11
12
class xxxBean{
    //멤버변수 : 데이터베이스 테이블의 칼럼 이름과 매칭
    private String xxx;
    
    //get,set 메서드 : 멤버 변수와 매칭
    public String getXxx(){
        return xxx;
    }
    public SetXxx(String xxx){
        this.xxx=xxx;
    }
}
cs




useBean : 빈즈 선언을 위한 액션


* useBean 속성

id : 빈즈 클래스의 인스턴스 이름으로 사용할 변수

class : 빈즈 클래스의 클래스명, 패키지 경로 포함한 풀패스네임 지정

scope : 빈즈 클래스의 범위(page, request, session, application) , 생명주기 범위를 이야기 하는것으로,  빈즈 클래스의 생존 범위를 결정하는 속성값이다. 

-> 언제까지 유효하게 유지? Scope를 application으로 지정하면 싱글턴 / session 이면 session 의 유효범위 동안 해당 클래스 인스턴스의 상태가 유지된다느 의미

1
<jsp:useBean id = "mybean" scope="request" class="MyBean" />
cs

이며 이는 자바의 아래 코드와 같은 의미이다. 

1
2
3
4
5
6
MyBean mybean = (MyBean)request.getAttribute("mybean");
if(myBean == null){
    myBean = new MyBean();
    request.setAttribute("mybean",mybean);
}
 
cs



[사용자 로그인 구현 ]

 login_form.html 

 사용자 로그인을 위해 아이디와 비밀번호를 입력받는 화면

 login.jsp

 입력받은 아이디 정보를 빈즈 클래스를 이용해서 확인하고 처리하는 jsp

 LoginBean.java

 사용자가 입력한 계정 정보를 매필하는 빈즈 클래스로써, 미리 저장된 계정 값과 비교해 로그인 성공 여부를 반환하는 checkUser() 메서도를 포함한다. 


[login_form.html]

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
<html>
<head>
<meta charset="UTF-8">
</head>
<body bgcolor="#FFFFFF">
<div align=center>
<H2>ch07 : 로그인</H2>
<HR>
<form method="post" action="login.jsp" name="form1">
    <table width="250" border="1" align="center" cellspacing="0" cellpadding="5">
        <tr>
        <td colspan="2" align="center">로그인</td>
        </tr>
    <tr>
        <td>아이디</td>
        <td><input type="text" name="userid" size=10></td>
    </tr>
    <tr>
        <td>비밀번호</td>
        <td><input type="password" name="passwd" size=10></td>
    </tr>
    <tr>
        <td colspan="2" align="center">
        <input type="submit" name="Submit" value="로그인"></td>
    </tr>
</table>
</form>
</div>
</body>
</html>
cs

 


[LoginBean.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
package myJSP.chap07;
public class LoginBean {
    private String userid;
    private String passwd;
    final private String USERID = "손흥민";
    final private String PASSWD = "7777"
 
    // getter, setter 생성
    public String getUserid() {
        return userid;
    }
    public void setUserid(String userid) {
        this.userid = userid;
    }
    public String getPasswd() {
        return passwd;
    }
    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }
 
    public boolean checkUser() {
        boolean result = false;
        if(passwd.equals(PASSWD) && userid.equals(USERID)) {
            result = true;
        }
        return result;
    }
}
cs

 

* login.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
<%@ page contentType="text/html;charset=UTF-8" 
    import="myJSP.ch07.*"
%>
<%
    LoginBean login = new LoginBean();
    
    if(request.getMethod().equals("POST")){
        request.setCharacterEncoding("UTF-8")
        String userid = request.getParameter("userid");
        String passwd = request.getParameter("passwd");
        
        login.setUserid(userid);
        login.setPasswd(passwd);
    }
%>
 
<HTML>
<HEAD><TITLE>ch07 : login.jsp </TITLE></HEAD>
<BODY>
<div align=center>
<H2>로그인 예제</H2>
<HR>
<% 
    if(!login.checkUser()) {
        out.println("로그인 실패 !!");    
    }
    else {
        out.println("로그인 성공 !!");
    }
%>
<HR>
사용자 아이디 : <%= login.getUserid() %><BR>
사용자 패스워드 : <%= login.getPasswd() %>
 
</div>
</BODY>
</HTML>
cs

 

* login.jsp

자바 코드 대신에 useBeans 이용

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
<%@ page contentType="text/html;charset=UTF-8"
 import="myJSP.chap07.*" %>
<%
    //액션으로 처리되지 않으므로 자바 코드 남김
    request.setCharacterEncoding("UTF-8");  
%>
<jsp:useBean id="login" class="myJSP.chap07.LoginBean" />
<!-- form의 파라미터명과 bean 객체에서의 이름이 일치해야 함(userid, passwd) -->
<jsp:setProperty name="login" property="userid" /<!-- setter 호출됨 -->
<jsp:setProperty name="login" property="passwd" /
<html>
<head>
    <TITLE>ch07 : login.jsp </TITLE>
</head>
<body>
    <div align=center>
    <H2>로그인 예제</H2>
    <HR>
    <% 
        if(!login.checkUser()) {
            out.println("로그인 실패");  
        }
        else {
            out.println("로그인 성공");
        }
    %>
    <HR>
    사용자 아이디 : <jsp:getProperty name="login" property="userid" /> <br>
    사용자 패스워드 : <jsp:getProperty name="login" property="passwd" />
    </div>
</BODY>
</HTML>
cs

 에서 9,10 줄을 <jsp:setProperty name="login" property="*" /> 로도 변경 가능하다. 

7번째 줄은 LoginBean 클래스를 login 이라는 이름으로 빈즈 객체를 사용하겠다는 부분이다. 




[ 주소록 구현 ]

addr_list.jsp 

 application scope에 저장된 AddrManager 객체를 통해 저장된 데이터를 가져와 출력

 addr_form.html

 주소록을 등록하기 위한 양식

 addr_add.jsp

 addr_form.html에서 입력된 내용을 AddrBean로 매핑하고 AddrManager를 이용해 데이터 추가 기능 수행

 AddrBean.java

 주소록 데이터 구조 매핑을 위한 빈즈 클래스

 AddrManager.java

 ArrayList를 이용해 AddrBean 형태의 데이터를 관리


[addr_list.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
<%@ page language="java" contentType="text/html; charset=UTF-8" 
pageEncoding="UTF-8" import="myJSP.ch07.*"%>
<jsp:useBean id="am" class="myJSP.ch07.AddrManager" scope="application"/>
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ch07 : 주소록 목록</title>
    <style>
        table, td {
            border-collapse: collapse;
            border: 1px solid gray;
            padding: 10px;
        }
    </style>
</head>
<body>
<div align=center>
<H2>주소록</H2>
<HR>
<a href="addr_form.html">주소추가</a><P>
<table border=1 width=500>
<tr><td>이름</td><td>전화번호</td><td>이메일</td><td>성별</td></tr>
<%
    for(AddrBean ab : am.getAddrList()) {
%>
    <tr>
    <td><%=ab.getUsername() %></td>
    <td><%=ab.getTel() %></td>
    <td><%=ab.getEmail() %></td>
    <td><%=ab.getSex() %></td></tr>
<%    
    }
%>
</table>
</div>
</body>
</html>
 
cs


[addr_form.html]

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
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <TITLE>ch07 : 주소록</TITLE>
    <style>
        table, td {
            border-collapse: collapse;
            border: 1px solid gray;
            padding: 10px;
        }
    </style>
</HEAD>
<BODY>
<div align="center">
    <H2>주소록 등록</H2>
    <HR>
    <form method="post" action=addr_add.jsp>
    <table>
    <tr>
        <td>이 름</td>
        <td><input type=text size=20 name=username></td>
    </tr>
    <tr>
        <td>전화번호</td>
        <td><input type=text size=20 name=tel></td>
    </tr>
    <tr>
        <td>이메일</td>
        <td><input type=text size=20 name=email></td>
    </tr>
    <tr>
        <td>성별</td>
        <td>
<select name=sex >
    <option selected>남</option>
    <option>여</option>
</select>
</td>
</tr>
<tr><td colspan=2 align=center>
    <input type=submit value="확인">
    <input type=reset value="취소"></td></tr>
</table>
 
</form>
</div>
</BODY>
</HTML>
cs


[addr_add.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
<%@ page language="java" contentType="text/html; charset=UTF-8" 
            pageEncoding="UTF-8" import="myJSP.ch07.*"%>
 
<% request.setCharacterEncoding("UTF-8"); %>
 
<jsp:useBean id="addr" class="myJSP.ch07.AddrBean"/>
<jsp:setProperty name="addr" property="*"/>
<jsp:useBean id="am" class="myJSP.ch07.AddrManager" scope="application"/>
<%
    am.add(addr);
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ch07 : addr_add.jsp</title>
    <style>
        table, td {
            border-collapse: collapse;
            border: 1px solid gray;
            padding: 10px;
        }
    </style>
 
</head>
<body>
<div align="center">
<H2>등록내용</H2>
이름 : <jsp:getProperty property="username" name="addr"/><P>
전화번호 : <%=addr.getTel() %><P>
이메일 : <%=addr.getEmail() %> <P>
성별 : <%=addr.getSex() %>
<HR>
<a href="addr_list.jsp">목록 보기</a>
</div>
</body>
</html>
cs


------------------------------------------------------------------------------

자바 빈즈 클래스를 이용한 클래스

[AddrBean.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
package myJSP.ch07;
 
public class AddrBean {
 
    private String username;
    private String tel;
    private String email;
    private String sex;
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
}
cs



[AddrManager.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
package myJSP.ch07;
 
import java.util.ArrayList;
import java.util.List;
 
public class AddrManager {
 
    List<AddrBean> addrlist = new ArrayList<AddrBean>();
    
    public void add(AddrBean ab) {
        addrlist.add(ab);
    }
    
    public List<AddrBean> getAddrList() {
        return addrlist;
    }
    
    public AddrBean getAddr(String username) {
        for(AddrBean ab : addrlist) {
            if(ab.getUsername().equals(username))
                return ab;
        }
        return null;
    }
}
cs


Comments