以下是我的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次。这仅在我第一次启动服务器时发生。
知道为什么会这样吗?
最佳答案
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
。因此,假设
index.jsp
文件又引用了CSS和JS文件,然后/home
上的单个请求将调用servlet 3次(浏览器将对该CSS和JS文件获取不易消化的HTML输出) index.jsp
而不是所需的CSS和JS输出)。摆脱
/
URL模式。这是拥有“主页” servlet的错误方法。而是将<welcome-file>home</welcome-file>
添加到web.xml
。除非您真的知道自己在做什么,否则不要从容器中接管默认的Servlet作业。也可以看看:
Difference between / and /* in servlet mapping url pattern
How load servlet on index.jsp