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 个请求 的相关文章

随机推荐