@WebServlet注解web.xml欢迎文件

8

我希望设置我的JSP/JavaBeans项目的欢迎文件。我有一个名为'Controller.java'的servlet,具有以下@WebServlet注释:

@WebServlet(name="Controller", urlPatterns={"/login", "/show_dbs"})

我有一个名为web.xml的文件,其内容如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

    <welcome-file-list>
        <welcome-file>Controller</welcome-file>
    </welcome-file-list>
</web-app>

几乎所有的事情都进行得很顺利,我可以打开 http://localhost:8080/PROJECT/loginhttp://localhost:8080/PROJECT/show_dbs ,并进入 Controller.java。但是当我打开 http://localhost:8080/PROJECT/ 时,出现了404错误。我正在使用带有“动态Web项目”的Eclipse,Controller.java文件位于 /src(默认包)下,web.xml文件位于 /WebContent/WEB-INF下。希望你能给我一些提示。

我可能错了,但我认为您不能将Java类放入欢迎文件列表中。请创建一个名为index.jsp的JSP文件并使用它代替。在web.xml文件中添加<welcome-file>index.jsp</welcome-file>。这样,当您访问http://localhost:8080/PROJECT/时,应该会被重定向到index.jsp。 - Susie
谢谢您的回答。但必须是“Controller.java”,因为它根据会话处理请求。 - konze
请查看此链接:https://dev59.com/02Yr5IYBdhLWcg3wuMb9#27165502 - phuong
5个回答

9
感谢您的帮助。这是我的解决方案:
如果想将servlet设置为欢迎文件,您需要执行以下操作:
在web.xml中定义一个标准的html文件作为欢迎文件,例如index.html:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

请确保该文件(index.html)不存在

在@WebServlet中定义您的urlPatterns,如下所示:

@WebServlet(name="Controller", urlPatterns={"/index.html", "/login", "/show_dbs"})

现在,对于根目录http://.../PROJECT/的每个请求都将被重定向到http://.../PROJECT/index.html并调用servlet。

顺便提一下,使用servlet时,您使用url-pattern定义的是servlet的逻辑/虚拟路径。再次强调,这不是指向servlet类物理位置的真实路径,而是一个逻辑路径 - 您可以根据需要随意设置。因此,它可以是任何您喜欢的东西。我的意思是,不一定是index.html,它可以是/indexfoofoo.bar或其他任何东西。附言:恭喜,现在您已经有足够的积分来点赞)) - informatik01

8
在欢迎文件列表中,您必须指定URI。但是您已经指定了servlet的名称。
引用自Java™ Servlet Specification version 3.0(重点是我的)。

10.10 欢迎文件

Web应用程序开发人员可以在Web应用程序部署描述符中定义一个有序的部分URI列表,称为欢迎文件。该列表的部署描述符语法在Web应用程序部署描述符模式中进行了描述。

此机制的目的是允许部署者指定一个有序的部分URI列表,供容器在请求与WAR中未映射到Web组件的目录条目对应的URI时附加使用。这种请求称为有效的部分请求。

以下是这种机制的常见示例:可以定义一个名为'index.html'的欢迎文件,以便对URL的请求如host:port/webapp/directory/,其中'directory'是未映射到Servlet或JSP页的WAR中的条目, 将返回给客户端作为'host:port/webapp/directory/index.html'。

如果Web容器收到有效的部分请求,则必须检查部署描述符中定义的欢迎文件列表。欢迎文件列表是无前导或尾随斜杠的有序部分URL列表。Web服务器必须按照部署描述符中指定的顺序附加每个欢迎文件到部分请求中,并检查是否在WAR中将静态资源映射到该请求URI。如果没有找到匹配项,则Web服务器必须再次将部署描述符中指定顺序的每个欢迎文件附加到部分请求中,并检查是否将Servlet映射到该请求URI。容器必须将请求发送到与之匹配的WAR中的第一个资源。容器可以使用转发、重定向或与直接请求无法区分的容器特定机制将请求发送到欢迎资源。

如果在所述方式中找不到匹配的欢迎文件,则容器可以以它认为适当的方式处理请求。对于某些配置,这可能意味着返回目录列表,对于其他配置,则返回404响应。


P.S.

另外请参考规范中第10.10章节中的示例。


2
这是您的web.xml应该有的内容。创建一个index.jsp文件,并将其作为欢迎文件。控制器类就是您的servlet。因此,请在您的web.xml中定义一个servlet,如下所示。这样应该会导致所有请求都被重定向到Controller类。您仍然可以访问localhost:8080/PROJECT/,这种情况下它会被重定向到您的欢迎文件。
如果您不想创建index.jsp,则可以使用您现有的jsp文件,例如您的login.jsp文件作为欢迎文件。在这种情况下,只需将index.jsp替换为login.jsp即可。
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <servlet>   
        <servlet-name>Controller</servlet-name>
        <servlet-class>com.company.Controller</servlet-class>   
    </servlet>
    <servlet-mapping>
        <servlet-name>Controller</servlet-name>
        <url-pattern>*</url-pattern>
    </servlet-mapping>  
</web-app>

1
默认的欢迎文件是 index.html,因此只需添加URL模式即可。
@WebServlet(name="Controller", urlPatterns={"/index.html","/login", "/show_dbs"})

1

您可以在@WebServlet注释的urlPatterns中指定"/Controller"的URL。我认为这将起作用。


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