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

41

我在我的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>

我的servlet用于jsp页面

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页面存在吗? - Hussain Akhtar Wahid 'Ghouri'
例如,我在Tomcat管理器中点击了我的Web应用程序。它将首先显示URL http://localhost:8080/myProj/。因此,我仍然需要在该URL之后键入索引才能打开我的欢迎页面。这有什么问题吗? - PeterJohn
1
您的欢迎文件是[上下文根]/index.jsp。欢迎页面不会调用servlet。 - DwB
@BalusC已经给出了完整的答案,只需按照它的步骤操作即可。 - Hussain Akhtar Wahid 'Ghouri'
6个回答

62

你需要将 JSP 文件放在 /index.jsp 中,而不是 /WEB-INF/jsp/index.jsp 中。这样的话,整个 servlet 其实就变得多余了。

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

如果您确信需要以这种奇怪的方式调用servlet,那么您应该将其映射到/index.jsp URL模式而不是/index。您只需要更改它,从 request 获取请求分派程序,而不是从 config 并且删除整个 init() 方法。

如果您实际上想要一个“主页servlet”(而不是欢迎文件 - 具有完全不同的目的; 即当请求一个文件夹时应提供的默认文件,因此不特定于根文件夹),则应将servlet映射到空字符串URL模式。

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

另请参见 Servlet映射URL模式中/和/*的区别


6
你需要将其放在根目录下,与 /WEB-INF 文件夹处于同一层级,而不是在根目录下的 /index.jsp。你可以在 /WEB-INF/jsp/index.jsp 文件夹中找到它。 - BalusC
2
我尝试过更改,但问题仍然存在。资源不可用。 - PeterJohn
7
清理、重建、重新部署、重启。 - BalusC
谢谢您的回复,这张图片是正确的 :) - BERGUIGA Mohamed Amine

24

我猜你想让你的索引servlet作为欢迎页面,那么就改成:

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

为了使用索引servlet。请注意,您需要一个Servlet规范2.4容器才能这样做。

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


我有servlet 3.1,但这对我仍然无效。但是将webServlet注释为空,像这样@WebServlet("")就可以了。这是什么原因? - Bu Saeed

4

我在这个stackoverflow链接上看到了一个不错的解决方案,通过使用空字符串URL模式"",可以帮助解决默认servlet处理问题的读者:

@WebServlet("")

或者

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

1
这是我设置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 class

@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文件夹下,无法直接访问。 - tim.newport

0

我只是在 web.xml 文件中声明以下内容,它对我有效:

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

公共目录中没有HTML/JSP页面,除了静态资源(CSS、JS、图像)。 现在我可以通过以下URL访问我的主页: http://localhost:8080/app/ 它调用/WEB-INF/jsps/index.jsp页面。当在生产环境中托管时,最终的URL看起来像https://eisdigital.com/


-2

这取决于您要访问哪个文件。

如果它在与您的工作项目文件相同的文件夹中,那么您只需要使用文件名,无需路径。

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

例如,如果您要从html文件访问js文件,则可以使用以下位置:

../javascript/sample.js

前缀../将进入文件的父文件夹(向上移动文件夹)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接