В предыдущих статьях при определении сервлетов применялась аннотация @WebServlet, которая устанавливала конечную точку, с которой сопоставлялся сервлет. Например, следующий сервлет
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
сопоставляется с путем "/hello". То есть сервлет HelloServlet будет обрабатывать запросы типа "http://localhost:8081/[название_приложения]/hello" или "http://somesite.com/[название_приложения]/hello".
Но есть и другой способ сопоставления путей и сервлетов. Он представляет использование файла web.xml.
Файл web.xml хранит информацию о конфигурации приложения. Он не является обязательной частью приложения, как можно увидеть из предыдущих статей, тем не менее он широко используется для настройки конфигурации.
Данный файл должен располагаться в папке WEB-INF приложения. При запуске Tomcat считывает его содержимое и использует считанную конфигурацию. Если же файл содержит ошибки, то Tomcat отображает ошибку.
web.xml имеет определенную структуру. Все вложенные узлы, которые определяют конфигурацию, помещаются в корневой узел <web-app>.
<?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_4_0.xsd"
version="4.0">
</web-app>
У элемента web-app определяется ряд атрибутов. В данном случае атрибуты xmlns и xmlns:xsi указывают на используемые пространства имен xml. Атрибут version указывает на версию спецификации сервлетов или Servlet API, которая используется в приложении. Последняя версия API сервлетов - 4-я версия.
С помощью элемента <servlet-mapping> можно задать сопоставление сервлета с запрашиваемым URL.
Например, добавим в проект в Eclipse в папку WebConent/WEB-INF новый файл 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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
</web-app>
Прежде всего вначале с помощью элемента <servlet> определяется сервлет. Элемент <servlet-name> задает имя сервлета, на которое будет проецироватья класс, указанный в элементе <servlet-class>. То есть, допустим, у нас проекте есть класс сервлета HelloServlet, который будет проецироваться на имя HelloWorld. Имя может быть произвольным и может совпадать с названием класса.
Затем в элементе <servlet-mapping> сервлет с именем HelloWorld (по сути сервлет HelloServlet) сопоставляется с путем "/welcome".
Допустим, сервлет HelloServlet будет выглядеть следующим образом:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
try {
writer.println("<h2>Welcome to servlets</h2>");
} finally {
writer.close();
}
}
}
Теперь, чтобы обратиться к этому сервлету, надо использовать путь "/welcome":