Tomcat 服务器向 servlet 发出 3 个请求

2024-05-15

下面是我的doGet method

@WebServlet(
        name = "IndexServlet",
        urlPatterns={ "/", "/home" },
        initParams = { @WebInitParam(name = "sortBy", value = Constants.POPULAR) }
)
public class IndexServlet extends HttpServlet {

    private DataSource pool;

    @Override
    public void init() throws ServletException {
        String datasource_name = "jdbc/bookhive_db";
        try {
            //A JNDI Initial context to be able to lookup the DataSource
            InitialContext ctx = new InitialContext();
            pool = (DataSource) ctx.lookup("java:comp/env/" + datasource_name);
            if (pool == null)
                throw new ServletException("Unknown DataSource '" + datasource_name + "'");
        } catch (NamingException ex) {
            ex.printStackTrace();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int page;
        try {
            page = Integer.parseInt(request.getParameter("page"));
        } catch (NumberFormatException e) {
            page = 1;
        }

        String sortBy = request.getParameter("sortBy");
        if (sortBy == null || sortBy.isEmpty())
            sortBy = this.getInitParameter("sortBy");

        String query = getQuery(sortBy);
        Object[] params = {
                (page - 1) * Constants.RESULTS_PER_PAGE,
                Constants.RESULTS_PER_PAGE
        };

        JDBCService service = new JDBCService(pool);
        service.setQuery(query);
        service.setParams(params);
        List<Book> books = service.getBookDetails();


        System.out.println("HELLO");

        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/index.jsp");
        dispatcher.forward(request, response);
    }
}

当我启动服务器(Tomcat)时,它会打开http://localhost:8080在浏览器和doGet方法被调用 3 次。它打印“Hello”3 次。

仅当我第一次启动服务器时才会发生这种情况。

知道为什么会发生这种情况吗?


Tomcat 将“ping”Web 应用程序的根 URL,以验证其是否已成功部署。如果您使用 IDE 来管理服务器,那么它可能会执行其他检查。然而,确实奇怪的是,它被调用了三次,而不是一次或两次。

结果是什么?

@WebServlet(
    name = "IndexServlet",
    urlPatterns={ "/", "/home" },
    initParams = { @WebInitParam(name = "sortBy", value = Constants.POPULAR) })

通过将其显式映射到 URL 模式/,你把它变成了默认servlet对于网络应用程序!每个与任何显式注册的 servlet 的 URL 模式不匹配的请求都将最终出现在该 servlet 中。通常,这些请求会命中 CSS、JS 和图像文件等静态资源。通常,servlet 容器已经提供了一个现成的默认 servlet。例如 Tomcat 有DefaultServlet https://tomcat.apache.org/tomcat-8.0-doc/default-servlet.html为了这个目的。

所以想象一下index.jsp文件依次引用 CSS 和 JS 文件,然后对/home将调用 servlet 三次(浏览器将针对该 CSS 和 JS 文件获取难以消化的 HTML 输出index.jsp而不是所需的 CSS 和 JS 输出)。

摆脱/网址模式。这是使用“主页”servlet 的错误方法。相反,添加一个<welcome-file>home</welcome-file> to the web.xml。除非您确实知道自己在做什么,否则不要从容器中接管默认的 servlet 作业。

也可以看看:

  • servlet 映射 url 模式中 / 和 /* 之间的区别 https://stackoverflow.com/questions/4140448/difference-between-and-in-servlet-mapping-url-pattern
  • 如何在index.jsp上加载servlet https://stackoverflow.com/questions/15839854/how-load-servlet-on-index-jsp/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tomcat 服务器向 servlet 发出 3 个请求 的相关文章

  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 在应用程序服务器上存储 PDF 一段有限的时间并可供下载

    您好 我正在使用 PrimeFaces 5 JSF 2 和 tomcat 有人可以向我展示或给我一个关于如何在应用程序服务器上在有限时间内存储 pdf 的想法吗 我正在使用 tomcat 然后下载它 如果这是用户请求的 此功能与发票相关 因
  • 文件上传后如何隐藏上传按钮?

    我使用 blueimp 和 jquery UI 进行文件上传 我想在上传文件后隐藏此按钮 并在照片被删除时再次显示它 我该怎么做呢 这是我的 HTML
  • 使用 WTP 更改 eclipse 内置的 tomcat context.xml 文件?

    当您执行 运行为 gt 在服务器上 和 调试为 gt 在服务器上 时 是否可以以某种方式修改 eclipse 使用的 context xml 的内容 我们在生产环境 context xml 文件中有一些设置 并且我们需要它们也可用于 tom
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • Tomcat:Java 静态变量作用域、应用程序范围还是会话范围?

    java 静态变量是否在使用相同 web 应用程序的所有会话之间共享 或者每个会话都有自己的静态变量版本吗 换句话说 Tomcat 是为每个会话创建一组新的类 还是为整个 Web 应用程序创建一组新的类 Tomcat 创建一个ClassLo
  • Tomcat从Eclipse和startup.sh启动

    奇怪的事情发生了 我可以从 Eclipse 和startup sh 启动Tomcat 从 Eclipse 运行我可以访问 localhost 8080 而从startup sh 运行时我不能 可能是什么问题呢 Ubuntu 11 10 在
  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • JSP 和 scriptlet

    我知道现在使用 scriptlet 被认为是禁忌 没关系 我会同意Top Star的话 因为我目前只是Java新手 到目前为止我听到的是 它是为了让设计师的生活更轻松 但我想知道 这是否与JSP页面的性能有关 另一方面 如果只是为了 让设计
  • 如何在 Servlet 中打开弹出窗口,然后重定向页面

    我想在调用 servlet 时打开一个弹出窗口 然后想将 servlet 重定向到某个 jsp page 这就是我所做的 protected void doGet HttpServletRequest request HttpServlet
  • 将 JSF 2.1 与 JSP 2.0 结合使用时出错:无法从 JAR 文件中读取 TLD

    我尝试在 JSP 2 0 中使用 JSF 2 1 当我添加这个时 我收到以下错误 Unable to read TLD META INF html basic tld from JAR file file home fadhel m2 re
  • Spring Security登录返回404

    我目前正在使用 Spring 框架开发我的博客 我正在实现 Spring Security 用于登录目的 一切都按预期进行 直到我提交始终返回 404 代码的登录凭据 这是我的 web xml 代码e
  • 如何使用 Tomcat 启用浏览器缓存静态内容(图像、css、js)?

    如何使用 Tomcat 启用浏览器缓存静态内容 图像 css js 首选的解决方案是编辑 spring MVC 配置文件或 web xml 尝试 改变值
  • 在 Tomcat 中触发内部 ServletRequest

    我正在使用 Quartz 来安排 Web 应用程序的后台任务 其中一些任务只是针对同一 Web 应用程序发出请求 我想避免依赖于任何类型的网络设置 例如 如果从数据中心内发出带有我自己域名的请求 则可能无法正确路由 是否有一个 Java A
  • 如何防止 Firefox 缓存

    我尝试了很多可能的解决方案 但无法解决问题 这些不起作用 有人可以帮忙吗 我正在使用jsp servlet application 是websphere Portal 6 1 的一个portlet 切勿
  • 在 JSP 中从 JavaScript/jQuery 调用后端 Java 方法

    我有一个 JSP 其中有一个select包含实体种类名称的列表 当我选择一个实体类型时 我需要填充另一个实体类型select包含所选实体类型的字段名称的列表 为此 我调用了一个 JavaScript 函数onchange event 在 J
  • 在Tomcat中设置环境变量TESSDATA_PREFIX

    我们正在使用名为 Tess4J 的 Tesseract OCR Java 库 如果作为独立应用程序运行 它可以正常工作 它需要一个名为 TESSDATA PREFIX 的变量 其中包含 tessdata 配置和其他字符集相关文件 它也可以与
  • 使用 Spring MVC 在 jar 文件中显示 jsp 页面

    我正在使用 Spring MVC 3 2 2 在 java 中开发一个 Web 应用程序 我在从 jar 文件中加载 jsp 页面时遇到问题 Spring MVC Web应用程序具有以下结构 META INF WEB INF spring
  • 如何允许/限制某些计算机名称访问 tomcat 服务器?

    我在我的电脑上打开了一个服务器 我所有在同一网络上的朋友都可以从他们的计算机访问它 但我只想让我的一位朋友访问 所以我尝试在我的中写下以下内容context xml
  • 如何在 Spring Mvc 项目中设置上下文根

    我在 Tomcat 服务器中使用 Spring MVC 项目 每次运行应用程序时 服务器上下文根都会更改 如何设置固定上下文根 我的项目名称是 DemoApplication 首先部署此上下文根 路径是 http localhost 808

随机推荐