100일 챌린지/빅데이터기반 인공지능 융합 서비스 개발자

Day 41 - Framework 만들기

ksyke 2024. 9. 23. 17:07

목차

    https://spring.io/

     

    Spring | Home

    Cloud Your code, any cloud—we’ve got you covered. Connect and scale your services, whatever your platform.

    spring.io

    커멘드 디자인 패턴 만들기 

        <plugins>
    	    <plugin>
    	    	<artifactId>maven-compiler-plugin</artifactId>
    	    	<configuration>
    	    		<source>1.8</source>
    	    		<target>1.8</target>
    	    	</configuration>
    	    </plugin>
        </plugins>

      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.13</version>
          <scope>test</scope>
        </dependency>
    	<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    	<dependency>
    	    <groupId>javax.servlet</groupId>
    	    <artifactId>javax.servlet-api</artifactId>
    	    <version>3.1.0</version>
    	    <scope>provided</scope>
    	</dependency>
    	<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
    	<dependency>
    	    <groupId>javax.servlet.jsp</groupId>
    	    <artifactId>javax.servlet.jsp-api</artifactId>
    	    <version>2.3.3</version>
    	    <scope>provided</scope>
    	</dependency>
    
      </dependencies>

     

    .jsp 파일 접근하지 못하게 하기

    @Webservlet("/index.do")
    public class IndexController extends HttpServlet{
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		RequestDispatcher rd=req.getRequestDispatcher("/WEB-INF/views/index.jsp");
    		rd.forward(req, resp);
    	}
    }
    <div>
    	<a href="${pageContext.request.contextPath }/index.do">home</a>
    	<a href="${pageContext.request.contextPath }/intro.do">intro</a>
    	<a href="${pageContext.request.contextPath }/emp.do">emp</a>
    	<a href="${pageContext.request.contextPath }/login.do">login</a>
    </div>

    프론트 컨트롤러 디자인 패턴

    모든 요청을 받는 컨트롤러 만들기

     

    MyController (Interface)

    package com.gimhae.framework.mvc;
    
    public interface MyController {
    	String execute(HttpServletRequest req, HttpServletResponse resp);
    }

    *controller.java

    package com.gimhae.framework.controller;
    
    public class IndexController implements MyController{
    	public String execute(HttpServletRequest req, HttpServletResponse resp){
    		return "index";
    	}
    }

    DispatcherServlet

    package com.gimhae.framework.mvc;
    
    public class DispatcherServlet extends HttpServlet{
    	
    	Map<String,String> handler=new HashMap<>();
    	@Override
    	public void init() throws ServletException {
    		//handlerMapping
    		Enumeration<String> enu=this.getInitParameterNames();
    		while(enu.hasMoreElements()) {
    			String key=enu.nextElement();
    			String val=this.getInitParameter(key);
    			handler.put(key,val);
    		}
    	}
    	
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		doDo(req, resp);
    	}
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		doDo(req, resp);
    	}
    	
    	protected void doDo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		//System.out.println("front end Controller");
    		String path=req.getRequestURI();
    //		System.out.println(req.getContextPath());
    		MyController controller=null;
    		try {
    			Class clz=null;
    			String info=null;
    			
    			info=handler.get(path.substring(req.getContextPath().length()));
    			if(info==null) {
    				resp.sendError(HttpServletResponse.SC_NOT_FOUND);
    				return;
    			}
    			
    			clz=Class.forName(info);
    			controller=(MyController) clz.getDeclaredConstructor().newInstance();
    
    			//viewResolver
    			String prefix="/WEB-INF/views/";
    			String suffix=".jsp";
    			String viewName=controller.execute(req, resp);
    			if(viewName.startsWith("redirect:")) {
    				resp.sendRedirect(viewName.substring("redirect:".length()));
    			}else {
    				RequestDispatcher rd=req.getRequestDispatcher(prefix+viewName+suffix);
    				rd.forward(req, resp);
    			}
    
    		}catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
    }

    Web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee                       http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    
      <display-name>Archetype Created Web Application</display-name>
      <servlet>
      	<servlet-name>framework</servlet-name>
      	<servlet-class>com.gimhae.framework.mvc.DispatcherServlet</servlet-class>
      	<init-param>
      		<param-name>/index.do</param-name>
      		<param-value>com.gimhae.framework.controller.IndexController</param-value>
      	</init-param>
      	<init-param>
      		<param-name>/intro.do</param-name>
      		<param-value>com.gimhae.framework.controller.IntroController</param-value>
      	</init-param>
      	<init-param>
      		<param-name>/emp.do</param-name>
      		<param-value>com.gimhae.framework.controller.ListController</param-value>
      	</init-param>
      </servlet>
      <servlet-mapping>
      	<servlet-name>framework</servlet-name>
    	<url-pattern>/</url-pattern>  	
      </servlet-mapping>
    </web-app>

    Framework 배포하기

     

    - [Run As]>[Maven Build]

     

    > 기존의 jar 파일을 지우고 다시 만들떄:

    Framework 사용하기 

    Dynamic Web Project 만들기

     

    jar 파일들을 lib 폴더로 복사한다.

    web.xml에 서브렛 정보를 입력한다.

      <servlet>
      	<servlet-name>framework</servlet-name>
      	<servlet-class>com.gimhae.framework.mvc.DispatcherServlet</servlet-class>
      	<init-param>
      		<param-name>/index.do</param-name>
      		<param-value>com.gimhae.controller.IndexController</param-value>
      	</init-param>
      	<init-param>
      		<param-name>/intro.do</param-name>
      		<param-value>com.gimhae.controller.IntroController</param-value>
      	</init-param>
      	<init-param>
      		<param-name>/emp/list.do</param-name>
      		<param-value>com.gimhae.controller.ListController</param-value>
      	</init-param>
      </servlet>
      <servlet-mapping>
      	<servlet-name>framework</servlet-name>
      	<url-pattern>*.do</url-pattern>
      </servlet-mapping>

    jsp 파일들을 WEB-INF 안의 view 폴더 안에 작성한다.

    model과 controller를 작성한다.

    Mysql 데이터 가져오기

    list.jsp

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <body>
    <%@include file="../template/menu.jspf" %>
    
    	<h2 class="page-header">list page</h2>
    	<table>
    		<thead>
    			<tr>
    				<th>사번</th>
    				<th>이름</th>
    				<th>금액</th>
    				<th>날짜</th>
    			</tr>
    		</thead>
    		<tbody>
    			<c:forEach items="${alist }" var="bean">
    			<c:url value="detail.do" var="detail">
    				<c:param name="empno" value="${bean }"></c:param>
    			</c:url>
    				<tr>
    					<td><a href="${detail }">${bean.empno }</a></td>
    					<td><a href="${detail }">${bean.ename }</a></td>
    					<td><a href="${detail }">${bean.pay }</a></td>
    					<td><a href="${detail }">${bean.hiredate }</a></td>
    				</tr>
    			</c:forEach>
    		</tbody>
    	</table>
    
    <%@include file="../template/footer.jspf" %>
    </body>

    ListController.java

    package com.gimhae.controller;
    
    public class ListController implements MyController{
    	@Override
    	public String execute(HttpServletRequest req, HttpServletResponse arg1) {
    		EmpDao dao=new EmpDao();
    		try {
    			req.setAttribute("alist", dao.pullList());
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return "emp/list";
    	}
    }

    템플릿 메서드 패턴

    EmpDao.java