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) >

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі