30
Spring MVC Scott

spring mvc

Embed Size (px)

Citation preview

Page 1: spring mvc

Spring MVC

Scott

Page 2: spring mvc

目錄

• Spring MVC Structure• Mapping Requests With

@RequestMapping• Defining @RequestMapping handler

methods• Handling exceptions

Page 3: spring mvc

Spring MVC Structure

1. RequestDispatcherServlet

HandlerMapping

2.

HandlerAdapterModelAndView

3.

4.

Handler

5.

ViewResolver

View(JSP/XML/PDF…)

Model

6.7.

8.

Page 4: spring mvc

package com.gorilla.netstream.user.controller;…

@Controller@RequestMapping("/Accounts")public class UserManagerController {

@RequestMapping(value="/Management")public String manager() {

return "user/accountManagement";}

}

使UserManagerController成為Handler

指定Controller映射的URL

指定Method映射的URL

返回的View名稱

Page 5: spring mvc

1. RequestDispatcherServlet

HandlerMapping

2.

HandlerAdapterModelAndView“user/accountManagement”

3.

4.

UserManagerController

5.

ViewResolver

accountManagement.jsp

Model

6.7.

8.

Page 6: spring mvc

Mapping Requests With @RequestMapping

package com.gorilla.netstream.user.controller;…

@Controller@RequestMapping("/Accounts")public class UserManagerController {

@RequestMapping(value="/Management")public String manager() {

return "user/accountManagement";}

}http://127.0.0.1:8080/NetStream/Accounts/Management

Page 7: spring mvc

@RequestMapping:用來處理網址請求映射的annotations

有六個屬性• value:指定請求的URL• method:指定請求時的method類型• params:指定request中必須包含的參數• headers:指定header中必須包含特定header值• consumes:指定content-type類型• produces:指定回傳內容類型,當request

header中accept有含才回傳

Page 8: spring mvc

在URI中綁定path variable

@RequestMapping(value={"/accounts/{id}", "/accounts/{id}.json"}, method=RequestMethod.GET)public ResponseEntity<Result<User>> loadUser(@PathVariable(value="id") Long id, Locale locale, HttpSession session) {

User user = userService.retrieveBy(id);…return new ResponseEntity<Result<User>>(result, HttpStatus.OK);

}

Page 9: spring mvc

在URI中使用Regular Expressions

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}")public void handle(@PathVariable String version, @PathVariable String extension) {

...}

Page 10: spring mvc

HTTP Request Method的意義

• GET:取得資源。• POST:建立新資源。• PUT:更新資源。• DELETE:刪除資源。

Page 11: spring mvc

請求新增Account

@RequestMapping(value={"/accounts", "/accounts.json"}, method=RequestMethod.POST)public ResponseEntity<Result<User>> create(@RequestBodyAccountForm form, Locale locale,

HttpSession session) {...return new ResponseEntity<Result<User>>(result,

HttpStatus.OK);}

Page 12: spring mvc

請求刪除Account

@RequestMapping(value={"/accounts/{id}", "/accounts/{id}.json"}, method=RequestMethod.DELETE)public ResponseEntity<Result> delete(@PathVariable("id") Long id, Locale locale,

HttpSession session) {...return new ResponseEntity<Result>(result,

HttpStatus.OK);}

Page 13: spring mvc

Request Parameter限定

@RequestMapping(value={"/accounts", "/accounts.json"}, method=RequestMethod.GET, params={"q", "p", "s"})public ResponseEntity<Result<Page<User>>> loadPage(

@RequestParam("q") String keyword, @RequestParam("p") Integer pageNo, @RequestParam("s") Integer pageSize, Locale locale, HttpSession session) {

...return new ResponseEntity<Result<Page<User>>>(result,

HttpStatus.OK);}

Page 14: spring mvc

Request Header限定

@RequestMapping(value="/account", method=RequestMethod.GET, headers="Referer=http://www.gorilla-technology.com/")public void handle(Model model) {

...}

Page 15: spring mvc

Rule In Request Header Or Parameter

• params={"q", "p", "s"}• params={"!q", "p", "s"}• params={"q!=xyz", "p", "s"}• params={"q=xyz", "p", "s"}

Page 16: spring mvc

Defining @RequestMappinghandler methods

Supported method argument type• Request or response objects. Ex: HttpServletRequest• Session object. Ex: HttpSession• org.springframework.web.context.request.WebRequest or

org.springframework.web.context.request.NativeWebRequest• java.util.Locale• java.io.InputStream or java.io.Reader• java.io.OutputStream or java.io.Writer• java.security.Principal• @PathVariable• @MatrixVariable• @RequestParam• @RequestHeader• @RequestBody• @RequestPart• HttpEntity<?>• java.util.Map, org.springframework.ui.Model or org.springframework.ui.ModelMap• org.springframework.validation.Errors or

org.springframework.validation.BindingResult• …

Page 17: spring mvc

@RequestMapping(value={"/accounts", "/accounts.json"}, method=RequestMethod.GET, params={"q", "p", "s"})public ResponseEntity<Result<Page<User>>> loadPage(

@RequestParam("q") String keyword, @RequestParam("p") Integer pageNo, @RequestParam("s") Integer pageSize, Locale locale, HttpSession session) {

...return new

ResponseEntity<Result<Page<User>>>(result, HttpStatus.OK);}

Page 18: spring mvc

Supported method return types

• A ModelAndView object.• A Model object.• A Map object.• A View object.• A String value.• If the method is annotated with

@ResponseBody, the return type is written to the response HTTP body.

• A HttpEntity<?> or ResponseEntity<?> object.• …

Page 19: spring mvc

@RequestMapping(value={"/accounts", "/accounts.json"}, method=RequestMethod.GET, params={"q", "p", "s"})public ResponseEntity<Result<Page<User>>> loadPage(

@RequestParam("q") String keyword, @RequestParam("p") Integer pageNo, @RequestParam("s") Integer pageSize, Locale locale, HttpSession session) {

...return new

ResponseEntity<Result<Page<User>>>(result, HttpStatus.OK);}

Page 20: spring mvc

Binding request parameters to method parameters with @RequestParam

@RequestMapping(method=RequestMethod.GET)public String handle1(@RequestParam(value="aid", required=false) intaccountId, ModelMap model) {

Account account = service.loadAccount(accountId);model.addAttribute("account", account);return "accountForm";

}

Page 21: spring mvc

Mapping the request body with the @RequestBody annotation

@RequestMapping(value="/something", method=RequestMethod.PUT)public void handle2(@RequestBody String body, Writer writer) throws IOException {

writer.write(body);}

Page 22: spring mvc

Mapping the response body with the @ResponseBody annotation

@RequestMapping(value="/something", method=RequestMethod.PUT)@ResponseBodypublic String handle3() {

return "Hello World";}

Page 23: spring mvc

Using HttpEntity<?> or ResponseEntity<?>

@RequestMapping("/something")public ResponseEntity<String> handle4(HttpEntity<byte[]> requestEntity) throwsUnsupportedEncodingException {

String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader"));

byte[] requestBody = requestEntity.getBody();// do something with request header and bodyHttpHeaders responseHeaders = new HttpHeaders();responseHeaders.set("MyResponseHeader", "MyValue");return new ResponseEntity<String>("Hello World",

responseHeaders, HttpStatus.CREATED);}

Page 24: spring mvc

Using @ModelAttribute on a method

@ModelAttribute(“account")public Account handle5(@RequestParam String number) {

return accountService.findAccount(number);}

Page 25: spring mvc

Using @ModelAttribute on a method argument

@RequestMapping(value="/accounts/{aid}", method=RequestMethod.PUT)public String handle6(@ModelAttribute Account account) {

...}

Page 26: spring mvc

Mapping cookie values with the @CookieValue annotation

@RequestMapping("/something")public void handle7(@CookieValue("JSESSIONID") String cookie) {

...}

Page 27: spring mvc

Mapping request header attributes with the @RequestHeader annotation

@RequestMapping("/something")public void handle8(@RequestHeader("Accept-Encoding") String encoding, @RequestHeader("Keep-Alive") long keepAlive) {

...}

Page 28: spring mvc

Handling exceptionspublic class AbstractAjaxController {

@Resourceprivate MessageSource messageSource;

@ExceptionHandler(Throwable.class)public ResponseEntity<Result> handleException(Exception exception, Locale locale) {

Result result = new Result(HttpStatus.NOT_FOUND);ErrorResult error = new ErrorResult(Code.UNKNOWN_EXCEPTION,

messageSource.getMessage(Code.UNKNOWN_EXCEPTION.i18nKey(), null, locale));

result.addErrors(error);

return new ResponseEntity<Result>(result, HttpStatus.NOT_FOUND);}

@ExceptionHandler(CoreException.class)public ResponseEntity<Result> handleCoreException(CoreException ce, Locale locale) {

String errorMessage = messageSource.getMessage(ce.getCode().i18nKey(), ce.getParams(), locale);

Result result = new Result(HttpStatus.NOT_FOUND);ErrorResult error = new ErrorResult(ce.getField(), ce.getCode(), errorMessage);result.addErrors(error);

return new ResponseEntity<Result>(result, HttpStatus.NOT_FOUND);}

}

Page 29: spring mvc

使用@ControllerAdvice捕捉全域的Exception

@ControllerAdvicepublic class AbstractAjaxController {

…}

Page 30: spring mvc

Q & A