참고한 책: 최범균의 JSP 2.3 웹프로그래밍 기초부터 고급까지(최범균 저)
chapter 18 MVC 패턴 구현 2.3 설정파일에 커맨드와 클래스의 관계 명시하기
책 소스코드: https://github.com/madvirus/jsp23
최범균님 블로그: http://javacan.tistory.com/
설정 파일을 쓰는 이유? 로직 처리 코드를 컨트롤러 서블릿에서 핸들러 클래스로 옮겼지만, 여전히 컨트롤러 서블릿은 명렁어에 따른 알맞은 처리를 하기 위해 중첩된 if-else 구문을 사용해야 한다. 이 코드는 새로운 명령어가 추가 되면 컨트롤러 서블릿 클래스의 코드를 직접 변경해야하는 단점이 있다. 이 단점의 해결 방법은 <명령어, 핸들러 클래스>의 매핑 정보를 설정파일에 저장하는 것이다. 설정 파일의 한 줄은 '명령어=패키지.핸들러클래스이름' 형태로 구성된다.
컨트롤러 서블릿은 설정파일을 init()메서드에서 명령어와 핸들러 클래스의 매핑정보를 읽어오고, 명령어에 해당하는 핸들러 객체를 미리 생성해두었다가 process() 메서드에서 사용하면 된다.
개요
- 단순 화면 1개 보여주기
- DB 사용 x
- Handler 사용
- ControllerUsingFile.java
- web.xml
- HelloHandler.java
- hello.jsp
- commandHandler.properties
1. WebContent/WEB-INF/view/hello.jsp 생성
▶hello.jsp |
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello</title> </head> <body> <%= request.getAttribute("hello") %> ${ hello } </body> </html> |
2. interface CommandHandler만들기 (mvc.command)
▶CommandHandler.java |
package mvc.command; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface CommandHandler { public String process(HttpServletRequest request, HttpServletResponse response) throws Exception; } |
3. HelloHandler.java 만들기 (mvc.hello)
▶HelloHandler.java |
package mvc.hello; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import mvc.command.CommandHandler; public class HelloHandler implements CommandHandler{ @Override public String process(HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute("hello", "안녕하세요~"); return "WEB-INF/view/hello.jsp"; } } |
4. commandHandler.properies 설정 파일 만들기 (WebContent/WEB-INF/commandHandler.properties)
▶ commandHandler.properties |
#command=handler hello=mvc.hello.HelloHandler hello3=mvc.hello.HelloHandler |
5. ControllerUsingFile.java 만들기 (mvc.controller)
ControllerUsingFile은 [src 우클릭]-[New]-[Servlet]으로 만들었습니다.
현재 제 프로젝트 명은 exapmle18(아.. 프로젝트명 오타났네요..ㅠ)이고, 여기서 정해줘야할 것은 java package와 Class name을 지정해주면 됩니다.
주황색 박스 친 SuperClass. HttpServlet을 상속하고 있구나 보고 넘어가시면 됩니다.
next누르시면 url 패턴 정하는게 있는데 저는 xml로 해서 그냥 넘어가겠습니다.
마지막에 나오는 설정입니다. 아래와 같이 설정해주시면 됩니다.
저희가 만들 ControllerUsingFile의 흐름입니다.
▶ControllerUsingFile.java |
package mvc.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ControllerUsingFile extends HttpServlet { private static final long serialVersionUID = 1L;
// <커맨드, 핸들러인스턴스> 매핑 정보 저장 public void init() throws ServletException { //설정파일 읽기
//읽어온 매핑 정보를 properties 객체에 저장
//아래 다섯가지 작업을 반복한다. //1. 프로퍼티 이름을 커맨드 이름으로 사용 //2. 커맨드 이름에 해당하는 핸들러 클래스 이름을 Properties에서 구함 //3. 핸들러 클래스 이름을 이용해서 Class 객체를 구함 //4. Class로부터 핸들러 객체를 생성 //5. commandHandlerMap에 (커맨드, 핸들러 객체) 매핑 정보를 저장한다. } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { process(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { process(request, response); }
private void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //클라이언트가 요청한 명령어를 구한다.
//commandHandlermap에서 요청을 처리할 핸들러 객체를 구한다.
//명령어에 해당하는 핸들러 객체가 존재하지 않을 경우 NullHandler를 사용한다.
//구한 핸들러 객체의 process() 메서드를 호출해서 요청을 처리하고, 결과로 보여줄 뷰 페이지 경로를 리턴값으로 전달받는다.
//viewPage가 null이 아닐 경우, 핸들러 인스턴스가 리턴한 뷰페이지로 이동한다. } } |
ControllerUsingFile.java 전체소스
6. 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_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>exapmle18</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>ControllerUsingFile</servlet-name> <servlet-class>mvc.controller.ControllerUsingFile</servlet-class> <init-param> <param-name>configFile</param-name> <param-value>/WEB-INF/commandHandler.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ControllerUsingFile</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> |
7. 실행하기
지금 처음 들어갈 페이지가 없고 결과페이지만 있음. 그래서, 서버를 구동시키고 url로 들어갑니다.
http://localhost:8080/exapmle18/hello?cmd=hello
http://IP:포트/프로젝트명/url-pattern에서 정한 이름
서블릿에서 getParmeter로 받을때 cmd로 받아서 cmd
cmd의 값인 hello는 Properties에서 가져온 값. properties에서 가져온 값은 connmandHandler.properties에서 설정해준 값.
commandHandler.properties에 hello3=mvc.hello.HelloHandler 한줄 추가해주고, 서버 내렸다 올린다음
http://localhost:8080/exapmle18/hello?cmd=hello3 url로 이름바꿔서 다시 접속해도 들어가짐
결과화면
'개발~ > JSP' 카테고리의 다른 글
RequestDispatcher에 foward와 response.sendRedirect url차이 (0) | 2018.04.18 |
---|---|
[JSP] MVC 패턴 구현 - URI 패턴 (0) | 2017.03.08 |
[JSP]DBCPInit2.java (0) | 2017.03.08 |
[JSP] 커넥션 풀 (0) | 2017.03.07 |
[JSP] 표준 태그 라이브러리(JSTL) (0) | 2017.03.05 |