我有這個問題,最近我閱讀了關於REST的一個架構,它具有完美的意義,所以我想實現一個RESTful Web應用程序。避免JSP servlet映射中的無限循環
現在,我正在關注的Front Controller pattern這意味着所有的URL映射到的controller.java
的servlet,我映射通過特定的網址,而不會使用/*
通配符, 控制器實現了四個HTTP方法POST
, 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/*
特定的順序,當運行到一個特定的問題,它被映射到控制器servlet,該執行的動作和我加載適當的順序從動作返回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()
調度。
現在,這裏是循環被觸發,我用下面的網址,myapp/orders/78965
/orders/*
被映射到controller.java
執行相應的操作,正確的順序是由pathInfo()
發現返回的觀點是new View(View.DispatchMethod.FORWARD,"order_details.jsp")
的問題是,隨着三種可用的調度方法REDIRECT,FORWARD and INCLUDE
一個請求在URL上重新觸發,等等,我永遠不會到達呈現數據的order_details.jsp
。
那麼,你將如何避免循環,因爲我想保留顯示訂單號的URI,我使用forward方法,同樣,我想用servlet來做,我聽說過UrlRewriteFilter可能在將來,但現在,在使用Front Controller模式後,如何使用「Plain Vanilla」來完成,是否有必要在/orders/
URI中添加一個額外的servlet?
任何幫助或見解是真正讚賞。
編輯1:
粘貼控制器,一個很基本的一個源代碼,我有我的懷疑,即方式service
方法調用所有的servlet的重寫do[Method]
被觸發循環和它可以通過分割它們來解決。
你正在談論servlet,但是症狀表明你正在使用一個過濾器來掛接所有三種調度方法,而不是(默認)'REQUEST'。或者我完全誤解了你? – BalusC 2011-04-14 04:22:35
我唯一使用的過濾器是一個認證過濾器,它是使用'/ *'應用的indee,但是我不知道如何觸發請求一遍又一遍,因爲它只檢查用戶是否登錄。 – Triztian 2011-04-14 05:58:59
嗯..我我很樂意提供幫助,但是您必須展示一個最低限度必要的代碼片段,它只顯示重現此問題的原始Servlet API類/方法,而不是您沒有其他人瞭解的私有/本地生成的API。順便說一句,這只是一個私人學習練習?如果是這樣,那麼我就不要那麼着急,如果不是的話,我建議採用一個現有的API,而不是像一個美妙的JAX-RS API那樣使用現有的API。它也構建在Servlet API之上。另見http://www.vogella.de/articles/REST/article.html – BalusC 2011-04-14 16:10:05