如何在 web.xml 中配置欢迎文件列表

Posted

技术标签:

【中文标题】如何在 web.xml 中配置欢迎文件列表【英文标题】:How to configure welcome file list in web.xml 【发布时间】:2013-01-16 21:01:00 【问题描述】:

我的 web.xml 文档中有这个。我正在尝试创建一个欢迎列表,因此我不再需要键入主页的路径。但是每次点击我的tomcat页面中的应用程序时,它都会显示请求的资源不可用。

<listener>
    <listener-class>web.Init</listener-class>
</listener>

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

<servlet>
    <servlet-name>index</servlet-name>
    <servlet-class>web.IndexServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>index</servlet-name>
    <url-pattern>/index</url-pattern>
</servlet-mapping>

我的jsp页面servlet

package web;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

public class IndexServlet extends HttpServlet

    private Logger logger = Logger.getLogger(this.getClass());
    private RequestDispatcher jsp;

    public void init(ServletConfig config) throws ServletException
    
        ServletContext context = config.getServletContext();
        jsp = context.getRequestDispatcher("/WEB-INF/jsp/index.jsp");
    

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    
        logger.debug("doGet()");
        jsp.forward(req, resp); 
    

为什么它仍然不起作用?我仍然需要在我的 url 中输入 /index...如何正确执行此操作?

【问题讨论】:

你在你的 URL 中输入了什么,你有 index.html 页面吗?? 例如我在tomcat管理器中点击了我的webapp。它将首先显示 url localhost:8080/myProj。所以我仍然需要在那个 url 之后输入索引来打开我的欢迎页面。这有什么问题? 您的欢迎文件是 [context root]/index.jsp 将不会为欢迎页面调用 servlet。 @BalusC 已经给出了完整的答案,请关注它 【参考方案1】:

您需要将 JSP 文件放入 /index.jsp 而不是 /WEB-INF/jsp/index.jsp。顺便说一下,这样整个 servlet 就显得多余了。

WebContent
 |-- META-INF
 |-- WEB-INF
 |    `-- web.xml
 `-- index.jsp

如果您绝对肯定需要以这种奇怪的方式调用 servlet,那么您应该将其映射到 /index.jsp 而不是 /index 的 URL 模式。您只需将其更改为从 request 而不是从 config 获取请求调度程序,并摆脱整个 init() 方法。

如果你真的打算有一个“主页 servlet”(因此不是一个欢迎文件——它有一个完全不同的目的;即当一个 folder 被请求,因此不是根文件夹),那么您应该将 servlet 映射到空字符串 URL 模式。

<servlet-mapping>
    <servlet-name>index</servlet-name>
    <url-pattern></url-pattern>
</servlet-mapping>

另见Difference between / and /* in servlet mapping url pattern。

【讨论】:

您在/WEB-INF/jsp/index.jsp 文件夹中有它。您在根文件夹中没有 /index.jsp。答案是放在根文件夹,与/WEB-INF文件夹同级。 我试图改变它,但仍然是同样的问题。资源不可用 清理、重建、重新部署、重启。 谢谢你的回复,这张图是对的:)【参考方案2】:

我猜你想要的是将索引 servlet 用作欢迎页面,所以更改为:

<welcome-file-list>
   <welcome-file>index</welcome-file>
</welcome-file-list>

以便使用索引 servlet。请注意,您需要一个 servlet spec 2.4 容器才能执行此操作。

还要注意,@BalusC 得到我的投票,因为您的索引 servlet 本身是多余的。

【讨论】:

我有 servlet 3.1,但这仍然不适合我。但是像 @WebServlet("") 这样将 webServlet 注释设为空是有效的。这是什么原因?【参考方案3】:

我在*** link 中看到了一个很好的解决方案,它可以通过使用空字符串 URL 模式“”来帮助 defulat servlet 处理问题的读者:

@WebServlet("")

<servlet-mapping>
    <servlet-name>yourHomeServlet</servlet-name>
    <url-pattern></url-pattern> <!-- Yes, empty string! -->
</servlet-mapping>

【讨论】:

【参考方案4】:

这是我将 Servlet 设置为欢迎页面的方式。

我为谁担心。

web.xml

  <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>Demo</servlet-name>
        <servlet-class>servlet.Demo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Demo</servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>

Servlet 类

@WebServlet(name = "/demo")
public class Demo extends HttpServlet 
   public void doGet(HttpServletRequest req, HttpServletResponse res)
     throws ServletException, IOException  
       RequestDispatcher rd = req.getRequestDispatcher("index.jsp");
   

【讨论】:

如果您需要在加载时调用 servlet,这是正确的答案。特别是如果您的 jsp 位于无法直接访问的 WEB-INF 文件夹下。【参考方案5】:

我只是在 web.xml 文件中声明如下,它为我工作:

 <welcome-file-list>
    <welcome-file>/WEB-INF/jsps/index.jsp</welcome-file>
</welcome-file-list>

除了静态资源(css、js、图像)之外,公共目录中不存在任何 html/jsp 页面。 现在我可以使用以下 URL 访问我的索引页面: http://localhost:8080/app/ 它调用 /WEB-INF/jsps/index.jsp 页面。在生产中实时托管时,最终 URL 看起来像 https://eisdigital.com/

【讨论】:

【参考方案6】:

这取决于您尝试从哪个文件访问这些文件。

如果它位于您的工作项目文件所在的同一文件夹中,那么您可以只使用文件名。不需要路径。

如果它位于您的工作项目文件的同一父文件夹下的另一个文件夹中,那么您可以使用如下 /javascript/sample.js 中的位置

在您的示例中,如果您尝试从您的 html 文件访问您的 js 文件,您可以使用以下位置

../javascript/sample.js

前缀../会转到文件的父文件夹(文件夹向上的旅程)

【讨论】:

以上是关于如何在 web.xml 中配置欢迎文件列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用子文件夹作为 web.xml 欢迎目录

tomcat服务设置默认欢迎页

Tomcat配置列表显示

如何在 Jersey 容器中配置欢迎文件 (HTML/JSP)

如何在 Tomcat 的 web.xml 中为欢迎文件映射过滤器?

web.xml文件的作用及基本配置