使用不带web.xml的JSPServlet jsp文件

时间:2019-07-19 11:17:48

标签: java jetty embedded-jetty servlet-3.0

我正尝试从将Jetty与web.xml一起使用,转而使用嵌入式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才能映射到该文件(除非我也可以做到这一点,并且我缺少了一些东西)

2 个答案:

答案 0 :(得分:1)

首先,使用JettyJspServlet,而不是JspServlet

请参见https://github.com/jetty-project/embedded-jetty-jsp

您对JettyJspServlet的使用将仅配置为识别各种jsp扩展名(例如:*.jsp的url模式),而不直接附加到/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, "/*");

...但是对于“全HTML”的JSP文件来说,这个url模式是胡说八道。

此模式表示100%的请求将发送到您的/index.jsp

请查看示例项目,因为在嵌入式码头中设置JSP非常棘手!在JSP正常运行之前,必须以正确的方式进行很多工作。

juuust 。

您可能想要使用欢迎文件行为,如果该请求的URL返回404,将对请求的URL进行解析(请注意这个词!),请依次尝试欢迎文件列表(使用类似于URI.resolve(String)的技术,直到返回除404之外的其他值。

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

<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"});

答案 1 :(得分:0)

基于@ joakim-erdfelt的回答,我最终使用了默认index.html文件的欢迎列表,然后创建了一个自定义ErrorHandler,它针对404错误将请求转发至/,然后将其转发给/然后返回索引文件。

对localhost:8080的任何请求都会正确返回welcomeFiles中列出的index.html页面,但是localhost:8080 / foo只会返回404错误

RequestDispatcher dispatcher = request.getRequestDispatcher(redirectRoute);
if (dispatcher != null && response.getStatus() == HttpServletResponse.SC_NOT_FOUND) {
    try {
        response.reset();
        dispatcher.forward(request, response);
    } catch (ServletException e) {
        super.handle(target, baseRequest, request, response);
    }
} else if (response.getStatus() == HttpServletResponse.SC_NOT_FOUND) {
    logger.info("Can not redirect to /, no dispatcher found. Will show system 404 page");
} else {
    super.handle(target, baseRequest, request, response);
}