Servlet3.0及以上如何重写@WebServlet映射

来源:互联网 发布:vegas软件哪里下载 编辑:程序博客网 时间:2024/05/16 13:51

@WebServlet简介

@WebServlet标注允许servlet映射声明在servlet代码,作用同通过映射部署描述符(web.xml)文件的servlet.

简单示例:

package com.test.z;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/HelloWorld")public class HelloWorld extends HttpServlet {     protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {          response.setContentType("text/html");          PrintWriter out = response.getWriter();          out.println("<html><body>");          out.println("<h1>Hello, World!</h1>");          out.println("</body></html>");          out.close();       }   }

类顶部的@WebServlet标注声明以com.test.z.HelloWorld为名的servlet URL映射路径为http://<server>:<port>/<application context>/HelloWorld。如果使用的是web.xml,那配置如下:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"     id="WebApp_ID" version="3.0">     <display-name>TestOverride</display-name>     <servlet>         <servlet-name>com.test.z.HelloWorld</servlet-name>         <servlet-class>com.test.z.HelloWorld</servlet-class>      </servlet>      <servlet-mapping>          <servlet-name>com.test.z.HelloWorld</servlet-name>          <url-pattern>/HelloWorld</url-pattern>       </servlet-mapping></web-app>

@WebServlet 属性

提供给@WebServlet标注使用的属性有valur属型,这个属性值为servlet提供URL映射,你可以显示使用下面的方式:

@WebServlet(value="/HelloWorld")

当你需要显式使用这个参数的时候通常是你要添加其他属性值给@WebServlet标注,以此可以给servlet提供几个不同的路径的映射,需要使用到urlPatterns属性,urlPatterns属性可以指定一个URL模式字符串数组映射servlet。如下:

@WebServlet(urlPatterns={"/HelloWorld", "/HiWorld","/ItsASmallWorld"})public class HelloWorld extends HttpServlet {

注:value和urlPatterns任意其中一个是使用@WebServlet标注必要属性,并且不能同时被使用,否则会抛出异常。

另一个可以提供给@WebServlet标注使用的属性是name属性,name属性是可选用的。默认地,@WebServlet会将servlet声明为合法的类全名。在上面的例子中,name属性值即是com.test.z.HelloWorld。如果希望重写默认名,可提供name属性值给@WebServlet标注。如下:

@WebServlet(name="HiWorld",urlPatterns={"/HelloWorld", "/HiWorld","/ItsASmallWorld"})public class HelloWorld extends HttpServlet {

默认名被重写,现在叫HiWorld。

web.xml 重写 @WebServlet

当在java代码使用@WebServlet映射servlet时,部署描述符文件(web.xml)也可以一起使用来映射servlet。事实上有许多要求在应用程序中使用web.xml。比如提供一个欢迎页列表,定义错误页,过滤器,这些只能在web.xml中完成。
当使用web.xml文件定义和映射servlet时,一般情况下就不用@WebServlet标注。然而,如果你代码中仍使用@WebServlet标注,当遇上web.xml与@WebServlet标注同名的servlet,由web.xml提供的映射会重写由@WebServlet标注定义的映射。刚才提到过servlet会默认使用类全名,如果@WebServlet标注没有提供另一个name属性。

仔细看下面的例子:
java 代码中:

@WebServlet(urlPatterns={"/HelloWorld", "/HiWorld","/ItsASmallWorld"})public class HelloWorld extends HttpServlet {

web.xml文件中:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"     id="WebApp_ID" version="3.0">     <display-name>TestOverride</display-name>     <servlet>         <servlet-name>hiworld</servlet-name>         <servlet-class>com.test.z.HelloWorld</servlet-class>      </servlet>      <servlet-mapping>          <servlet-name>hiworld</servlet-name>          <url-pattern>/HelloWorld</url-pattern>       </servlet-mapping></web-app>

在上面的例子中,类中servlet默认名是com.test.z.HelloWorld。但web.xml中servlet的名称和@WebServlet标注使用的默认名称不同,因此web.xml不重写WebServlet标注中的映射。相反,它补充了@WebServlet标注定义。换句话说,它定义了一个额外的servlet映射(这里是/HelloDifferentWorld)给在@WebServlet标注的定义的URL模式列表。因此,现在HelloWorld servlet 可以被下面的URL映射到。

http://<server>:<port>/TestOverride/HelloWorld ( @WebServlet) http://<server>:<port>/TestOverride/HiWorld (@WebServlet) http://<server>:<port>/TestOverride/ItsASmallWorld (@WebServlet)http://<server>:<port>/TestOverride/HelloDifferentWorld (web.xml)

如果@WebServlet标注和web.xml使用相同的servlet名称,web.xml中的映射会重写由@WebServlet标注中定义的URL映射。

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"     id="WebApp_ID" version="3.0">     <display-name>TestOverride</display-name>     <servlet>         <servlet-name>com.test.z.HelloWorld</servlet-name>         <servlet-class>com.test.z.HelloWorld</servlet-class>      </servlet>      <servlet-mapping>          <servlet-name>com.test.z.HelloWorld</servlet-name>          <url-pattern>/HelloWorld</url-pattern>       </servlet-mapping></web-app>

使用上面的web.xml,和@WebServlet标注隐式使用的servlet名称属性是相同的,此时只有一个url映射可以访问得到。
http://localhost:8080/TestOverride/HelloDifferentWorld (web.xml)
总结,有时同时配置web.xml和@WebServlet标注会造成混乱,最好的实践建议是只使用其中一个。当需要都使用时,要明确优先级和处于哪种环境下。

0 0
原创粉丝点击