그동안 우리가 작성할 때는 편했다.
자바 쓰고 싶으면 스크립틀릿 태그 사용했고 값 쓰고 싶으면 표현식 사용했다.
그런식으로 파일을 만들다보니 다른 개발자가 보았을 때 가독성이 떨어지는 것.
만약 HTML문서에는 태그만 있다면?
태그를 제공할테니 이 태그로 객체화하고 게터세터도 만든다면?
JSP의 표준 태그를 통해 접근할 수 있는 자바 클래스로서 멤버변수와 setter getter 메소드로 이루어져 있다.
객체화를 할 때에는 반드시 기본 생성자만 호출할 수 있는 메소드
자바빈즈 태그
<%MemberVO member = new MemberVO();%> 스크립틀릿 태그에서->
<jsp:useBean class="com.korea.beans.MemberVO" id="member">
자바 코드가 섞여있지 않고 마치 태그로만 이루어져 있는거 같아 가독성이 좋아보인다.
<%member.setName("홍길동");%>
<jsp:setProperty property="name" name="member" value="홍길동">
<%member.getName();%>
<jsp:getProperty property="name" name="member">
- 패키지화
: 패키지에 이름을 붙이는 작업
- 필드 접근자를 private으로 설정
자바빈즈는 getter setter로 접근하기 때문에
- getter, setter 메소드는 public으로 설정
- 기본생성자 선언
JDBC를 사용하여 데이터베이스 연동하기
우선 DBconnecter 생성
package com.jspex.beans;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBconnecter {
public static Connection getConnection() {
Connection conn = null;
try {
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String user = "hr";
String pw = "hr";
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, user, pw);
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로딩 실패");
} catch (SQLException e) {
System.out.println("DB 접속 실패");
} catch (Exception e) {
System.out.println("알 수 없는 오류 " + e);
}
return conn;
}
}
MemberVO에서 필드 생성
package com.jspex.beans;
//NUM NUMBER PRIMARY KEY,
//NAME VARCHAR2(1000),
//BIRTHDAY DATE
public class MemberVO {
private int num;
private String name;
private String birthday;
public MemberVO() {
this.name = "이름이 없습니다.";
this.birthday = "생일이 등록되지 않았습니다.";
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
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;
}
}
MemberDAO 에서 select메소드 생성
package com.jspex.beans;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
public class MemberDAO {
Connection conn;
PreparedStatement pstm;
ResultSet rs;
public ArrayList<MemberVO> select(String name) {
String query = "SELECT * FROM TBL_MEMBER WHERE NAME = ?";
ArrayList<MemberVO> members = new ArrayList<>();
MemberVO member = null;
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd");
try {
conn = DBconnecter.getConnection();
pstm = conn.prepareStatement(query);
pstm.setString(1, name);
rs = pstm.executeQuery();
while(rs.next()) {
member = new MemberVO();
member.setNum(rs.getInt(1));
member.setName(rs.getString(2));
member.setBirthday(sdf.format(rs.getDate(3)));
members.add(member);
}
} catch (SQLException e) {
System.out.println("selece(String) 쿼리 오류 " + e);
} catch (Exception e) {
System.out.println("select(String) 알 수 없는 오류 " + e);
} finally {
try {
if(rs != null) {
rs.close();
}
if(pstm != null) {
pstm.close();
}
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e.getMessage());
}
}
return members;
}
}
이제 이 메소드를. 즉 데이터베이스를 화면에서 사용할 것인데, 자바빈즈를 사용할 것이다.
javabeans_test.jsp 생성
<jsp:useBean> 객체화를 해주는 태그. 기본생성자만 호출. id는 객체명. class는 해당 객체의 풀 경로. 즉 패키지까지 다 써준다.
MemberVO 와 MemberDAO를 불러옴.
우리가 배운 걸로는 아직까지는 스크립틀릿을 같이 써준다
<%@page import="com.jspex.beans.MemberVO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:useBean class="com.jspex.beans.MemberVO" id="vo"/>
<jsp:useBean class="com.jspex.beans.MemberDAO" id="dao"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>자바빈즈 예제</title>
</head>
<body>
<!-- HTML 주석은 컴파일을 막지 않고 보여주는 부분만 주석처리해준다.
setProperty를 HTML주석 처리해도 화면에 남음. 컴파일을 막지 않기 때문. 화면에 한동석 12-04가 그대로 뜬다. -->
<%--
JSP 주석은 컴파일도 주석처리 된다. 주석처리 후 실행해보면
"이름이 없습니다. 생일이 등록되지 않았습니다."
위 VO생성자에서 초기화 해두었던 값이 나옴.
--%>
<%--
<jsp:setProperty property="name" name="vo" value="한동석"/>
<jsp:setProperty property="birthday" name="vo" value="12-04"/>
--%>
<%
ArrayList<MemberVO> members = dao.select("한동석");
%>
<table border=1>
<%for(int i=0; i<members.size(); i++) {%>
<jsp:setProperty property="name" name="vo" value="<%=members.get(i).getName() %>"/>
<jsp:setProperty property="birthday" name="vo" value="<%=members.get(i).getBirthday() %>"/>
<tr>
<%-- <td><%=members.get(i).getName()%></td>
<td><%=members.get(i).getBirthday()%></td> --%>
<td><jsp:getProperty property="name" name="vo"/></td>
<td><jsp:getProperty property="birthday" name="vo"/></td>
</tr>
<%
}
%>
</table>
<%-- <jsp:getProperty property="name" name="vo"/>
<jsp:getProperty property="birthday" name="vo"/> --%>
</body>
</html>
브라우저 결과는 한동석12-04. DB에서 INSERT 한동석 04-25를 하고 JSP에서 다시 실행하면 한동석12-04 한동석 04-25가 같이 나온다.
결과적으로 하나의 파일에서는 하나의 언어만 쓸 수 있게끔 다 태그 또는 다 자바. 이런 식으로 자꾸 분리를 하는구나 알아갈 수 있겠다.