본문으로 바로가기

7.(JSP) *.do 서블릿과 FrontController 패턴

category SPRING/Servlet || JSP 2021. 3. 4. 23:47
728x90
반응형
SMALL

실무에서 자주 쓰이는 패턴 방식이며

다양한 요청들을 하나의 서블릿으로 받아서 처리하는 패턴으로 개발 및 유지보수 효율성에 좋다.

출처:https://riucc.tistory.com/404

 

서블릿 생성시 URL 형식에 .do 을 추가해줌으로서 페이지 이동시 URL에 기존 서블릿 이름이 아닌 .do형식이 표현됨으로서 보안상의 이점이 존재한다.

 

01_upload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="upload.do" method="post" enctype="multipart/form-data">
글쓴이: <input type="text" name="name"><br>
제 &nbsp; 목: <input type="text" name="title"><br>
파일 지정하기: <input type="file" name="uploadFile"><br>
<input type="submit" value="전송">
</form>
</body>
</html>

 

UploadServlet.java

package com.yoon.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/upload.do")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public UploadServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out=response.getWriter();
		
		//여기를 바꿔주면 다운받는 경로가 바뀜
		String savePath="upload";
		
		//파일 최대 업로드 용량
		int uploadFileSizeLimit=5*1024*1024;
		String encType="UTF-8";
		
		//서버상의 실제경로를 가져온다.
		ServletContext context=getServletContext();
		String uploadFilePath=context.getRealPath(savePath);
		System.out.println("서버상의 실제 디렉토리 위치 : ");
		System.out.println(uploadFilePath);
		
		try {
			//request객체, 서버상의 실제 디렉토리, 최대 업로드 파일 크기, 인코딩 방법, 동일한 이름 존재시 새로운 이름부여
			MultipartRequest multi=new MultipartRequest(request,uploadFilePath,uploadFileSizeLimit,encType,new DefaultFileRenamePolicy());  
			
			String fileName=multi.getFilesystemName("uploadFile");
			
			if(fileName==null) {//파일이 업로드 되지 않았을때
				System.out.println("파일이 업로드되지 않음");
			}else {//파일이 업로드 되었을때
				out.println("<br> 글쓴이: "+multi.getParameter("name"));
				out.println("<br> 제 &nbsp; 목 "+multi.getParameter("title"));
				out.println("<br> 파일명 : "+fileName);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}//catch
	}

}

 

단 .do 형식은 서버의 web.xml상에서 주소 매핑을 해줘야 한다.

 

web.xml 을 열어서 servlet-mapping 을 검색하여 선언 부분을 찾은뒤

   <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- The mappings for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

	<servlet>
		<servlet-name>UploadServlet</servlet-name>
		<servlet-class>com.yoon.controller</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>UploadServlet</servlet-name>
		<url-pattern>/upload.do</url-pattern>
	</servlet-mapping>

<servlet>

     <servlet-name>기존클래스 이름</servlet-name>

     <servlet-class>해당 클래스의 패키지경로</servlet-name>

</servlet>

<servlet-mapping>

<servlet-mapping>

        <servlet-name>기존 클래스 이름</serlvet-name>

        <url-pattern>url매핑한 이름</url-pattern>

 </servlet-mapping>

 

결과


 

JSP에서 서블릿으로 전송을 하면 기존클래스 이름은 UploadServlet 이 아닌 url로 매핑된 이름으로 노출된다.

728x90
반응형
LIST