首页 > 解决方案 > 使用没有 web.xml 的 JSPServlet jsp 文件

问题描述

我正在尝试从使用带有 web.xml 的 Jetty 转向使用嵌入式 Jetty。我已经设法使用 HttpServletDispatchers 移动了我的 REST 端点,但是我正在努力让 JSP servlet 移动

目前,在 web.xml 我有

<servlet-mapping>
    <servlet-name>home</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>home</servlet-name>
    <jsp-file>/index.jsp</jsp-file>
</servlet>

我拥有的 Java 代码类似于

final JspServlet indexServlet = new JspServlet();
final ServletHolder indexServletHolder = new ServletHolder("jsp", indexServlet);
indexServletHolder.setInitParameter("fork", "false");
indexServletHolder.setInitParameter("xpoweredBy", "false");
indexServletHolder.setInitOrder(1);

context.addServlet(indexServletHolder, "/*");

但我无法确定在哪里添加与

<jsp-file>/index.jsp</jsp-file>

进入Java

索引文件实际上只是一个普通的 html 页面,所以如果有一个更简单的方法来做到这一点而不是 JSP 文件,那么它也可以。但是,我不能将此文件作为欢迎文件,因为我需要将所有 URL 映射到这个文件(除非我也可以这样做并且我遗漏了一些东西)

标签: javajettyembedded-jettyservlet-3.0

解决方案


首先,使用JettyJspServlet,而不是JspServlet

https://github.com/jetty-project/embedded-jetty-jsp

您的使用JettyJspServlet将仅配置为识别各种 jsp 扩展(例如:的 url 模式*.jsp),而不是直接附加到/index.jsp(其他 servlet 映射将是您的实际 jsp 文件和引用)

对于与...的 web.xml 段等效的代码

<servlet-mapping>
    <servlet-name>home</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>home</servlet-name>
    <jsp-file>/index.jsp</jsp-file>
</servlet>

这将是 ...

ServletHolder homeHolder = new ServletHolder();
homeHolder.setName("home");
homeHolder.setForcedPath("/index.jsp"); // equiv to <jsp-file>
context.addServlet(homeHolder, "/*");

...但是这个 url 模式对于“全 html”的 JSP 文件来说是无意义的。

这种模式意味着 100% 的请求将发送到您的/index.jsp.

请看示例项目,因为在 Embedded-jetty 中设置 JSP 非常棘手!在 JSP 正常工作之前,许多事情必须以正确的方式就位。

您可能希望使用欢迎文件行为,如果请求的 URL 将返回 404,它将针对请求的 URL 解析(注意这个词!),欢迎文件列表一个接一个地尝试(使用技术类似于URI.resolve(String)直到返回除 404 之外的其他内容。

WEB-INF/web.xml在将在以下代码段中表示的标准 servlet 描述符中...

<web-app 
   xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
   metadata-complete="false"
   version="3.1"> 

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file> <!-- relative ref -->
    <welcome-file>/index.jsp</welcome-file> <!-- absolute ref -->
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
</web-app>

或在代码中...

context.setWelcomeFiles(new String[]{"index.jsp", "/index.jsp", "index.html"});

推荐阅读