Model1 방식에서 사용하기 때문에 현재에 들어서는 사용하지 않는 태그이기도하다.
하지만 Java Beans가 무엇이고, 사용하는 방법은 다른 View Template Engine과 크게 다르지 않다.
때문에 간단한 개념만 다룰것이다.
JSP 페이지의 문제점
- HTML을 제외한 여러 로직이 존재해 View와 Controll이 완전한 분리가 되지 않음.
- JSP페이지 내 작성된 프로그램 코드는 다시 사용하기 어렵기 때문에 코드의 중복이 발생한다.
- 이러한 문제점을 해결하기 위해 Java Beans을 사용해 HTML과 Java Code를 분리할 수 있다.
자바빈즈란?
https://tatsu.tistory.com/entry/JAVA-JAVA-Beans
빈을 이용한 JSP파일 작성
- JSP에서 특별한 행동을 하기 위해 내부적으로 자바빈을 사용하기 위한 액션태그를 지원한다.
- useBean, setProperty, getPropety와 같은 세가지 종류가 존재하며, 액션태그와 동일하게 XML방식을 사용한다.
- useBean태그는 필요에 따라 유효 범위(Scope)를 지정할 수 있으며, 종류로는 page, request, session, application 등이 존재한다.
- JSP 컨테이너는 빈 태그를 통해 자바 빈즈 규약에 맞게 작성된 메서드를통해 값을 저장하거나 가져올 수 있게 해준다.
예제
- Model1 방식에서 사용하기 때문에 현재에 들어서는 사용하지 않는 액션태그이기도 하다.
- 하지만 Java Beans가 무엇이고,
자바빈즈 등록
RegisterBean.java
public class MemberBean {
private String id;
private String pw;
private String name;
private String birthday;
private String email;
//public MemberBean() {}
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 getBirthday() { return birthday; }
public void setBirthday(String birthday) { this.birthday = birthday; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
JSP페이지 작성
member.jsp
- 사용자가 회원가입 양식을 입력 후 memberProc.jsp에 넘기면, Java Bean을 이용하여 확인하는 예제이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
</head>
<body>
<h1>회원가입</h1>
<form action="memberProc.jsp" method="POST" name="regForm">
<div>아이디 : <input type="text" name="id"></div>
<div>패스워드 : <input type="password" name="pw"></div>
<div>이름 : <input type="text" name="name"></div>
<div>생년월일 : <input type="text" name="birthday"></div>
<div>이메일 : <input type="email" name="email"></div>
<input type="submit" value="회원가입">
<input type="reset" value="다시쓰기">
</form>
</body>
</html>
memberProc.jsp
- 작성한 bean을 가져와 property를 초기화해준다.
- 이때 서버로 넘어온 form data를 일일히 초기화해줘도 되나 만능문자(*)를 통해 모든 form data를 초기화가능하다.
- 여기서 주목할점은 property의 호출방식인데 setId()와 같이 메드를 호출하지 않고 field의 name만 작섬했음에도 불구하고 bean에 property가 등록된다. 이는 JSP가 java beans의 convention을 지켜 bean을 등록했을것이라고 예상했기 때문에 제공할 수 있는 편의성이다.
- 이러한 편의성은 JSP의 빈즈태그뿐만 아니라 EL, JSTL 그리고 다른 view Template에서도 제공하기 때문에 유심히 봐둬야 할 것이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="regBean" class="myapp.beans.MemberBean" scope="page">
<jsp:setProperty property="id" name="regBean"/>
<jsp:setProperty property="pw" name="regBean"/>
<jsp:setProperty property="name" name="regBean"/>
<jsp:setProperty property="birthday" name="regBean"/>
<jsp:setProperty property="email" name="regBean"/>
<%-- <jsp:setProperty property="*" name="regBean"/> --%>
</jsp:useBean>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 확인</title>
</head>
<body>
<h1>회원가입 확인</h1>
<div>아이디 : <jsp:getProperty property="id" name="regBean"/></div>
<div>패스워드 : <jsp:getProperty property="pw" name="regBean"/></div>
<div>이름 : <jsp:getProperty property="name" name="regBean"/></div>
<div>생년월일 : <jsp:getProperty property="birthday" name="regBean"/></div>
<div>이메일 : <jsp:getProperty property="email" name="regBean"/></div>
<input type="button" value="확인완료">
<input type="button" value="다시쓰기" onclick="history.back()">
</body>
</html>
실행결과
- 사실 해당예제는 Bean의 장점을 볼 수 있는 예제는 아니다.
- 그저 Java Bean이 무엇이고, 어떻게 사용될 수 있고 Convention을 지켜 개발함으로써 얻을 수 있는 편의성을 확인하기 위한 예제이다.
Bean을 이용해 DB에 접속하는 Model1 방식의 개발방법
DB연결을 위한 클래스 작성
import java.sql.Connection;
import java.sql.DriverManager;
public class DBUtil {
private static Connection conn;
public static Connection open() {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String id = "jsstudy";
String pw = "java1234";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, id, pw);
return conn;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void close() {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
공통된 로직을 처리할 DAO작성
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import myapp.dbutil.DBUtil;
public class BeanDAO {
private Connection conn;
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet rs;
public BeanDAO() {
this.conn = DBUtil.open();
}
public Vector<RegisterBean> getRegisterList() {
Vector<RegisterBean> vlist = new Vector<>();
try {
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from tblregister");
while(rs.next()) {
RegisterBean rb = new RegisterBean();
rb.setId(rs.getString("id"));
rb.setPw(rs.getString("pw"));
rb.setName(rs.getString("name"));
rb.setNum1(rs.getString("num1"));
rb.setNum2(rs.getString("num2"));
rb.setEmail(rs.getString("email"));
rb.setPhone(rs.getString("phone"));
rb.setZipcode(rs.getString("zipcode"));
rb.setAddress(rs.getString("address"));
rb.setJob(rs.getString("job"));
vlist.add(rb);
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try { rs.close(); } catch (SQLException e) { e.printStackTrace();}
try { stmt.close(); } catch (SQLException e) { e.printStackTrace();}
try { conn.close(); } catch (SQLException e) { e.printStackTrace();}
}
return vlist;
}
}
DB조회 결과를 전달할 DTO(java bean)등록
- java bean의 상용구 코드를 제거하기 위해 lombok을 사용하였다.
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class RegisterBean {
private String id;
private String pw;
private String name;
private String num1;
private String num2;
private String email;
private String phone;
private String zipcode;
private String address;
private String job;
}
출력결과를 표시할 View(.jsp)작성
<%@page import="java.util.*"%>
<%@page import="myapp.beans.RegisterBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:useBean id="regMgr" class="myapp.beans.BeanDAO" scope="page"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP에서 DB 연동</title>
</head>
<body>
<h1>회원 정보</h1>
<%
Vector<RegisterBean> vlist = regMgr.getRegisterList();
int counter = vlist.size();
for(int i=0; i<counter; i++) {
RegisterBean regBean = vlist.get(i);
System.out.println(regBean);
%>
<div><%= regBean.getId() %></div>
<div><%= regBean.getPw()%></div>
<div><%= regBean.getName()%></div>
<div><%= regBean.getNum1()%></div>
<div><%= regBean.getNum2() %></div>
<div><%= regBean.getEmail() %></div>
<div><%= regBean.getPhone() %></div>
<div><%= regBean.getZipcode() %><%= regBean.getAddress() %></div>
<div><%= regBean.getJob() %></div>
<% } %>
<div>total user : <%= counter %></div>
</body>
</html>
동작방식 (Model 1)
- Java Bean이 Model의 역할을 한다.
- 만약 DB를 조회하는 모든 JSP페이지에서 DB Connection을하고 Query를 날리는것을 반복해서 넣어야된다고 상상해보자 이 과정은 매우 지루하고 코드가 지저분해질 것이다.
- 따라서 DB의 Connection과 질의를 담당하는 비지니스 로직을 JSP페이지에서 분리함으로써 반복되는 코드를 줄이는 것이 JSP의 빈즈태그의 핵심이다.
결과
'JSP' 카테고리의 다른 글
[JSP]EL (0) | 2023.03.16 |
---|---|
[WEB] HTTP 프로토콜에서 상태를 지속시키기 위한 방법들 (1) | 2023.03.15 |
[JSP] 내부객체 (0) | 2023.03.15 |
[JSP]JSP의 지시자와 액션태그 (0) | 2023.03.15 |
[JSP]JSP의 스크립트 요소 (0) | 2023.03.14 |