@WebServlet annotation web.xml welcome-file

kon*_*nze 7 java jsp web.xml servlets deployment-descriptor

我想设置我的JSP/JavaBeans项目的welcome-file.我有一个名为'Controller.java'的servlet,带有以下@WebServlet注释:

@WebServlet(name="Controller", urlPatterns={"/login", "/show_dbs"})
Run Code Online (Sandbox Code Playgroud)

我有一个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>
Run Code Online (Sandbox Code Playgroud)

几乎所有的事情进展顺利,我可以打开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下.

我希望你有一个小费.

inf*_*k01 8

在欢迎文件列表中,您必须指定URI.但是您已指定了servlet名称.

引用Java™Servlet规范3.0版(强调我的):

10.10欢迎文件

Web应用程序开发人员可以在Web应用程序部署描述符中定义名为welcome文件的部分URI有序列表.Web应用程序部署描述符模式中描述了列表的部署描述符语法.

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

该设施的使用由以下常见的例子明确:的欢迎文件'index.html'可以被定义,这样的URL请求等 host:port/webapp/directory/,其中'directory'在未映射到一个servlet或JSP页面的WAR的条目,则返回对客户来说'host:port/webapp/directory/index.html'.

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

如果没有以所述方式找到匹配的欢迎文件,则容器可以以其认为合适的方式处理该请求.对于某些配置,这可能意味着返回目录列表或返回404响应的其他人.


PS

另请参阅第10.10章中的规范中的示例


kon*_*nze 8

谢谢您的帮助.这是我的解决方案:

如果要将servlet设置为欢迎文件,则必须执行以下操作:

在web.xml中将标准html定义为welcome-文件,例如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>
Run Code Online (Sandbox Code Playgroud)

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

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

@WebServlet(name="Controller", urlPatterns={"/index.html", "/login", "/show_dbs"})
Run Code Online (Sandbox Code Playgroud)

现在,每个对http://.../PROJECT/(root)的请求都将被重定向到http://.../PROJECT/index.html,这将调用servlet.