1. SQL로 Table 생성 및 데이터 추가
//테이블 생성 SQL
CREATE TABLE member(
id VARCHAR2(100) PRIMARY KEY,
password VARCHAR2(100) NOT NULL,
name VARCHAR2(100) NOT NULL,
address VARCHAR2(100)
)
// 데이터 추가 SQL
INSERT INTO member(id,password,name,address) VALUES('logitech','m331','로지텍','강남');
INSERT INTO member(id,password,name,address) VALUES('samsung','galaxy','삼성','영통');
SELECT COUNT(*) FROM member; // 멤버 숫자 세는 SQL
SELECT * FROM member; // 모든 멤버 정보 조회 SQL
2. MVC 중 Model 부분 작성
package org.waterpunch.praticeMVC.model;
public class MemberVO {
private String id;
private String password;
private String name;
private String address;
public MemberVO() {
super();
// TODO Auto-generated constructor stub
}
public MemberVO(String id, String password, String name, String address) {
super();
this.id = id;
this.password = password;
this.name = name;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "MemberVO [id=" + id + ", password=" + password + ", name=" + name + ", address=" + address + "]";
}
}
package org.waterpunch.praticeMVCmodel1.model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
// DAO : Data Access Object 데이터베이스 연동 로직을 정의한 객체
public class MemberDAO {
private String driver="oracle.jdbc.OracleDriver";
private String url="jdbc:oracle:thin:@127.0.0.1:1521:xe";
private String user="scott";
private String pass="tiger";
public MemberDAO() throws ClassNotFoundException {
Class.forName(driver);
}
public void closeAll(PreparedStatement pstmt,Connection con) throws SQLException {
if(pstmt!=null)
pstmt.close();
if(con!=null)
con.close();
}
//메서드 오버로딩
public void closeAll(ResultSet rs,PreparedStatement pstmt,Connection con) throws SQLException {
if(rs!=null)
rs.close();
closeAll(pstmt, con);
}
// 멤버 숫자 세는 메서드
public int getTotalMemberCount() throws SQLException {
int count=0;
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
con=DriverManager.getConnection(url, user, pass);
String sql="select count(*) from member";
pstmt=con.prepareStatement(sql);
rs=pstmt.executeQuery();
if(rs.next())
count=rs.getInt(1);
}finally {
closeAll(rs, pstmt, con);
}
return count;
}
// ID를 통해서 멤버 정보 찾는 메서드
public MemberVO findMemberById(String id) throws SQLException{
MemberVO vo=null;
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
con=DriverManager.getConnection(url, user, pass);
String sql="select name,address from member where id=?";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, id);
rs=pstmt.executeQuery();
if(rs.next()) {
vo=new MemberVO(id,null,rs.getString(1),rs.getString(2));
}
}finally {
closeAll(rs, pstmt, con);
}
return vo;
}
}
3. VIew(JSP) 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Model2 MVC</title>
</head>
<body>
<h3>Model2 MVC Basic</h3>
<ul>
<li><a href="AllMemberCountServlet">총회원수 조회</a></li>
<li><a href="findMemberById-form.jsp">회원검색</a>
</ul>
<hr>
<img src="Model2-1.png"><br><br>
<img src="Model2-2.png"><br><br>
<img src="4_forward.png">
</body>
</html>
<!-- 아이디를 통해 그 아이디에 해당하는 정보를 검색하는 Form -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원검색화면</title>
</head>
<body bgcolor="lime">
<form action="FindMemberByIdServlet">
아이디 <input type="text" name="memberId" required="required">
<button type="submit">검색</button>
</form>
</body>
</html>
4. Controller 생성 (Servlet)
package org.waterpunch.praticeMVCmodel2.controller;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.kosta.webstudy13.model.MemberDAO;
@WebServlet("/AllMemberCountServlet")
public class AllMemberCountServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public AllMemberCountServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
MemberDAO dao=new MemberDAO();
int count=dao.getTotalMemberCount();
//request 객체에 setAttribute를 이용해 count값을 "totalCount"에 회원수를 저장한다
//view에서 getAttribute("totalCount") 를 통해 count값을 가져올 수 있다
request.setAttribute("totalCount", count);
//forward방식으로 view를 선택하여 이동시켜 클라이언트에게 응답하게 한다
request.getRequestDispatcher("membercount-view.jsp").forward(request, response);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package org.waterpunch.praticeMVCmodel2.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.kosta.webstudy13.model.MemberDAO;
import org.kosta.webstudy13.model.MemberVO;
@WebServlet("/FindMemberByIdServlet")
public class FindMemberByIdServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FindMemberByIdServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id = request.getParameter("memberId"); // client로부터 검색할 회원의 아이디를 받아온다
// Model과 연동, 연동 결과를 반환받는다
try {
MemberDAO dao = new MemberDAO();
MemberVO vo = dao.findMemberById(id);
String view=null;
if(vo!=null) { //회원이 존재하면 find-ok-view.jsp로 이동
view="find-ok-view.jsp";
//검색 결과를 setAttribue를 이용해 vo값을 "memberVO" 이름으로 저장한다
//view에서 getAttribute("memberVO") 를 통해 vo값을 가져올 수 있다
request.setAttribute("memberVO", vo);
}else { //회원이 존재하지 않으면 find-fail-view.jsp로 이동
view="find-fail-view.jsp";
}
request.getRequestDispatcher(view).forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. 결과창(View) 생성 (JSP)
<!-- 모든 멤버수를 출력해주는 Form -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>membercount-view</title>
</head>
<body>
<%-- Controller가 request에 저장한 attribute 정보를 이용해 클라이언트에게 응답한다 --%>
총 회원수 <%=request.getAttribute("totalCount") %> 명
</body>
</html>
<!-- 아이디에 대한 정보가 존재할 시 출력되는 Form -->
<%@page import="org.waterpunch.praticeMVCmodel2.model.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>find-ok-view</title>
</head>
<body>
<% MemberVO vo=(MemberVO)request.getAttribute("memberVO"); %>
<h3>검색결과</h3>
아이디 <%=vo.getId() %><br>
이름 <%=vo.getName() %><br>
주소 <%=vo.getAddress() %>
</body>
</html>
<!-- 아이디에 대한 정보가 존재하지 않을 때 출력 -->
<!-- alert을 통해 존재하지 않는다 표시해주고 findMemberById-form.jsp로 되돌아간다 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>find-fail-view</title>
</head>
<body>
<%-- forward 방식이므로 request가 유지되므로 아래처럼 getParameter(name) 가 가능하다 --%>
<script type="text/javascript">
alert("<%=request.getParameter("memberId")%>아이디에 대한 회원정보가 존재하지 않습니다");
location.href="findMemberById-form.jsp";
</script>
</body>
</html>
- 웹브라우저 사용자의 요청을 Controller(Servlet)이 받음.
- VIew(JSP)는 사용자에게 보여주는 역할만 담당하고 실질적인 기능의 부분은 Model에서 담당
장점 : 협업과 유지보수에 유리하다 | 단점 : 개발시간이 오래걸린다 |
규모가 크고 개발 후에도 주기적으로 유지보수가 필요한 프로젝트에 적합 |
모델2 방식은 실질적으로 보여지는 HTML과 Java 소스를 분리해 놓았기 때문에 모델1 방식에 비해
개발을 확장시키기도 쉽고 유지보수도 쉬움 (좀 더 깔끔하게 코딩할 수 있음)
하지만 개발시간이 오래걸린다
반응형
'Java' 카테고리의 다른 글
[Spring] Spring MVC? (0) | 2021.06.02 |
---|---|
DBCP (Database Connection Pool) 연습 (1) | 2021.04.25 |
MVC Architecture Model 1 연습예제 (0) | 2021.04.23 |
Singleton Design Pattern(싱글톤 디자인 패턴) (0) | 2021.04.23 |
MVC Architecture ( Model 1 / Model 2 ) (0) | 2021.04.22 |
댓글