Содержание
Продолжаем тему контроллера в Spring Framework. В этой части будет рассмотрено:
В Spring есть возможность указывать URI в Ant-подобном стиле. То есть метод вида:
@RequestMapping(value = "/antstyle/*/hi")
public String antStyle() {
return ANT_STYLE_VIEW_NAME;
}
будет обрабатывать и запрос /antstyle/a/hi, и /antstyle/b/hi, и /antstyle/abracadabra/hi, благодаря использованию символа '*'.
Как и при использовании выражения вида method = RequestMethod.GET, в Spring есть возможность распределять запросы, основываясь на заголовке запроса. Так, в следующем примере метод headersText будет "ловить" только те запросы, в которых присутствует заголовок Content-Type, значение которого начинается с text/. А метод headersJson будет "ловить" только запросы, в которых присутствует заголовок Content-Type, значение которого совпадает с application/json.
@RequestMapping(value = "/headers", headers="content-type=text/*")
public String headersText(Model model) {
model.addAttribute("contentType", "text/*");
return HEADERS_VIEW_NAME;
}
@RequestMapping(value = "/headers", headers="content-type=application/json")
public ResponseEntity<String> headersJson() {
String json = "{\"contentType\":\"application/json\"}";
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_JSON);
return new ResponseEntity<String>(json, responseHeaders, HttpStatus.CREATED);
}
Учтите, что браузеры не отсылают в запросе заголовок Content-Type и при попытке просмотреть страницу по указанному адресу Вы получите ошибку 415.
Чтобы просмотреть результат выполнения данных методов, воспользуйтесь, например, расширением Modify Headers для Firefox. С помощью этого расширения, добавьте к отсылаемым браузером заголовкам еще один - Content-Type.
Для обеспечения более легкого портирования проектов с других фреймворков, да и просто для поддержания "олдскульных" программистов, в контроллере есть возможность использования стандартных классов javax.servlet.http.HttpServletRequest и javax.servlet.http.HttpSession:
@RequestMapping(value = "/httpservletrequest")
public String httpServletRequest(HttpServletRequest request, Model model) {
model.addAttribute("content", "User-Agent: " + request.getHeader("User-Agent") );
return OTHER_VIEW_NAME;
}
@RequestMapping(value = "/httpsession")
public String httpSession(HttpSession session, Model model) {
model.addAttribute("content", "Session id: " + session.getId() );
return OTHER_VIEW_NAME;
}
Также Вы можете использовать, пожалуй, самый мощный инструмент для обработки запросов, а именно - org.springframework.web.context.request.WebRequest. В этом классе есть практически всё необходимое, начиная заголовками запроса и заканчивая локализацией, сессией и объектом Principal, содержащим информацию о пользователе. Пример использования:
@RequestMapping(value = "/webrequest")
public String webRequest(WebRequest webRequest, Model model) {
model.addAttribute("content", "Session id (WebRequest): " + webRequest.getSessionId() );
return OTHER_VIEW_NAME;
}
Получить локализацию пользователя очень легко - достаточно в методе контроллера добавить параметр Locale locale:
@RequestMapping(value = "/locale")
public String locale(Locale locale, Model model) {
model.addAttribute("content", "Locale language: " + locale.getLanguage() );
return OTHER_VIEW_NAME;
}
Как и в случае предыдущих примеров, для получения информации по аутинтефицированному пользователю достаточно добавить параметр principal в метод контроллера:
@RequestMapping(value = "/principal")
public String principal(Principal principal, Model model) {
model.addAttribute("content", "Principal: " + (principal == null ? "null" : principal.getName() ) );
return OTHER_VIEW_NAME;
}
Еще одной очень полезной и часто применимой возможностью Spring MVC является возможность получения переменных запроса, используя аннотацию, похожую на @PathVariable, которую мы рассматривали ранее. Рассмотрим пример:
@RequestMapping(value = "/requestparam")
public String requestParam(@RequestParam("foo") int foo, Model model) {
model.addAttribute("content", "foo=" + foo );
return OTHER_VIEW_NAME;
}
Как и в случае аннотации @PathVariable, аннотация @RequestParam транслирует значение параметра запроса в переменную. Также как и в случае с аннотацией @PathVariable, нет необходимости заботится о типе - Spring приведет переменную к нужному типу.
Если параметр запроса не является обязательным, воспользуйтесь свойством required аннотации @RequestParam:
@RequestParam(value="foo", required=false) int foo
Подобно аннотации @RequestParam, можно получать заголовок запроса прямо в параметре метода контроллера:
@RequestMapping(value = "/requestheader")
public String requestHeader(@RequestHeader("User-Agent") String userAgent, Model model) {
model.addAttribute("content", "User-Agent: " + userAgent );
return OTHER_VIEW_NAME;
}
Последняя аннотация, которую рассмотрим в этой статье, называется @ResponseBody. Этой аннотацией мы отдает ответ непосредственно браузеру, минуя слой представлений. То есть, то, что отдаем в методе, то и получит браузер. Например:
@RequestMapping(value = "/responsebody")
@ResponseBody
public String responseBody() {
return "Hello World";
}
Скачать пример использования всех методов, которые упоминались в первой и второй частях статьи Вы можете по следующей ссылке - Скачать spring-controller.zip
< | Spring 3 и @Controller. Часть 1 | Spring 3 и @Controller. Часть 3 (@CookieValue и @RequestHeader) | > |