如何解决避免JSP servlet映射中的无限循环
| 我遇到了这个问题,最近我阅读了有关REST架构的文章,这很有意义,所以我想实现一个RESTful Web应用程序。 现在,我遵循的是Front Controller模式,这意味着所有URL映射都转到controller.java
servlet,我通过特定的URL而不是使用/*
通配符来映射,
控制器实现了四个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,IOException {
this.service(req,resp);
}
@Override
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,resp);
}
@Override
protected void doPut(HttpServletRequest req,resp);
}
@Override
protected void doDelete(HttpServletRequest 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()
调度请求。
现在,这是触发循环的地方,我使用以下URL,将myapp/orders/78965
10映射到ѭ0,将执行适当的操作,并由ѭ17找到正确的顺序,返回的视图是new View(View.DispatchMethod.FORWARD,\"order_details.jsp\")
问题是三个可用调度方法REDIRECT,FORWARD and INCLUDE
再次在URL上触发请求,依此类推等等,我再也没有到达呈现数据的order_details.jsp
。
因此,您如何避免循环,因为我想保留显示我使用forward方法的订单号的URI,而且我想使用servlet来完成此操作,所以我听说过UrlRewriteFilter也许在将来,但是现在,由于我使用的是Front Controller模式,因此如何使用\“ Plain Vanilla \”来完成,是否有必要在/orders/
URI中添加一个附加的servlet?
如有任何帮助或见解,我们将不胜感激。
编辑1:
粘贴了控制器的源代码,这是一个非常基础的代码,我怀疑service
方法调用servlet的所有重写do[Method]
的方式将触发循环,并且可以通过splittig解决这些问题。
解决方法
使用RESTEasy或Jersey这样的JAX-RS实现,用Java实现RESTful HTTP接口要容易得多。
使用Front Controller将请求调度到正确的资源是一种很好的方法,这正是这些JAX-RS框架所采用的方法。我担心您可能会在现成的情况下通过编写定制的URL解析和调度机制来重新发明轮子。
JAX-RS是一种公开资源的轻量级方法。通过使用几个简单的注释,您可以公开REST接口,而无需进行任何设置。例如:
public class Order {
@GET
@Path(\"/orders/{orderId}\")
@Produces(\"text/html\")
public void getOrder(@Context HttpServletResponse response,@Context HttpServletRequest request,@PathParam(\"orderId\") String orderId) throws ServletException,IOException {
// ... create view and add to request here
request.getRequestDispatcher(\"orders.jsp\").forward(request,response);
}
}
您可以看到将此类附加到URL路径有多么简单(使用@Path
注释),以及使用@PathParam
可以轻松地从URL解析值。由于您可以直接使用所有管道,调度/解析工具,因此您可以专注于应用程序中特定于域的部分(例如订单包含的内容)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。