无web.xml时嵌入式Jetty配置JSP Servlet及全局URL映射问题
解决嵌入式Jetty中映射所有URL到指定JSP/HTML文件的问题
首先针对你想用JSP方式的需求:原来web.xml里的<jsp-file>/index.jsp</jsp-file>配置,在嵌入式Jetty中可以通过给ServletHolder设置特定初始化参数来对应实现。这里不建议直接实例化JspServlet,用类名创建ServletHolder能让Jetty更好地管理Servlet生命周期,调整后的代码如下:
// 创建JSP Servlet的Holder,指定名称和类 ServletHolder jspHolder = new ServletHolder("home", JspServlet.class); // 对应web.xml里的<jsp-file>配置,设置init参数"jspFile" jspHolder.setInitParameter("jspFile", "/index.jsp"); jspHolder.setInitParameter("fork", "false"); jspHolder.setInitParameter("xpoweredBy", "false"); jspHolder.setInitOrder(1); // 将这个Holder映射到所有URL路径 context.addServlet(jspHolder, "/*");
不过既然你的index.jsp实际是纯HTML页面,完全可以跳过JSP容器的处理流程,用更轻量的方案实现,这里提供两个简便选项:
方案一:自定义Servlet转发到HTML文件
写一个极简Servlet,把所有请求都转发到你的index.html(记得先把HTML文件放到webapp根目录下):
class ForwardToIndexServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 统一转发到index.html req.getRequestDispatcher("/index.html").forward(req, resp); } // 按需处理POST等其他请求方法 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } // 在Jetty配置中注册这个Servlet并映射到所有路径 ServletHolder forwardHolder = new ServletHolder(new ForwardToIndexServlet()); context.addServlet(forwardHolder, "/*");
方案二:用RewriteHandler重写所有请求
Jetty的RewriteHandler可以直接实现URL重写,把所有请求指向/index.html,无需自定义Servlet,配置更简洁:
// 创建RewriteHandler实例 RewriteHandler rewriteHandler = new RewriteHandler(); // 添加重写规则:所有请求都重写到index.html RewriteRule rule = new RewriteRule() { @Override public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { return "/index.html"; } }; rewriteHandler.addRule(rule); // 将RewriteHandler加入Server的处理器链,同时关联你的WebAppContext server.setHandler(rewriteHandler); rewriteHandler.setHandler(context);
补充说明:你提到不能用欢迎页是对的——默认欢迎页机制仅匹配空路径或/的请求,无法覆盖所有URL模式,上面的方案都是专门针对“所有URL都映射到目标文件”的需求设计的。
内容的提问来源于stack exchange,提问作者branks
相关产品推荐
相关产品推荐

