下面是我的doGet方法
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次。它会打印“ Hello” 3次。
http://localhost:8080
这仅在我第一次启动服务器时发生。
知道为什么会这样吗?
Tomcat将“ ping” Web应用程序的根URL,以验证其是否已成功部署。如果您使用IDE来管理服务器,则它可能会执行其他检查。但是,它被调用了3次却没有一两次,也许确实很奇怪。
结果如何?
@WebServlet( name = "IndexServlet", urlPatterns={ "/", "/home" }, initParams = { @WebInitParam(name = "sortBy", value = Constants.POPULAR) })
通过将其显式映射到的URL模式/,您将其 设置 为Web应用程序的 默认servlet !每个与任何明确注册的servlet的URL模式都不匹配的请求都将在该servlet中结束。通常,这些请求会击中CSS,JS和图像文件等静态资源。通常,servlet容器已经提供了默认的servlet。例如Tomcat就具有此DefaultServlet用途。
/
DefaultServlet
因此,假设该index.jsp文件依次引用了一个CSS和JS文件,那么一个请求/home将调用servlet 3次(浏览器将对该CSS和JS文件获取index.jsp而不是所需CSS的无法理解的HTML输出。和JS输出)。
index.jsp
/home
摆脱/URL模式。这是拥有“主页” servlet的错误方法。而是将添加<welcome-file>home</welcome- file>到web.xml。除非您真的知道自己在做什么,否则不要从容器中接管默认的Servlet作业。
<welcome-file>home</welcome- file>
web.xml