본문 바로가기

IT

9. JSP 자바빈 (JAVA Bean)

* 자바빈(JAVA Bean)

  • 데이터 모음 객체,  빈을 통해 원활한 DB작업 수행, 은닉을 통해 설계
  • jsp에서 객체를 가져오기 위한 기법으로 데이터 전달 오브젝트 파일라고도 한다. 
  • jsp페이지가 화면 표현 부분과 로직들이 같이 존재하여 복잡한 구성을 가급적 피하고, jsp페이지의 로직 부분을 분리해서 코드를 재사용함으로써 프로그램의 효율을 높이기 위해서 사용한다.
  • 자바빈이란 JAVA언어 데이터(변수)와 기능(메서드)으로 이루어진 클래스이다.
  •  자바빈은 데이터를 저장하는 변수, 데이터를 읽어오는 메서드(getter), 데이터를 저장할 때 사용하는 메서드(setter)로 이루어져있다.
  • 자바빈은 데이터베이스와의 반복적인 작업을 효율적으로 처리하기 위해 사용한다.
  • JSP에서는 액션태그를 사용하여 자바빈을 사용할 수 있는 방법이있다. 

 

* 자바빈 설계 규약

  • 설계규약을 따라야한다. 설계규약과 맞지않을 경우 자바빈의 특성을 갖지않을 클래스가 되어버린다.
  • 멤버변수마다 별도우 getter, setter메서드가 존재해야된다.
  • get메소드는 매개변수가 존재하지 않아야한다.
  • set메소드는 반드시 하나 이상의 매개변수가 존재해야한다.
  • 생성자는 매개변수가 존재하지 않아야한다.
  • 멤버변수의 접근제어자는 provate이고 각 getter, setter메서드의 접근제어자는 public, 클래스의 접근제어자는 public으로 정의된다.

 

* JSP 액션태그로 자바빈 사용하는 방법  (이방법을 사용해야된다.)

<jsp:useBean /> 태그 - 자바빈 객체를 생성하기 위한 태그

ex)  <jsp:useBean id = "자바빈 객체 이름" class = "자바빈이 위치한 실제 경로", scope = "객체를 사용할 범위" />

1. id - jsp 페이지에서 자바빈 객체에 접근할 때 사용할 이름을 지정

2. class - 패키지 이름을 포함한 자바빈 클래스의 완전한 경로를 입력함, 객체를 생성할 클래스명을 정의

3. scope - 자바빈 객체가 공유되는 범위를 지정 / 생략가능

   --a. page :하나의 jsp페이지를 처리할 때 사용되는 영역 / 디폴트 값

   --b request: 하나의 요청을 처리할 때 사용되는 영역

   --c. session : 하나의 웹 브라우저와 관련된 영역

   --d. application. 하나의 웹 어플리케이션과 관련된 영역

 

* JSP 액션태그로 setter와 getter메서드를 사용할 수 있다.

 

setter

<jsp:setPtopert/>태그 - 자바빈 클래스의 속성값을 설정하기 위한 태그

ex) <jsp:setPtoperty name="자바빈 id" property="자바빈 클래스의 변수명" value="할당할 값" />

   --a . name: 값을 변경할 자바빈 객체의 이름이 지정한다. useBean태그에서 id속성에 지정한 값을 그대로 사용한다.

   --b. property : 값을 지정할 프로퍼티의 이름을 지정한다. 자바빈 클래스의 변수명을 적어준다.

   --c. value: 프로퍼티의 값을 지정합니다. 표현식이나 EL도 사용할 수 있다.

 

getter

<jsp:getProperty/>태그 - 자바빈 클래스의 속성값을 가져오기 위한 태그

ex) <jsp:getProperty name="빈 이름" property="속성명" />

  -- a name: useBean태그에서 id속성에 지정한 값을 사용한다.

  -- b property: 프로퍼티의 값을 지정한다. 자바빈 클래스의 변수명을 적어준다.

 

 

 


 

실습

 

자바빈 사용하기.

- 만약 클라이언트 측에서 많은 매개값을 전달해 줄시 서버는 다시 db로 보낼 코드를 수많이 작성해야된다.

  하지만 자바빈을 사용하면 반복데이터 작업을 쉽게 처리할 수 있다. 

- 자바빈이니깐 자바 클래스를 만들어야한다. 

 

1. 자바빈 만들기.

- 자바클래스로 만들어줘야한다.

패키지 이름 : 회사 도메인주소() + 프로젝트 이름

 

2. 자바빈 코드 작성

-  아래 모습이 자바빈 클래스의 모습이다. 우리가 db에 저장할 값들을 변수로 만든다.

package : kr.co.koo.jspbasic.user

class : UserBean.java

package kr.co.koo.jspbasic.user;
/*
 * 자바빈
 * 자바빈은 DB와의 반복데이터 작업을 쉽게 처리하기 위한 클래스입니다.
 * 일반적으로 DB의 컬럼과 1:1로 매칭되는 멤버변수(필드)를 선언한다.
 * 자바빈 클래스는 은닉(캡슐화)private을 사용하여 데이터를 보호합니다. 
 * private를 사용하는 이유: id, pw등 데이터를 수정해버리면 안되기 때문에
 */
public class UserBean {
	
	private String id;
	private String pw;
	private String name;
	private String email;

/*
 * 자바빈 클래스는 일반적으로 기본생성자 1개(필수)와 모든 멤버변수를 
 * 초기화하는 생성자(선택)를 1개 선언합니다.
 * 
 */
public UserBean() {} //기본생성자 생성

// 모든 멤버변수를 초기화 하는 생성자
public UserBean(String id, String pw, String name, String email) {
	super(); //부모클래스를 상속, 생략가능
	this.id =id;
	this.pw =pw;
	this.name =name;
	this.email =email;	
}


//은닉: 오른쪽 마우스 > source > generate getters and setters.. 클릭하면 아래 내용이 자동 생성됨.
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 getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public String getEmail() {
	return email;
}

public void setEmail(String email) {
	this.email = email;
}

}

 

bean_make.jsp

- 각파라미터를 보냈다고 생각을 해보자. 위페이지에 4개를 보낸다고 생각해보자. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- bean을 쓰지않는 나쁜 예 -->
<%@ page import ="kr.co.koo.jspbasic.user.UserBean" %>
<!-- jsp액션태그로 자바빈 사용하는 법 -->

<%
	String id = request.getParameter("id");
%>
<jsp:useBean  id="user" class="kr.co.koo.jspbasic.user.UserBean" scope="request"/>
<jsp:setProperty name="user" property="id" value="<%=request.getParameter("id")  %>" />
//빈에 들어있는 변수를 Property라고 부른다.
<%
	//이걸 위로 올려보자. String id = request.getParameter("id"); 이 줄을 바꿔보자.
	String pw = request.getParameter("pw");
	String name = request.getParameter("name");
	
	//jsp:useBean  id="user" class= ~를 사용했기떄문에 아래코드가 가능. 
	user.setId(id);
	user.setPw(pw);
	user.setName(name);
	user.setEmail(request.getParameter("email")); //이렇게 한줄로도 쓸 수 있다.
	
	/*
    하지만 이방법도 좋은 방법은 아니다. 아래 두 줄을 액션태그를 통해 코딩 (위 코딩) 
	<!-- UserBean의 아래 두 줄을 액션태그를 이용해 코딩하는 방법 : <jsp:useBean  id="user" class="kr.co.koo.jspbasic.user.UserBean" scope="request"/>-->
	UserBean user = new UserBean(id, pw, name, email);
	request.setAttribute("user", user);
	*/
	
	/*
	<!--bean을 사용하지 않은 나쁜 예.  bean을 사용하려면 바로 위 두줄을 쓴다.-->
	request.setAttribute("user_id", id);
	request.setAttribute("user_pw", pw);
	request.setAttribute("user_name", name);
	request.setAttribute("user_email", email);
	*/
%>

<jsp:forward page="bean_use.jsp"></jsp:forward>

 

bean_use.jsp  <- 이걸 실행시킨다.

<%@page import="kr.co.koo.jspbasic.user.UserBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<jsp:useBean  id="user" class="kr.co.koo.jspbasic.user.UserBean" scope="request"/> //액션태그 사용
 <% //UserBean user = (UserBean)request.getAttribute("user"); <- 이것도 액션태그를 사용할 수 있다.%>
 
<!--   #아이디: <%= user.getId() %> <br/>  이줄을 엑션태그를 사용해서 바꾸는 방법. 바로 아랫줄-->
#아이디: <jsp:getProperty name="user" property="id" /> </br> //액션태그 사용
 #비번: <%= user.getPw() %> <br/>
 #이름: <%= user.getName() %> <br/>
 #이메일: <%= user.getEmail() %> <br/>
 

<%-- <!--bean을 사용하지 않은 나쁜 예.
# 아이디: <%= request.getAttribute("user_id") %> <br/>
# 비밀번호: <%= request.getAttribute("user_pw") %> <br/>
# 이름: <%= request.getAttribute("user_name") %> <br/>
# 이메일: <%= request.getAttribute("user_email") %> <br/>
--%>
</body>
</html>

bean 실습 2

- 폼에 입력한 값을 빈에 넣고, 포워드할때 빈을 보내서 bean_use에서 포워드로 들어온 빈 객체를 request로 꺼내서 getter로 화면에 뿌려보자.

 

bean.form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="bean_make.jsp" method="post">
	<div align="center">
	<table border="1">
			<tr>
				<td>아이디</td>
				<td><input type="text" name="id" size="10"></td>
				<td>비밀번호</td>
				<td><input type="password" name="pw" size="10"></td>
			</tr>
			<tr>
				<td>이름</td>
				<td><input type="text" name="name" size="10"></td>
				<td>이메일</td>
				<td><input type="text" name="email" size="10"></td>
			</tr>
			<tr>
				<td colspan="4" align="center"><input type="submit" value="회원가입"></td>
			</tr>			
		</table>
		</div>
</form>
</body>
</html>

 

bean_make.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="kr.co.koo.jspbasic.user.UserBean" %>
<%
	request.setCharacterEncoding("utf-8");
	//String id = request.getParameter("id");
	//String pw = request.getParameter("pw");
	//String name = request.getParameter("name");
	//String email = request.getParameter("email");
%>
<jsp:useBean id="user" class="kr.co.koo.jspbasic.user.UserBean" scope="request" /> 

<%--
	* 파라미터의 이름과 자바빈 클래스의 멤버변수명이 일치할 경우
	액션태그 setProperty의 속성 property값을 *로 지정하면
	자동으로 파라미터값을 읽어서 자바빈 클래스 변수에 저장합니다.
 --%>
<jsp:setProperty name="user" property="*" />
아래 4줄을 위 한줄로 적을 수 있다.
<%-- 
<jsp:setProperty name="user" property="id" value="<%= id %>" />
<jsp:setProperty name="user" property="pw" value="<%= pw %>" />
<jsp:setProperty name="user" property="name" value="<%= name %>" />
<jsp:setProperty name="user" property="email" value="<%= email %>" />
--%>
<%	
	//user.setId(request.getParameter("id"));
	//user.setPw(request.getParameter("pw"));
	//user.setName(request.getParameter("name"));
	//user.setEmail(request.getParameter("email"));
	
	//UserBean user = new UserBean(id, pw, name, email);
	//request.setAttribute("user", user);
	
	/*request.setAttribute("user_id", id);
	request.setAttribute("user_pw", pw);
	request.setAttribute("user_name", name);
	request.setAttribute("user_email", email);*/
%>
<jsp:forward page="bean_use.jsp" />

 

bean_use.jsp

<%@page import="kr.co.koo.jspbasic.user.UserBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="user" class="kr.co.koo.jspbasic.user.UserBean" scope="request" />
<% //UserBean user = (UserBean)request.getAttribute("user"); %>

# 아이디: <jsp:getProperty name="user" property="id" /> <br/>
# 비밀번호: <jsp:getProperty name="user" property="pw" /> <br/>
# 이름: <jsp:getProperty name="user" property="name" /> <br/>
# 이메일: <jsp:getProperty name="user" property="email" /> <br/>


<%-- # 아이디: <%= user.getId() %> <br/> 
# 비밀번호: <%= user.getPw() %> <br/>
# 이름: <%= user.getName() %> <br/>
# 이메일: <%= user.getEmail() %> <br/> --%>
<%-- 
# 아이디: <%= request.getAttribute("user_id") %> <br/>
# 비밀번호: <%= request.getAttribute("user_pw") %> <br/>
# 이름: <%= request.getAttribute("user_name") %> <br/>
# 이메일: <%= request.getAttribute("user_email") %> <br/>
--%>

</body>
</html>