39

我的 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 ...如何正确执行此操作?

4

6 回答 6

61

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

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

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

如果您实际上打算拥有一个“主页 servlet”(因此不是欢迎文件 - 它具有完全不同的目的;即在请求文件夹时应该提供的默认文件,因此不是特别是根文件夹),那么您应该将 servlet 映射到空字符串 URL 模式。

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

另请参阅servlet 映射 url 模式中 / 和 /* 之间的区别

于 2013-02-01T14:15:20.923 回答
24

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

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

这样索引 servlet 就会被使用。请注意,您需要一个 servlet 规范 2.4 容器才能执行此操作。

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

于 2013-02-01T14:22:02.433 回答
4

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

@WebServlet("")

或者

<servlet-mapping>
    <servlet-name>yourHomeServlet</servlet-name>
    <url-pattern></url-pattern> <!-- Yes, empty string! -->
</servlet-mapping>
于 2016-10-11T08:46:38.493 回答
2

这是我将 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>

小服务程序类

@WebServlet(name = "/demo")
public class Demo extends HttpServlet {
   public void doGet(HttpServletRequest req, HttpServletResponse res)
     throws ServletException, IOException  {
       RequestDispatcher rd = req.getRequestDispatcher("index.jsp");
   }
}
于 2019-07-30T15:14:52.600 回答
0

我只是在 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/

于 2019-10-01T19:01:34.603 回答
-2

它基于您尝试从哪个文件访问这些文件。

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

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

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

../javascript/sample.js

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

于 2015-10-06T09:30:02.710 回答