【问题标题】:How to configure welcome file list in web.xml如何在 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 已经给出了完整的答案,请关注它

标签: jsp servlets web.xml welcome-file


【解决方案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】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-01
        相关资源
        最近更新 更多