JSP day 9

유요한·2022년 11월 23일
0

JSP

목록 보기
11/14
post-thumbnail

MVC

day 09

MVC

[JSP 방식]
	a.jsp	  → b.jsp → 	c.jsp
		      	 ↑↓
		         DB

	각 페이지마다 필요시 자바코드가 작성되며, DB와 연결되는 코드도
	JSP 파일 안에서 모두 작성된다. 분리되어 있지 않기 때문에 
	소규모 프로젝트에는 어울리는 방식이지만 가독성이 떨어지고 분업과
	유지보수가 좋지 않으므로 규모가 커지면 불편해진다.

[Model1 방식]
	a.jsp		→ b.jsp →		c.jsp
			       ↑↓
			     DAO, DTO
			       ↑↓
			       DB

	b.jsp에서 DAO의 메소드를 호출함으로써  자바코드가 섞이게 된다.
	하지만 선언은 분리되어 JAVA 파일에 구현되어 있으므로 JSP 내의
	JAVA 코드의 양이 굉장히 줄어듥데 된다. 하지만 페이지가 확장될 수록
	유지보수가 상대적으로 좋지 않다.

[Model2 방식]
	a.jsp	→ web.xml → Servlet(b.java)-Controller → c.jsp	
				 ↑↓
			  DAO, DTO
				 ↑↓
				 DB

	a.jsp에서 다음 페이지로 이동하기 전에 필요한 비즈니스 로직을
	b.java 서블릿에 완벽히 분리하여 관리한다. 요청시 알맞은 서블릿으로
	찾아가기 위해 web.xml을 참고하고 그 후 그곳에서 처리 완료된
	결과를 들고 c.jsp로 이동하여 출력하는 형태이다.

• a.jsp 생성

	<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>a</title>
</head>
<body>
		<form action ="b">
			숫자1<input type="text" name="num1"><br>
			숫자2<input type="text" name="num2"><br>
			<input type = "submit">
		</form>
</body>
</html>

• WEB-INF → web.xml

	<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>day09</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  	<servlet-name>Test</servlet-name>
  	<!-- 어디로 보내줄지 servlet-class로 알려준다.  -->
  	<servlet-class>com.koreait.servlet.B</servlet-class>
  </servlet>
  <servlet-mapping>
  	<!-- Test라는 서블릿 이름이 있으면  혹시 /b라는게 있으면  com.koreait.servlet.B 보내줘 -->
  	<servlet-name>Test</servlet-name>
  	<url-pattern>/b</url-pattern>
  </servlet-mapping>
</web-app>

• com.koreait.servlet → servlet 생성(이름 : B)

	package com.koreait.servlet;

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;

public class B extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int num1 = Integer.parseInt(request.getParameter("num1"));
		int num2 = Integer.parseInt(request.getParameter("num2"));
		///DB처리///
		
		///////////
		int result = num1 + num2;
		request.setAttribute("result", result);
		// ↓ 이렇게 보내주면 날라가서 ${result}해도 나오지 않는다.
		/* response.sendRedirect("c.jsp"); */
		request.getRequestDispatcher("c.jsp").forward(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

• C.jsp 생성

	<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>C</title>
</head>
<body>
	결과 : ${result}
</body>
</html>

Front-Controller 패턴

			*.do
a.jsp   → 	web.xml  →   Servlet(FrontController)
                               ↓
                           if, switch
                               ↓
                          Controller(~~~Action)  

• index.jsp

	<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
	<h2>최종 예제 게시판</h2>
	<a href="UserJoin.us">회원가임</a>
	<a href="UserLogin.us">로그인 </a>
</body>
</html>

• web.xml

	<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>board_mvc2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  <servlet-name>UserFrontController</servlet-name>
  <!-- 밑에서 간 컨트롤러가 이 클래스를 뜻한다. -->
  <servlet-class>com.koreait.app.user.UserFrontController</servlet-class>
  </servlet>                                                                           
  <servlet-mapping>
  	<!-- User이라는 컨트롤러로 갈  것이고 -->
  	<servlet-name>UserFrontContrller</servlet-name>
  	<!-- 모든것의.us면 ↑ -->
  	<url-pattern>*.us</url-pattern>
  </servlet-mapping>	
</web-app>

• ActionTo

객체를 포장해주기 위한 역할
	package com.koreait.action;

public class ActionTo {
	private String path;
	private boolean isRedirect;
	
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	public boolean isRedirect() {
		return isRedirect;
	}
	public void setRedirect(boolean isRedirect) {
		this.isRedirect = isRedirect;
	}
	
	
}

• com.koreait.app.user → UserFrontCotroller.java

	package com.koreait.app.user;

import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.koreait.action.ActionTo;

public class UserFrontController extends HttpServlet{
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 여기에 이걸 작성해주면 get으로 와도 doGet으로 날라오고
		// doPost로 날라와도 doGet으로 날라간다.
		doGet(req,resp);
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 길나누는 코드
		// request는 요청에 대한 정보를 가지고 있기 때문에
		// getRequestURI를 사용해서 요청한 URI를 알 수 있다.
		String requestURI = req.getRequestURI();		// /board_MVC2/UserJoin.us
		String contextPath = req.getContextPath();		// /board_MVC2
		// .substring(contextPath.length()) : contextPath의 길이만큼 문자열을 잘라줘
		String command = requestURI.substring(contextPath.length());
		
		// JSP에는 이동방식이 2가지
		// forward 와 redirect
		// 일괄처리
		// 어디로 이동할지 / 어떤 방식일지(forward, redirect)
		
		ActionTo acto = null;
		switch(command) {
		case "/UserJoin.us":
			acto = new ActionTo();
			// redirect는 true로 세팅, forward방식이면 false로 세팅
			acto.setRedirect(false);
			acto.setPath("/app/user/jopinview.jsp");
			System.out.println("조인!");
			break;
		case "/UserLogin.us":
			acto = new ActionTo();
			acto.setRedirect(false);
			acto.setPath("/app/user/jopinview.jsp");
			System.out.println("로그인!");
			break;
			// 만약에 test를 어떤 데이터를 처리하기 위해서 다른곳으로 보내주는데
			// 이동한 곳에서 어떻게 어떤 곳으로 갈지 정해지는데  
			// 그러면 그 두 가지 정보를 return해줘야 하는데 return은 두 가지를 할 수 없다.
			//  그래서 객체를 만들어주고 포장되어 있는 그 객체를 return해준다.
		case "test":	
		}
		
		// 어떤 곳에도 들어가지 못했으면 null
		if(acto != null) {
			// isRedirect()가 true면 이게 redirect라는 의미다.
			if(acto.isRedirect()) {
				// acto가 가지고 있는 path로 보내주는 것이다.
				resp.sendRedirect(acto.getPath());
			} else {
				// else면 forward라는 방식이다.
				// RequestDispatcher : 페이지를 이동시킬 때 사용한다. 
				// 클라이언트로부터 최초에 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는(보내는) 역할을 수행하거나, 
				// 특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스입니다. 
				// 즉 /a.jsp 로 들어온 요청을 /a.jsp 내에서 RequestDispatcher를 사용하여 b.jsp로 요청을 보낼 수 있습니다. 
				// 또는 a.jsp에서 b.jsp로 처리를 요청하고 b.jsp에서 처리한 결과 내용을 a.jsp의 결과에 포함시킬 수 있습니다.
				RequestDispatcher disp = req.getRequestDispatcher(acto.getPath());
				disp.forward(req, resp);
			}
		}
			
	}
}


profile
발전하기 위한 공부

0개의 댓글