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

