열심히 끝까지

디바이스 융합 자바(Java) day69(1) - Spring을 DS(Dispatcher Servlet),HM(Handler Mapping),Controller에 대입 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day69(1) - Spring을 DS(Dispatcher Servlet),HM(Handler Mapping),Controller에 대입

노유림 2022. 9. 20. 11:53

1. 사용자가 *.do 요청을 하면
2. web.xml을 읽어들이는 서블릿 컨테이너에서 서블릿 객체를 생성함
3. web.xml에 등록되어있던 "내가 만든 DS"을 "Spring에서 제공하는 DS"로 교체

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>

>>> servlet-class의 변화(DispatcherServlet)

    >> 전 : com.ryo.biz.controller.DispatcherServlet
    >> 후 : org.springframework.web.servlet.DispatcherServlet

 

4. FileNotFound 뜨게 됨
     java.io.FileNotFoundException: 
             Could not open ServletContext resource [/WEB-INF/DispatcherServlet-servlet.xml]

>> 자동으로 new를 해주고 난 후의 에러

>> WEB-INF에 DispatcherServlet-servlet.xml 파일이 없다! 라고 하고 있음

    >> 서블릿 컨테이너는 Spring에서 제공하는 DS 객체를 생성해줄 때에 init()을 자동 실행
                   => init()이 자동실행되게끔 설계된 이유?
                   => 스프링 컨테이너가 [/WEB-INF/DispatcherServlet-servlet.xml]을 참고해서
                        POJO인 HM, C, VR의 객체 생성을 위해서 
                  >> DispatcherServlet-servlet.xml이름의 파일을 WEB-INF 하위에 만들 것

                        (Spring Bean File으로 만들 것)

이 파일로 만들어야 함
파일 생성 후

5. 등록한 서블릿의 이름-servlet.xml로 파일을 생성하면 더 이상 파일 NOTFOUND가 발생하지 않음
    + 필터 : servlet의 일종 
          == 필터 클래스 만들어보자!!
              > 서블릿 종류이기 때문에 , web.xml에 설정해야 함

  <filter>
  	<filter-name>characterEncodingFilter</filter-name>
                      <!-- >> 이름 -->
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
                      <!--  >> Spring 프레임워크에서 지정해주는 필터 -->
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <!-- 필터 매핑해주는 것 -->
  <filter-mapping>
  	<filter-name>characterEncodingFilter</filter-name>
  	<url-pattern>*.do</url-pattern>
  </filter-mapping>

 

>> 콘솔창에 아무것도 안 뜨는 이유는?
         .do의 요청이 없기 때문!

 

6. 기존에 작성한 Controller류의 클래스들은 "내가 만든 Controller"를 implements한 것들!
7. "Spring에서 제공하는 Controller로 교체!!

 

기존 Controller------------- 삭제

package com.ryo.biz.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Controller {
	String handleRequest(HttpServletRequest request, HttpServletResponse response);
	// 기존에는 actionForwardExecute였는데 어떻게가 반환 되기 때문에 String만 반환하면 된다!!!
}

 


앞으로의 Controller ------------

 

import org.springframework.web.servlet.mvc.Controller;

 

Import 시----------------------

implements 시 --------------

 

8. public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 

    throws Exception 로 오버라이딩 강제


  >> 변환을 mav 객체로 해줘야함
        mav 객체는 멤버변수로 viewName을 가짐
        mav.setViewName("사용자에게 제공할 경로명");

9. Handler Mapping 등록 : Handler에서 꺼내 쓰기 때문에 등록해주어야 함
    >> DispatcherServlet-servlet.xml에서 진행
    - 기존에는 "내가 만든 DS"의 init() 메서드에서 생성
    -> 앞으로는 스프링 컨테이너가 [/WEB-INF/DispatcherServlet-servlet.xml] 참고해서 HM을 생성
        =>"내가 만든 HM"을 사용하지 않고, 
            "Spring에서 제공하는 HM"으로 등록했기 때문에 기존의 클래스 파일을 제거해도 무방!
         >> 이제 다음 파일은 필요가 없음...(구조를 위해 작성을 함)

10. HM을 제대로 사용하려면?
        >> 멤버변수가 존재하기 때문에, == 의존관계가 존재하기 때문에,
              DI(의존성 주입)를 반드시 해줘야 함!!!

>> 작성 방법

<prop key="string">Controller 객체</prop>

   + 
    Controller 객체 등록

 

ex ) 

<prop key="/login.do">login</prop>

+ Controller 객체 생성을 해야 함

<bean id="login" class="com.ryo.biz.controller.LoginController"/>

 

바뀐 코드들 (이전 코드는 [디바이스 융합 자바 day68] 참고 )------

[https://programming-studyroom.tistory.com/203]

 

기본 web.xml 코드(DispatcherServlet.java코드 삭제)---------------------

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <!--필터 -->
  <filter>
  	<filter-name>characterEncodingFilter</filter-name>
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <!-- 인코딩 mapping -->
  <filter-mapping>
  	<filter-name>characterEncodingFilter</filter-name>
  	<url-pattern>*.do</url-pattern>
  </filter-mapping>
  
</web-app>

 

바뀐 jsp 코드 부터 기입

main.jsp------------------------------------

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML>
<!--
	Stellar by HTML5 UP
	html5up.net | @ajlkn
	Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
-->
<html>
	<head>
		<title>main</title>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
		<link rel="stylesheet" href="assets/css/main.css" />
		<noscript><link rel="stylesheet" href="assets/css/noscript.css" /></noscript>
	</head>
	<body class="is-preload">

		<!-- Wrapper -->
			<div id="wrapper">
				<!-- Main -->
				<div id="main">
					<!-- Introduction -->
						<section id="intro" class="main">
							<div class="spotlight">
								<div class="content">
									<header class="major">
										<h2>main</h2>
									</header>
									<h2>HELLO , <a href="mypage.do">${member.name}</a> !&nbsp;&nbsp;:D</h2>
									<div class="table-wrapper">
										<table>
											<thead>
												<tr>
													<th>num</th>
													<th>title</th>
													<th>writer</th>
													<th>content</th>
													<th>cnt</th>
													<th>regdate</th>
												</tr>	
											</thead>
											<tbody>
											<c:forEach var="b" items="${datas}">
												<tr>
													<td><a href="board.do?bid=${b.bid}">${b.bid}</a></td>
													<td>${b.title}</td>
													<td>${b.writer}</td>
													<td>${b.content}</td>
													<td>${b.cnt}</td>
													<th>${b.regdate}</th>
												</tr>
											</c:forEach>
											</tbody>
											<tfoot>
												<tr>
													<td colspan="3"></td>
													<td><a href="logout.do">logout</a></td>
												</tr>
											</tfoot>
										</table>
									</div>
								</div>
							</div>
						</section>
					</div>
				<!-- Footer -->
					<footer id="footer">
						<section>
							<h2>Aliquam sed mauris</h2>
							<p>Sed lorem ipsum dolor sit amet et nullam consequat feugiat consequat magna adipiscing tempus etiam dolore veroeros. eget dapibus mauris. Cras aliquet, nisl ut viverra sollicitudin, ligula erat egestas velit, vitae tincidunt odio.</p>
							<ul class="actions">
								<li><a href="generic.html" class="button">Learn More</a></li>
							</ul>
						</section>
						<section>
							<h2>Etiam feugiat</h2>
							<dl class="alt">
								<dt>Address</dt>
								<dd>1234 Somewhere Road &bull; Nashville, TN 00000 &bull; USA</dd>
								<dt>Phone</dt>
								<dd>(000) 000-0000 x 0000</dd>
								<dt>Email</dt>
								<dd><a href="#">information@untitled.tld</a></dd>
							</dl>
							<ul class="icons">
								<li><a href="#" class="icon brands fa-twitter alt"><span class="label">Twitter</span></a></li>
								<li><a href="#" class="icon brands fa-facebook-f alt"><span class="label">Facebook</span></a></li>
								<li><a href="#" class="icon brands fa-instagram alt"><span class="label">Instagram</span></a></li>
								<li><a href="#" class="icon brands fa-github alt"><span class="label">GitHub</span></a></li>
								<li><a href="#" class="icon brands fa-dribbble alt"><span class="label">Dribbble</span></a></li>
							</ul>
						</section>
						<p class="copyright">&copy; Untitled. Design: <a href="https://html5up.net">HTML5 UP</a>.</p>
					</footer>

			</div>

		<!-- Scripts -->
			<script src="assets/js/jquery.min.js"></script>
			<script src="assets/js/jquery.scrollex.min.js"></script>
			<script src="assets/js/jquery.scrolly.min.js"></script>
			<script src="assets/js/browser.min.js"></script>
			<script src="assets/js/breakpoints.min.js"></script>
			<script src="assets/js/util.js"></script>
			<script src="assets/js/main.js"></script>

	</body>
</html>

 

board.jsp-----------------------------------

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML>
<!--
	Stellar by HTML5 UP
	html5up.net | @ajlkn
	Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
-->
<html>
	<head>
		<title>board</title>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
		<link rel="stylesheet" href="assets/css/main.css" />
		<noscript><link rel="stylesheet" href="assets/css/noscript.css" /></noscript>
	</head>
	<body class="is-preload">

		<!-- Wrapper -->
			<div id="wrapper">

				<!-- Main -->
					<div id="main">

						<!-- Introduction -->
							<section id="intro" class="main">
								<div class="spotlight">
									<div class="content">
										<header class="major">
											<h2>board</h2>
										</header>
										<div class="table-wrapper">
											<table>
												<thead>
													<tr>
														<th>num</th>
														<th>title</th>
														<th>writer</th>
														<th>content</th>
														<th>cnt</th>
														<th>regdate</th>
													</tr>	
												</thead>
												<tbody>
													<tr>
														<td>${data.bid}</td>
														<td>${data.title}</td>
														<td>${data.writer}</td>
														<td>${data.content}</td>
														<td>${data.cnt}</td>
														<td>${data.regdate}</td>
													</tr>
												</tbody>
												<tfoot>
													<tr>
														<td colspan="3"></td>
														<td><a href="main.do">main</a></td>
													</tr>
												</tfoot>
											</table>
										</div>
									</div>
								</div>
							</section>

					</div>

				<!-- Footer -->
					<footer id="footer">
						<section>
							<h2>Aliquam sed mauris</h2>
							<p>Sed lorem ipsum dolor sit amet et nullam consequat feugiat consequat magna adipiscing tempus etiam dolore veroeros. eget dapibus mauris. Cras aliquet, nisl ut viverra sollicitudin, ligula erat egestas velit, vitae tincidunt odio.</p>
							<ul class="actions">
								<li><a href="generic.html" class="button">Learn More</a></li>
							</ul>
						</section>
						<section>
							<h2>Etiam feugiat</h2>
							<dl class="alt">
								<dt>Address</dt>
								<dd>1234 Somewhere Road &bull; Nashville, TN 00000 &bull; USA</dd>
								<dt>Phone</dt>
								<dd>(000) 000-0000 x 0000</dd>
								<dt>Email</dt>
								<dd><a href="#">information@untitled.tld</a></dd>
							</dl>
							<ul class="icons">
								<li><a href="#" class="icon brands fa-twitter alt"><span class="label">Twitter</span></a></li>
								<li><a href="#" class="icon brands fa-facebook-f alt"><span class="label">Facebook</span></a></li>
								<li><a href="#" class="icon brands fa-instagram alt"><span class="label">Instagram</span></a></li>
								<li><a href="#" class="icon brands fa-github alt"><span class="label">GitHub</span></a></li>
								<li><a href="#" class="icon brands fa-dribbble alt"><span class="label">Dribbble</span></a></li>
							</ul>
						</section>
						<p class="copyright">&copy; Untitled. Design: <a href="https://html5up.net">HTML5 UP</a>.</p>
					</footer>

			</div>

		<!-- Scripts -->
			<script src="assets/js/jquery.min.js"></script>
			<script src="assets/js/jquery.scrollex.min.js"></script>
			<script src="assets/js/jquery.scrolly.min.js"></script>
			<script src="assets/js/browser.min.js"></script>
			<script src="assets/js/breakpoints.min.js"></script>
			<script src="assets/js/util.js"></script>
			<script src="assets/js/main.js"></script>

	</body>
</html>

 

MainController.jsp-----------------

package com.ryo.biz.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.ryo.biz.board.BoardVO;
import com.ryo.biz.board.impl.BoardDAO;

public class MainController implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		System.out.println("로그 : 메인 컨트롤러 들어옴");
		BoardVO bVO = new BoardVO();
		BoardDAO bDAO = new BoardDAO();
		List<BoardVO> datas = bDAO.selectAllBoard(bVO);
		
		HttpSession session = request.getSession();
		session.setAttribute("datas", datas);
		
		ModelAndView mav = new ModelAndView();
		
		mav.setViewName("main.jsp");
		
		return mav;
	}
}

LoginController.jsp-----------------

package com.ryo.biz.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.ryo.biz.member.MemberVO;
import com.ryo.biz.member.impl.MemberDAO;

public class LoginController implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		System.out.println("로그 : 로그인컨트롤러 들어옴");

		MemberDAO mDAO = new MemberDAO(); // MemberDAO 사용 시
		MemberVO mVO = new MemberVO();
		String mid=request.getParameter("mid");
		String mpw=request.getParameter("mpw");
		mVO.setMid(mid);
		mVO.setMpw(mpw);
		mVO = mDAO.selectOneMember(mVO); 
		
		ModelAndView mav = new ModelAndView();
		if(mVO==null) {
			mav.setViewName("login.jsp");
			//return "login";
			// ViewResolver가 .jsp를 추가하기 때문에 생략해서 반환
		}
		else {
			HttpSession session = request.getSession();
			session.setAttribute("member", mVO);

			mav.setViewName("main.do");
			//return "main.do";
		}
		return mav;
	}
}

BoardController.jsp-----------------

package com.ryo.biz.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.ryo.biz.board.BoardVO;
import com.ryo.biz.board.impl.BoardDAO;

public class BoardController implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		BoardVO bVO = new BoardVO();
		bVO.setBid(Integer.parseInt(request.getParameter("bid")));
		
		BoardDAO bDAO = new BoardDAO();
		bVO=bDAO.selectOneBoard(bVO);
		
		HttpSession session = request.getSession();
		session.setAttribute("data", bVO);
		
		ModelAndView mav = new ModelAndView();
		
		mav.setViewName("board.jsp");
		
		return mav;
	}
}

SigninController.jsp-----------------

package com.ryo.biz.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.ryo.biz.member.MemberVO;
import com.ryo.biz.member.impl.MemberDAO2;

public class SigninController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String mid=request.getParameter("mid");
		String mpw=request.getParameter("mpw");
		String name=request.getParameter("name");
		String role=request.getParameter("role");
		
		MemberDAO2 mDAO = new MemberDAO2();
		MemberVO mVO = new MemberVO();
		
		mVO.setMid(mid);
		mVO.setMpw(mpw);
		mVO.setName(name);
		mVO.setRole(role);
		mDAO.insertMember(mVO);
		
		ModelAndView mav = new ModelAndView();
		mav.setViewName("login.jsp");
		return mav;
	}
}

 

WEB-INF\DispatcherServlet-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 싱글톤 패턴!! -->
	<!-- HM 등록 + DI를 해야 함 -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	<!-- SimpleUrlHandlerMapping의 설정 -->
		<property name="mappings">
			<props>
				<!-- <prop key="string">Controller 객체</prop> -->
				<prop key="/login.do">login</prop>
				<prop key="/main.do">main</prop>
				<prop key="/board.do">board</prop>
				<prop key="/signin.do">signin</prop>
			</props>
		</property>
	</bean>
	
	<!-- Controller 객체 등록 -->
	<!-- 위치는 어디에 있던 상관 없음 -->
	<bean id="login" class="com.ryo.biz.controller.LoginController"/>
	<bean id="main" class="com.ryo.biz.controller.MainController"/>
	<bean id="board" class="com.ryo.biz.controller.BoardController"/>
	<bean id="signin" class="com.ryo.biz.controller.SigninController"/>
</beans>