Servlet注释示例
这个例子演示了如何使用注释来配置servlet。
在前面的教程中,我们使用了部署描述符(web.xml文件文件)来配置我们的servlet。从Servlet3.0开始,我们可以使用@WebServlet注释。此注释允许我们为servlet设置多个属性,如名称、URL等。
注释与部署描述符
有什么区别?显然,部署描述符是一个单独的文件,我们可以其中以XML格式设置配置值,其中注释直接嵌入到源代码中。如果我们希望将代码和配置放在同一位置以提高可读性,请使用注释。部署描述符恰恰相反——你把代码和配置分开。这样,如果要更改单个配置值,则不需要重新编译整个项目。
对于许多Java企业组件来说,这两个版本都是可用的—注解或者描述符。但是,其他配置只能使用注释或者通过部署描述符进行配置。对于servlet,我们可以选择其中一种方法。
WebServlet注解属性
我们可以从中选择几个属性来配置servlet
必输项
值或者 urlPatterns
String[]
–指定servlet的一个或者多个URL模式。属性不能同时使用。urlPatterns的默认值是{},值的默认值是“”
可选项
异步支持
boolean
–声明servlet是否支持异步操作模式。默认值为false
姓名
String
–servlet的名称。默认值为“”
说明
String
–servlet的描述。默认值为“”
显示名称
String
–servlet的显示名称。默认值为“”
初始参数
WebInitParam[]
–servlet的init参数。默认值是{}
大力神
String
–servlet的大图标。默认值为“”
小图标
String
–servlet的小图标。默认值为“”
loadOnStartupint——启动时加载的servlet顺序,默认值为-1
servlet的Maven POM文件
我们将使用以下内容pom.xml文件文件来构建本教程后面所示的示例
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.theitroad.tutorials</groupId> <artifactId>ServletAnnotation</artifactId> <version>1</version> <packaging>war</packaging> <name>ServletAnnotation</name> <url>https://theitroad.local</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>servletannotation</finalName> <sourceDirectory>src/main/java</sourceDirectory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <warSourceDirectory>src/main/webapp</warSourceDirectory> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
我们需要吗web.xml文件当我们使用注释时?
简短回答-不!你完全可以放弃web.xml文件如果我们选择依赖所有Servlet配置的注释,则返回文件。但我仍然鼓励我们保留该文件,或者至少有一个类似于下面示例所示的文件。Web.xml文件用于许多其他配置,因此我们迟早会在项目中需要它
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Servlet with Annotations Application</display-name> </web-app>
如果你想跳过web.xml文件你完全需要告诉Maven的war插件pom.xml文件停止寻找那个文件。我们可以这样设置 failOnMissingWebXml为false:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin>
用一个URL模式注释的Servlet
下面的示例只使用一个属性来注释servlet的URL。假设我们正在本地主机上运行应用程序,并且我们将应用程序部署为服务注释.war,servlet的路径将是http://localhost:8080/servletannotation/你好
package net.theitroad.tutorials; import java.io.IOException; 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("/hello") public class ServletWithAnnotations extends HttpServlet { private static final long serialVersionUID = -3462096228274971485L; @Override protected void doGet(HttpServletRequest reqest, HttpServletResponse response) throws ServletException, IOException { response.getWriter().println("Hello World!"); } }
多属性Servlet注解
在本例中,我们将设置servlet名称、URL和load-0n-startup加载优先级。在我们的简单Servlet示例中,我们在web.xml文件像这样的文件:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Servlet with Annotations Application</display-name> <servlet> <servlet-name>simpleServlet</servlet-name> <servlet-class>net.theitroad.tutorials.ServletWithAnnotations</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>simpleServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
…现在我们将使用WebServlet注释来实现相同的配置:
package net.theitroad.tutorials; import java.io.IOException; 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(name = "simpleServlet", urlPatterns = { "/hello" }, loadOnStartup = 1) public class ServletWithAnnotations extends HttpServlet { private static final long serialVersionUID = -3462096228274971485L; @Override protected void doGet(HttpServletRequest reqest, HttpServletResponse response) throws ServletException, IOException { response.getWriter().println("Hello World!"); } }
具有多个url模式的Servlet注释
urlPatterns属性接受数组作为值,因此可以设置多个指向同一servlet的url:
@WebServlet(urlPatterns = {"/hello", "/wellcome"}) public class ServletWithAnnotations extends HttpServlet { @Override protected void doGet(HttpServletRequest reqest, HttpServletResponse response) throws ServletException, IOException { //... implementation goes here } }
假设我们正在本地主机上运行应用程序,并且我们将应用程序部署为服务注释.war,我们可以访问http://localhost:8080/servletannotation/hello以及http://localhost:8080/servletannotation/wellcome