1. Введение
Spring MVC — это традиционное приложение, созданное с использованием шаблона Front Controller. DispatcherServlet ,
выступающий в роли переднего контроллера, отвечает за маршрутизацию и обработку запросов.
Как и в случае любого веб-приложения или веб-сайта, Spring MVC возвращает код ответа HTTP 404, когда запрошенный ресурс не может быть найден. В этом руководстве мы рассмотрим распространенные причины ошибок 404 в Spring MVC .
2. Возможные причины ответа 404
2.1. Неверный URI
Допустим, у нас есть GreetingController
, который сопоставляется с /greeting
и отображает Greeting.jsp
:
@Controller
public class GreetingController {
@RequestMapping(value = "/greeting", method = RequestMethod.GET)
public String get(ModelMap model) {
model.addAttribute("message", "Hello, World!");
return "greeting";
}
}
Соответствующее представление отображает значение переменной сообщения :
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Greeting</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
Как и ожидалось, GET-запрос к /greeting
работает:
curl http://localhost:8080/greeting
Мы увидим HTML-страницу с сообщением «Hello World»:
<html>
<head>
<title>Greeting</title>
</head>
<body>
<h2>Hello, World!</h2>
</body>
</html>
Одной из наиболее распространенных причин появления ошибки 404 является использование неправильного URI. Например, было бы неправильно делать запрос GET к /greetings
вместо /greeting
:
curl http://localhost:8080/greetings
В таком случае мы увидим предупреждающее сообщение в журналах сервера:
[http-nio-8080-exec-6] WARN o.s.web.servlet.PageNotFound -
No mapping found for HTTP request with URI [/greetings] in DispatcherServlet with name 'mvc'
И клиент увидит страницу с ошибкой:
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>Http Error Code : 404. Resource not found</h1>
</body>
</html>
Чтобы этого избежать, нам нужно убедиться, что мы ввели правильный URI.
2.2. Неправильное отображение сервлета
Как объяснялось ранее, DispatcherServlet
является передним контроллером в Spring MVC. Следовательно, как и в стандартном приложении на основе сервлета, нам необходимо создать сопоставление для сервлета с помощью файла web.xml
.
Мы определяем сервлет внутри тега сервлета
и сопоставляем его с URI внутри тега отображения сервлета
. Нам нужно убедиться, что значение url-pattern
верное, потому что довольно часто можно увидеть предложения, где сервлет отображается на «/*» — обратите внимание на звездочку в конце :
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<!-- Additional config omitted -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- Additional config omitted -->
</web-app>
Теперь, если мы запросим /greeting
, мы увидим предупреждение в журналах сервера:
curl http://localhost:8080/greeting
WARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI
[/WEB-INF/view/greeting.jsp] in DispatcherServlet with name 'mvc'
На этот раз ошибка гласит, что Greeting.jsp
не найден, и пользователь видит пустую страницу.
Чтобы исправить ошибку, нам нужно вместо этого сопоставить DispatcherServlet
с «/» (без завершающей звездочки):
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
После исправления маппинга все должно работать корректно. При запросе /greeting
теперь отображается сообщение «Hello, World!»:
curl http://localhost:8080/greeting
<html>
<head>
<title>Greeting</title>
</head>
<body>
<h2>Hello, World!</h2>
</body>
</html>
Причина проблемы заключается в том, что если мы сопоставляем DispatcherServlet
с /* , то мы сообщаем приложению, что каждый отдельный запрос, поступающий в наше приложение, должен обслуживаться DispatcherServlet
. Однако это неправильный подход, поскольку DispatcherServlet
не может этого сделать. Вместо этого Spring MVC ожидает, что реализация ViewResolver
будет обслуживать такие представления, как файлы JSP.
3. Заключение
В этой быстрой статье мы объяснили, как отлаживать ошибки 404 в Spring MVC. Мы рассмотрели две наиболее распространенные причины получения ответа 404 от нашего приложения Spring. Во-первых, при выполнении запроса использовался неверный URI. Вторым было сопоставление DispatcherServlet
с неправильным шаблоном URL-адреса
в web.xml
.
Как всегда, полную реализацию этого туториала можно найти на Github .