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