JSP - MVC 개요

jinkyung·2021년 1월 20일
0

JSP

목록 보기
6/20

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>

결과

0개의 댓글