Servlet注释示例

时间:2020-02-23 14:34:40  来源:igfitidea点击:

这个例子演示了如何使用注释来配置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