【发布时间】:2018-10-28 15:38:07
【问题描述】:
我想记录对我的网络应用程序中任何资源的访问次数: 这是我的课:
public class FullTracking extends HttpServlet
{
Hashtable<String,Integer> links=new Hashtable<>();
public void doGet(HttpServletRequest req,HttpServletResponse res) throws
ServletException,IOException{
String uri=req.getRequestURI();
String resource=uri.substring(req.getContextPath().length(),uri.length());
if(links.containsKey(resource)){
Integer count=links.get(resource);
links.put(resource,new Integer(1+count.intValue()));
}
else{
links.put(resource,new Integer(1));
}
req.setAttribute("links",links);
req.getRequestDispatcher("/FullTracking.jsp").forward(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res) throws
ServletException,IOException{
doGet(req,res);
}
}
FullTracking.jsp:
<%@ page import="com.tests.FullTracking,java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
key/value pairs:<br/>
<c:forEach var="r" items="${links}">
${r.key}:${r.value}<br/>
</c:forEach>
web.xml:
<servlet>
<servlet-name>FullTracking</servlet-name>
<servlet-class>com.tests.FullTracking</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FullTracking</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
如果我使用当前映射访问任何资源,我会收到内部服务器错误 (500),以及以 java.lang.StackOverflowError 的根本原因结尾的冗长堆栈跟踪
req.getRequestDispatcher("/FullTracking.jsp").forward(req,res);
如果我将 web.xml 中的映射更改为:
<servlet-mapping>
<servlet-name>FullTracking</servlet-name>
<url-pattern>/tracker/*</url-pattern>
</servet-mapping>
没有错误,但结果不是我所期望的。 学习目的:我想了解调度和java.lang.StackOverflowError之间的联系。
Type Exception Report
Message Servlet execution threw an exception
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
javax.servlet.ServletException: Servlet execution threw an exception
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.tests.FullTracking.doGet(FullTracking.java:24)
javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
Root Cause
java.lang.StackOverflowError
javax.servlet.http.HttpServletRequestWrapper.getMethod(HttpServletRequestWrapper.java:123)
javax.servlet.http.HttpServletRequestWrapper.getMethod(HttpServletRequestWrapper.java:123)
javax.servlet.http.HttpServlet.service(HttpServlet.java:628)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.tests.FullTracking.doGet(FullTracking.java:24)
javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.tests.FullTracking.doGet(FullTracking.java:24)
提前致谢
编辑:
我了解java.lang.StackOverflowError 的来源。事实上,请求被 servlet 捕获是因为映射,然后从调度程序内部通过相同的映射转发到 jsp,这又被 servlet 捕获,依此类推。
我现在的问题是关于如何告诉调度程序在转发到 JSP 时不要通过映射?
【问题讨论】:
-
发布异常消息?
-
@YatiSawhney 我无法发布完整的堆栈跟踪,它有 68 000 个字符。正文不能超过 30 000 个字符。