MVC란 Model - View - Controller 의 약자로, 일반 PC 프로그램 개발에 사용되는 디자인 채턴을 웹 어플리케이션에 도입한 것. 즉, 웹 어플리케이션을 화면 부분, 요청 처리부분, 로직 처리 부분으롤 나누어 개발하는 방법
MVC 특징
∙ 각 기능이 분리되어 있어 개발 및 유지보수가 편하다.
∙ 각 기능의 재사용성이 높아진다.
∙ 디자이너와 개발자의 작업을 분업화해섯 쉽개 개발할 수 있다.
MVC 구성요소
∙ Model : 비즈니스 로직을 처리한다.
∙ Controller : 사용자의 요청 및 흐름 제어를 담당한다.
∙ View : 사용자에게 보여줄 화면을 담당한다.
컨트롤러는 사용자로부터 요청을 받아 어떤 비즈니스 로직을 처리해야 할 지 제어한다.
모델은 데이터베이스 연동 같은 비즈니스 로직을 처리하고, 뷰는 모델에서 처리한 결과를 화면에 구현하여 클라이언트로 전송한다.
MVC 기능
Controller
∙ 서블릿이 컨트롤러의 역할을 한다.
∙ 클라이언트의 요청을 분석한다.
∙ 요청에 대해서 필요한 모델을 호출한다.
∙ Model에서 처리한 결과를 보여주기 위해 JSP를 선택한다.
Model
∙ 데이터베이스 연동과 같은 비즈니스 로직을 수행한다.
∙ 일반적으로 DAO와 VO 클래스로 이루어져 있다.
View
∙ JSP가 화면 기능을 담당한다.
∙ Model에서 처리한 결과를 화면에 표시한다.
회원 정보 조회 기능 구현
1) 브라우저에서 /mem.do로 요청한다.
2) 서블릿 MemberController가 요청을 받아 MemberDAO의 listMembers()메소드를 호출한다.
3) MemberDAO의 listMembers() 메소드에서 SQL문으로 회원 정보를 조회한 후 회원 정보를 MemberVO에 설정하여 반환한다.
4) 다시 MemberController에서는 조회한 회원 정보를 회원 목록창으로 포워딩 한다.
5) 회원 목록창에서 포워딩한 회원 정보를 목록으로 출력한다.
회원 정보 조회 기능 구현해보기
[WebContent]-[WEB-INF]-[lib]에 jstl-12.jar을 추가해준다.
listMember.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*,ex01.*" pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원정보</title>
<style>
.cls1{ font-size: 40px; text-align: center; }
.cls2{ font-size: 20px; text-align: center; }
table, td, th {
border : 1px solid black;
border-collapse : collapse;
};
</style>
</head>
<body>
<p class="cls1">회원정보</p>
<table align="center" border="1">
<tr align="center" bgcolor="lightgray">
<td width="7%">아이디</td>
<td width="7%">비밀번호</td>
<td width="7%">이름</td>
<td width="7%">이메일</td>
<td width="7%">가입일</td>
</tr>
<c:choose>
<c:when test="${empty membersList}">
<tr>
<td colspan=5>
<b>등록된 회원이 없습니다.</b>
</td>
</tr>
</c:when>
<c:when test="${!empty membersList }">
<c:forEach var="man" items="${membersList}">
<tr align="center">
<td>${mem.id}</td>
<td>${mem.pwd}</td>
<td>${mem.name}</td>
<td>${mem.email}</td>
<td>${mem.joinDate}</td>
</tr>
</c:forEach>
</c:when>
</c:choose>
</table>
<a href="#">
<p class="cls2">회원가입하기</p>
</a>
</body>
</html>
실행하면 다음과 같은 화면
MemberVO.java
package ex01;
import java.sql.Date;
public class MemberVO
{
//필드
String id;
String pwd;
String name;
String email;
Date joinDate;
//생성자
public MemberVO()
{
System.out.println("MemberVO 생성자 호출");
}
//인자 4개를 갖는 생성자
public MemberVO(String id, String pwd, String name, String email)
{
this.id = id;
this.pwd = pwd;
this.name = name;
this.email = email;
}
//인자 5개를 갖는 생성자
public MemberVO(String id, String pwd, String name, String email, Date joinDate2)
{
this.id = id;
this.pwd = pwd;
this.name = name;
this.email = email;
this.joinDate = joinDate2;
}
//각 속성에 대한 getter/setter
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
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;
}
public Date getJoinDate() {
return joinDate;
}
public void setJoinDate(Date joinDate) {
this.joinDate = joinDate;
}
}
MemberDAO.java
package ex01;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class MemberDAO
{
//필드
private DataSource dataFactory;
private Connection conn;
private PreparedStatement pstmt;
//생성자
public MemberDAO()
{
try
{
Context ctx = new InitialContext();
Context envContext = (Context) ctx.lookup("java:/comp/env");
dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
}
catch (Exception e) {
e.printStackTrace();
}
}
//listMembers 메소드
public List<MemberVO> listMembers()
{
//membersList 객체 생성
List<MemberVO> membersList = new ArrayList<MemberVO>();
try
{
conn = dataFactory.getConnection();
//SQL문 작성
String query = "select * from t_member order by joinDate desc"; //가입한 날짜 내림차순으로
System.out.println(query);
//PrepareStatement 객체를 생성하면서 SQL문을 인자로 전달한다.
pstmt = conn.prepareStatement(query);
ResultSet rs = pstmt.executeQuery();
while(rs.next())
{
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String email = rs.getString("email");
Date joinDate = rs.getDate("joinDate");
//조회한 회원 정보를 레코드별로 MemberVO 객체의 속성에 저장
MemberVO memberVO = new MemberVO(id, pwd, name, email, joinDate);
//membersList에 MemberVO 객체들을 차례대로 저장
membersList.add(memberVO);
}
rs.close();
pstmt.close();
conn.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
return membersList;
}
//addMember 메소드
public void addMember(MemberVO m)
{
try
{
conn = dataFactory.getConnection();
String id = m.getId();
String pwd = m.getPwd();
String name = m.getName();
String email = m.getEmail();
String query = "INSERT INTO t_member(id, pwd, name, email)" + "VALUES(?,?,?,?)";
System.out.println(query);
pstmt = conn.prepareStatement(query);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
pstmt.setString(3, name);
pstmt.setString(4, email);
//SQL문 실행
pstmt.executeUpdate();
pstmt.close();
conn.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
'Web > JSP' 카테고리의 다른 글
[JSP] scope란? (0) | 2023.05.17 |
---|---|
바인딩(Binding) (0) | 2022.02.11 |
세션을 이용한 웹페이지 연동기능 (0) | 2022.02.05 |
DataSource 이용해 데이터베이스 연동하기 (0) | 2022.02.05 |
서블릿의 비즈니스 로직 처리 방법 (0) | 2022.01.31 |