MVC 개요
model 1 방식
: All-In-One 방식(jsp만으로 모든 것을 짤 때)
model 2 방식
DAO
: MODEL 역할. 데이터베이스의 입출력을 담당한다.
JSP
: VIEW 영역. 그런데 데이터 값을 담아 표현하는게 아니라면 그냥 html파일로 표현해도 된다.
SERVLET
: CONTROLLER 역할. 어디에 줄 지 결정
JSP 개요
jsp 파일 경로
: 배포할 때 사용되는 경로
/Users/jenna/Desktop/Programming/Servlet_JSP/lecture/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/_20_MVC_Calculator_jsp/org/apache/jsp/calc/Calculator_jsp.java
<!-- 페이지 지시자 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- <% %> : 스크립트릿, _jspService에서 응답을 처리하기 위한 java 코드
<%! %> : 선언문, _jspService 외부에 필드/메서드를 등록하기 위한 java 코드
<%= %> : 표현식, 선언문/스크립트릿에 저장된 변수값을 브라우저상에 전달하기 위한 문법 --%>
<!-- 자바코드 사용가능(스크립트릿) : 서비스를 하기위한 코드, _jspService 안에 들어간다. -->
<!-- _jspService 내부에서 html보다 먼저 처리된다 -->
<%
String v1 = "";
String v2 = "";
String result = "";
String[] selected = { "", "", "", "" };
if(request.getParameter("v1")!=null){
v1 = request.getParameter("v1");
v2 = request.getParameter("v2");
String op = request.getParameter("op");
result = calculate(Integer.parseInt(v1),Integer.parseInt(v2),op);
switch(op){
case "+" : selected[0] = "selected"; break;
case "-" : selected[1] = "selected"; break;
case "*" : selected[2] = "selected"; break;
case "/" : selected[3] = "selected"; break;
}
}
%>
<!-- 선언문, _jspService 바깥에 메서드, 필드를 선언하는 곳 -->
<!-- 가장 먼저 처리가 되는 곳이다. -->
<%!
private String calculate(int v1, int v2, String op){
int result = 0;
switch(op){
case "+" : result = v1+v2; break;
case "-" : result = v1-v2; break;
case "*" : result = v1*v2; break;
case "/" : result = v1/v2; break;
}
return Integer.toString(result);
}
%>
<!-- 서블릿의 브라우저에 전송할 문자열로 변환
_jspService 내부에서 마지막에 브라우저에 전송됨
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>jsp 계산기</h2>
<form action="Calculator.jsp" method="get">
<input type="text" name="v1" size="4" value="<%=v1%>"> <select
name="op">
<option value="+" <%=selected[0] %>>+</option>
<option value="-" <%=selected[1] %>>-</option>
<option value="*" <%=selected[2] %>>*</option>
<option value="/" <%=selected[3] %>>/</option>
</select> <input type="text" name="v2" size="4" value="<%=v2%>">
<input type="submit" value="="> <input type="text" size="8" value="<%=result%>">
</form>
</body>
</html>
jsp 파일에 calculate 메서드가 생긴 것을 확인 할 수 있다.
MVC 이해
Member.java
package spms.vo;
import java.util.Date;
/*
VO(Value Object) => 값을 묶어서 저장하는 객체
DTO(Data Transfer Object) => 값을 각 역할을 맡은 객체에 전달하는 객체
테이블/뷰와 1:1 관계
or
페이지에 보여줘야 될 정보 1:1 관계
1) setter의 리턴형이 void이면 아래처럼 호출한다
member.setNo(10);
member.setName("hong");
member.setEmail("hong@naver.com");
2) setter의 리턴형을 Member로 하면 아래처럼 chain식으로 호출한다
member.setNo(10)
.setName("hong")
.setEmail("hong@naver.com");
*/
public class Member {
protected int no;
protected String name;
protected String email;
protected String password;
protected Date CreatedDate;
protected Date modifiedDate;
public int getNo() {
return no;
}
public Member setNo(int no) {
this.no = no;
return this;
}
public String getName() {
return name;
}
public Member setName(String name) {
this.name = name;
return this;
}
public String getEmail() {
return email;
}
public Member setEmail(String email) {
this.email = email;
return this;
}
public String getPassword() {
return password;
}
public Member setPassword(String password) {
this.password = password;
return this;
}
public Date getCreatedDate() {
return CreatedDate;
}
public Member setCreatedDate(Date createdDate) {
CreatedDate = createdDate;
return this;
}
public Date getModifiedDate() {
return modifiedDate;
}
public Member setModifiedDate(Date modifiedDate) {
this.modifiedDate = modifiedDate;
return this;
}
}
MemberListServlet
package spms.servlets;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import spms.vo.Member;
@SuppressWarnings("serial")
@WebServlet("/member/list")
public class MemberListServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Connection conn = null; // MySQL 연결담당
Statement stmt = null; // SQL문 담당
ResultSet rs = null; // SELECT문의 결과 담당
final String sqlSelect = "SELECT mno,mname,email,cre_date" + "\r\n" +
"FROM members" + "\r\n" +
"ORDER BY mno ASC";
ServletContext sc = this.getServletContext();
String driver = sc.getInitParameter("driver");
String url = sc.getInitParameter("url");
String id = sc.getInitParameter("username");
String pwd = sc.getInitParameter("password");
try {
// 1) MySQL 제어 객체를 로딩
Class.forName(driver);
// 2) MySQL과 연결
conn = DriverManager.getConnection(url, id, pwd);
stmt = conn.createStatement();
rs = stmt.executeQuery(sqlSelect);
resp.setContentType("text/html; charset=UTF-8"); // 먼저 호출
/* members테이블의 전체 인원을 저장하기 위해
* ArrayList를 사용한다
* */
ArrayList<Member> members = new ArrayList<Member>();
// DB로부터 members테이블의 정보를 가져와서 member객체에 담고
// member객체를 ArrayList에 차례로 저장한다.
while(rs.next()) {
members.add(new Member()
.setNo(rs.getInt("mno"))
.setName(rs.getString("mname"))
.setEmail(rs.getString("email"))
.setCreatedDate(rs.getDate("cre_date"))
);
}
//jsp에 전달하기 위해 request의 공유 공간에 저장한다
// key, value
req.setAttribute("members", members);
//jsp로 request를 전달한다
RequestDispatcher rd = req.getRequestDispatcher("/member/Member.jsp");
rd.include(req, resp);
/*
jsp로 전달(위임)하는 방식 2가지
1) forward : 제어권을 아예 넘겨준다(네가 알아서 처리해라 )
2) include : 실행할 동안 제어권을 줬다가 처리가 끝나면 다시 넘겨 받는다
(마지막 확인은 내가 처리한다 )
*/
}catch(Exception e) {
throw new ServletException(e);
}finally {
try {
if(rs!=null)
rs.close();
}catch(Exception e) {
e.printStackTrace();
}
try {
if(stmt!=null)
stmt.close();
}catch(Exception e) {
e.printStackTrace();
}
try {
if(conn!=null)
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
MemberList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 페이지 지시자 추가. java의 import와 동일 -->
<%@ page import="spms.vo.Member" %>
<%@ page import="java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<h1>회원 목록</h1>
<p><a href='add'>신규 회원</a></p>
<%
ArrayList<Member> members =
(ArrayList<Member>)request.getAttribute("members");
for(Member member : members){
%>
<%=member.getNo() %>,
<a href='update?no=<%=member.getNo() %>'>
<%=member.getName() %>
</a>,
<%=member.getEmail() %>,
<%=member.getCreatedDate() %>
<a href='delete?no=<%=member.getNo() %>'>
[삭제]
</a>
<br/>
<%
}
%>
</body>
</html>
결과