티스토리 뷰

처음으로 올릴 JSP 포스팅은 서블릿 맵핑을 간단히 하기위한 방법입니다.

페이지 별로 객체화하여 사용하도록 하는 방법으로 한 번 만들어 놓으면 유용하게 재사용이 가능합니다.

프로젝트 생성방법은 따로 설명드리지 않고 바로 시작하겠습니다!


1. DispatcherServlet.java / Controller.java / urlmapper.txt / web.xml 기본 준비하기!!

1) DispatcherServlet.java


프로젝트 경로내에 java Resources-src 하위에 new - Servlet을 만들어 줍니다.



패키지/클래스 명은 꼭 저렇게 하지 않으셔도 되고요.

편하신대로 설정하세요^^

저는 controller/DispatcherServlet 로 설정하였습니다.


2) urlmapper.txt / web.xml



WebContent/WEB-INF

경로 아래에 mapper 파일과 xml 파일 모두 생성해놓았습니다.


3) Controller.java

package controller;

import java.io.IOException;
import java.sql.SQLException;

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

public interface Controller {
	public String execute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException, ClassNotFoundException, SQLException;

}


여기까지 완료되셨다면 일단 기본 준비는 끝났습니다.

자 이제 시작해 볼까요 ??


2. web.xml을 이용하여 dispatcher/mapper 설정하기

Welcome to Tomcat Welcome to Tomcat dispatcher controller.DispatcherServlet mapPath /WEB-INF/urlmapper.txt dispatcher *.htm


기본소스는 톰캣 하위 web.xml 파일과 동일하게 하셔도 되고요.

새로이 작성하셔도 됩니다.^^

위 소스 처럼 수정해주세요.


url-pattern은 어떤 확장자로 접근할 시 맵핑을 할지 설정해 주는 부분입니다.

저는 .htm으로 접근하면 맵핑 할 수 있도록 설정하였습니다.

여기까지 web.xml의 설정이 끝났습니다.


2. DispatcherServlet.java



// @WebServlet("/DispatcherServlet")
public class DispatcherServlet extends HttpServlet {
private List<String> urls;
private List<Controller> ctrls;
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public DispatcherServlet() { // 생성자 변수 초기화
super();
urls = new ArrayList<String>();
ctrls = new ArrayList<Controller>();
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
*      response)
*/
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String ctxName = request.getContextPath();
String uri = request.getRequestURI();


if (uri.indexOf(ctxName) == 0)
uri = uri.substring(ctxName.length());

try {
String url="";
Controller controller = new ErrorController();
for(int i = 0; i<urls.size(); i++)
if (urls.get(i).equals(uri)) {
controller = ctrls.get(i);
break;
}
url = controller.execute(request, response);

if(url.indexOf("redirect:") == 0){
url = url.split(":")[1];
response.sendRedirect(url);
}else if(url.indexOf("void:") == 0);
else
request.getRequestDispatcher(url).forward(request, response);

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();

}

@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
String mapPath = config.getInitParameter("mapPath");
String path = config.getServletContext().getRealPath(mapPath);

FileInputStream fis;
try {
fis = new FileInputStream(path);
Scanner scan = new Scanner(fis);
while(scan.hasNext()){
String[] map = scan.nextLine().split(",");
urls.add(map[0]);
ctrls.add((Controller)Class.forName(map[1]).newInstance());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
service(request, response);
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
*      response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
}

}

위와 같이 코딩해주세요. (SyntaxHighlighter를 쓰면 이상하게 나와서 그냥 소스만 붙여넣었습니다.) 

저는 기본 페이지를 ErrorController로 하여 잘못된 페이지 진입 시 ErrorController로 접근하도록 하였습니다.


web.xml에서 설정한 mapPath를 사용하여 txt 파일을 불러옵니다.

,로 스플릿을 하여 좌측은 진입 url 우측은 접근 컨트롤러로 저장하게 됩니다.


3.mapping 방법


마지막으로 맵핑 방법에 대하여 알아보겠습니다.

urlmapper.txt 파일에

/index.htm,controller.IndexController

를 작성해 주시고, controller 패키지 아래 IndexController.java 파일을 만들어주세요

WEB-INF 경로 아래에는 실질적으로 연동 될 index.jsp 파일을 만들어 주세요.


 1) index.jsp


저는 간단한 테스트를 위해 <H1> 태그를 사용하여 출력만 하는 페이지를 만들었습니다.


 2) IndexController.jsp

컨트롤러에서는 실제 index.jsp 페이지가 존재하는 경로를 return 값에 넣어 줍니다.


빌드를 해 보시면



이런 결과물을 확인 하실 수 있습니다.



이 방법을 한번 구축해 놓으시면, 추후에 urlmapper.txt 파일에 접근 url과 controller 입력만으로 쉽게 맵핑이 가능해집니다.

개발하시다 궁금하신 점이 있으면 댓글 주세요^^~





댓글
댓글쓰기 폼
최근에 달린 댓글
Total
101,430
Today
77
Yesterday
36
«   2019/08   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31