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

时间:2015-06-27 13:29:28

标签: jsp tomcat servlets

以下是我的doGet方法

@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次。它打印“你好”#39; 3次。

这只发生在我第一次启动服务器时。

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

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

结果是什么?

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

通过在/的URL模式上显式映射,您将其设为Web应用程序的默认servlet !与任何显式注册的servlet的URL模式不匹配的每个请求都将在该servlet中结束。通常情况下,这些请求会遇到CSS,JS和图像文件等静态资源。通常,servletcontainer已经提供了一个默认的servlet。例如,Tomcat有DefaultServlet用于此目的。

因此假设index.jsp文件依次引用CSS和JS文件,那么/home上的单个请求将调用servlet三次(并且浏览器会调用该CSS和JS) file获取index.jsp的不可提取的HTML输出,而不是所需的CSS和JS输出。

摆脱/网址格式。这是拥有“主页”servlet的错误方法。而是向<welcome-file>home</welcome-file>添加web.xml。除非您真的知道自己在做什么,否则不要从容器中接管默认的servlet作业。

另见:

答案 1 :(得分:1)

我认为可能会发生这种情况,因为您从IDEA或Eclipse启动服务器,检查您的部署是否正常。我同意Ulrich的回答,你应该使用curl或wget来调用url。并尝试不是从IDE启动服务器(如果你)。