이 문제점이 있습니다. 최근에 REST arquitecture에 대해 읽었으며 완벽한 의미로 작성되어 있으므로 RESTful 웹 애플리케이션을 구현하고 싶습니다.JSP 서블릿 매핑에서 무한 루프를 피하십시오.
지금, 나는이 URL 맵핑 모두가controller.java
서블릿에 갈 것을 의미
Front Controller pattern 다음있어
, 내가 아닌 /*
와일드 카드를 사용하여, 컨트롤러는 네 개의 HTTP 방법 POST
는 구현, 특정 URL에 의해에게지도 GET
, PUT
, DELETE
, 각 메서드는 service
컨트롤러를 호출하고 거기에 따라 HttpServletRequest
및 pathInfo
실행할 작업을 결정합니다. Controller.java이
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
IAction action;
View view;
try {
action = ActionFactory.produceAction(req);
view = action.execute(req, resp);
switch (view.getDispatchMethod()) {
case REDIRECT:
resp.sendRedirect(resp.encodeURL(view.getResource()));
break;
case FORWARD:
req.getRequestDispatcher(view.getResource()).forward(req, resp);
break;
case INCLUDE:
req.getRequestDispatcher(view.getResource()).include(req,resp);
break;
default:
}
} catch (ActionFailedException uae) {
req.setAttribute("ActionName", "Action");
req.setAttribute("FailCause", uae.getMessage());
req.getRequestDispatcher(VIEW_FAIL.getResource()).forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.service(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.service(req, resp);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.service(req, resp);
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.service(req, resp);
}
URI를 /orders/*
하여 특정 순서를로드 할 때 특정 문제로 실행했습니다,이 컨트롤러 서블릿에 매핑되면, 작업이 실행되고 나는 액션 적절한 순서를로드 반환하는 View.java
클래스
//ommited accessors and mutators for brevety.
public class View {
public enum DispatchMethod {
INCLUDE, FORWARD, REDIRECT
}
private DispatchMethod dispatchMethod;
private String resource;
public View(DispatchMethod dispatchMethod, String resource) {
this.dispatchMethod = dispatchMethod;
this.resource = resource;
}
}
그런 요청이 반환보기의 getDispatchMethod()
에 따라 전달됩니다.
, 여기에 루프가 트리거됩니다 어디에, 나는 다음과 같은 URL, myapp/orders/78965
/orders/*
적절한 조치가 실행 controller.java
에 매핑됩니다 올바른 순서가 돌아보기가 문제가와 있다는 것입니다 new View(View.DispatchMethod.FORWARD,"order_details.jsp")
입니다 pathInfo()
에 의해 발견을 사용하는 것입니다 세 가지 사용 가능한 디스패치 방법 REDIRECT,FORWARD and INCLUDE
요청이 URL에서 다시 트리거되는 등 계속해서 데이터를 렌더링하는 order_details.jsp
에 도달하지 않습니다.
그래서 순방향 메소드를 사용하는 URI를 보존하고 싶다면 서핑을 사용하고 싶습니다. UrlRewriteFilter가 앞으로는 가능할지 모르지만, Front Controller 패턴을 사용하고 있기 때문에 "Plain Vanilla"를 사용하면 어떻게 될까요? /orders/
URI에 추가 서블릿을 추가해야할까요?
도움이나 의견을 보내 주시면 감사하겠습니다.
편집 1 :
붙여 컨트롤러, 아주 기본적인 하나의 소스 코드, 나는 방법은 service
방법은 서블릿의 오버라이드 (override) do[Method]
의 모든 호출 트리거 것이 내 의심을 루프와 splittig 그들을 해결할 수 있습니다.
당신은 서블릿에 대해 이야기하고 있지만 증상은 사용자가 (기본값) 'REQUEST'대신 3 가지 디스패치 방법을 모두 사용하는 필터를 사용하고 있음을 나타냅니다. 아니면 내가 너를 오해하고있는거야? – BalusC
내가 사용하는 유일한 필터는 인증 필터입니다.이 필터는'/ * '를 사용하여 적용되었지만 사용자가 로그인했는지 여부 만 확인하기 때문에 요청이 반복되는 방식을 볼 수 없습니다. – Triztian
글쎄 .. 도울 필요는 없지만 다른 사람이 알지 못하는 사설/자체 개발 API 대신이 정확한 문제를 재현하는 원시 Servlet API 클래스/메소드를 보여주는 최소한의 필요한 코드 스 니펫을 표시해야합니다. 그건 그렇고, 이것은 개인 학습 활동입니까? 그렇다면 나를 잊지 않고 그냥 계속 진행하십시오. 그렇지 않다면 훌륭한 JAX-RS API와 같은 기존 API 대신 기존 API를 채택하는 것이 좋습니다. Servlet API를 기반으로 구축되었습니다. 또한 http://www.vogella.de/articles/REST/article.html을 참조하십시오. – BalusC