Servlet使用注解配置URl提示404错误

Servlet使用注解配置URl提示404错误

之前配置Servlet作为URL的时候,都是在web.xml中配置的,配置方法大概如下:

如果我有这样一个Servlet的话:

Servlet使用注解配置URl提示404错误_第1张图片


hello.Java代码:

[java] view plain copy
  1. package test;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. public class hello extends HttpServlet {  
  12.   
  13.     @Override  
  14.     protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {  
  15.         // TODO Auto-generated method stub  
  16.         PrintWriter out = arg1.getWriter();  
  17.         out.print("Hello World!");  
  18.         out.close();  
  19.     }  
  20.       
  21. }  



可以在web.xml中这样配置:

[html] view plain copy
  1. <servlet>  
  2.         <servlet-name>helloservlet-name>  
  3.         <servlet-class>test.helloservlet-class>  
  4.     servlet>  
  5.     <servlet-mapping>  
  6.         <servlet-name>helloservlet-name>  
  7.         <url-pattern>/hellourl-pattern>  
  8.     servlet-mapping>  


运行这个Servlet:

Servlet使用注解配置URl提示404错误_第2张图片


但是如果这样的Servlet多的话,每个都需要配置会很麻烦。


然后今天学到了注解,Servlet3.0之后可以在Servlet中使用注解直接配置URL。

需要在Servlet中导入 import javax.servlet.annotation.WebServlet;

然后使用@WebServlet("/URlname")

就可以直接配置了,然后通过所输入的URL可以直接访问到。


使用注解配置刚才的Servlet代码如下:

Servlet使用注解配置URl提示404错误_第3张图片


这里需要将刚才在web.xml中配置的内容删除掉(后面会演示如果不删除的话会出现什么情况)。


但是这样直接运行的话,却提示404资源不存在。

Servlet使用注解配置URl提示404错误_第4张图片


解决的办法就是将web.xml中的metadate-complete=“true”,修改为false。Servlet使用注解配置URl提示404错误_第5张图片


修改false之后再次运行即可成功运行。

Servlet使用注解配置URl提示404错误_第6张图片



如果使用了注解之后,还要继续在web.xml中配置该Servlet的话,会出现如下情况:


web.xml中为该Servlet配置成helloweb。

Servlet使用注解配置URl提示404错误_第7张图片


Servlet中使用注解配置成hellozhujie。

Servlet使用注解配置URl提示404错误_第8张图片


但是运行之后显示的是helloweb:

Servlet使用注解配置URl提示404错误_第9张图片


很显然,当web.xml和注解同时存在的时候,使用的是web.xml中所配置的内容,而忽略了注解配置的内容。


为什么将metadate-complete设置为false,就可以运行了呢?

因为:

Servlet 3.0 的部署描述文件 web.xml 的顶层标签 有一个 metadata-complete 属性,该属性指定当前的部署描述文件是否是完全的。如果设置为 true,则容器在部署时将只依赖部署描述文件,忽略所有的注解(同时也会跳过 web-fragment.xml 的扫描,亦即禁用可插性支持,具体请看后文关于 可插性支持的讲解);如果不配置该属性,或者将其设置为 false,则表示启用注解支持(和可插性支持)。

复制于:Servlet3.0新特性详解


你可能感兴趣的:(Java)