我正尝试从将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才能映射到该文件(除非我也可以做到这一点,并且我缺少了一些东西)
答案 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);
}