【问题标题】:server error while dispatching from servlet to jsp从 servlet 分派到 jsp 时出现服务器错误
【发布时间】: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 个字符。

标签: jsp servlets


【解决方案1】:

这可能是因为 Dispatcher 在错误的地方寻找 JSP。

根据您提供的信息,我可以找出您的 servlet 的 URL,就像您更新了 web.xml:

http://localhost:8080/<rootContext>/tracker

现在,req.getRequestDispatcher("/FullTracking.jsp").forward(req,res); 将在 http://localhost:8080/&lt;rootContext&gt;/ 中查找 jsp。 确保 jsp 出现在此位置。

就您的问题而言,这不会为您提供确切的计数,因为您的程序是 NOT ThreadSafe 锁定您的地图,以便一次只有一个人可以访问它

private Hashtable<String,AtomicInteger> 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());

        synchronized (links) {

            if (links.containsKey(resource)) {
                AtomicInteger count = links.get(resource).incrementAndGet();
                links.put(resource, count);
            } else {
                links.put(resource, new AtomicInteger(1));
            }

        }
        req.setAttribute("links", links);
        req.getRequestDispatcher("/FullTracking.jsp").forward(req, res);
    }

【讨论】:

  • 我没有保留web.xml的更改,JSP在web app的根目录。
  • 你的jsp在哪里?
  • 对我来说看起来不错。检查你在 server.xml 中的上下文根目录,以防 Tomcat 是你的容器
  • tomcat 8.5.27 是我正在使用的容器。我之前没有在 server.xml 中为任何 Web 应用测试配置上下文根。
  • 如果您使用任何 ide eclipse 或 netbeans,它会为您完成它
猜你喜欢
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 2014-05-28
  • 1970-01-01
相关资源
最近更新 更多