Spring 3 и @Controller. Часть 2

апреля
23
2012
Метки: controller java spring

Содержание

Продолжаем тему контроллера в Spring Framework. В этой части будет рассмотрено:

URI в стиле Ant

В 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.

Стандартные классы HttpServletRequest и HttpSession в контроллере

Для обеспечения более легкого портирования проектов с других фреймворков, да и просто для поддержания "олдскульных" программистов, в контроллере есть возможность использования стандартных классов 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;
}

WebRequest в контроллере

Также Вы можете использовать, пожалуй, самый мощный инструмент для обработки запросов, а именно - 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;
}

Локаль (Local) пользователя в Spring MVC

Получить локализацию пользователя очень легко - достаточно в методе контроллера добавить параметр Locale locale:


@RequestMapping(value = "/locale")
public String locale(Locale locale, Model model) {
	model.addAttribute("content", "Locale language: " + locale.getLanguage() );
	return OTHER_VIEW_NAME;
}

Пользователь (Principal) в Spring MVC

Как и в случае предыдущих примеров, для получения информации по аутинтефицированному пользователю достаточно добавить параметр principal в метод контроллера:


@RequestMapping(value = "/principal")
public String principal(Principal principal, Model model) {
	model.addAttribute("content", "Principal: " + (principal == null ? "null" : principal.getName() ) );
	return OTHER_VIEW_NAME;
}

Обработка дополнительных параметров запроса и @RequestParam

Еще одной очень полезной и часто применимой возможностью 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

Обработка заголовков запроса и @RequestHeader

Подобно аннотации @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

Последняя аннотация, которую рассмотрим в этой статье, называется @ResponseBody. Этой аннотацией мы отдает ответ непосредственно браузеру, минуя слой представлений. То есть, то, что отдаем в методе, то и получит браузер. Например:


@RequestMapping(value = "/responsebody")
@ResponseBody
public String responseBody()  {
  return "Hello World";
}

Скачать пример использования всех методов, которые упоминались в первой и второй частях статьи Вы можете по следующей ссылке - Скачать spring-controller.zip

< Spring 3 и @Controller. Часть 1 Spring 3 и @Controller. Часть 3 (@CookieValue и @RequestHeader) >

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии