Upload
scott-su
View
623
Download
4
Embed Size (px)
Citation preview
Spring MVC
Scott
目錄
• Spring MVC Structure• Mapping Requests With
@RequestMapping• Defining @RequestMapping handler
methods• Handling exceptions
Spring MVC Structure
1. RequestDispatcherServlet
HandlerMapping
2.
HandlerAdapterModelAndView
3.
4.
Handler
5.
ViewResolver
View(JSP/XML/PDF…)
Model
6.7.
8.
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名稱
1. RequestDispatcherServlet
HandlerMapping
2.
HandlerAdapterModelAndView“user/accountManagement”
3.
4.
UserManagerController
5.
ViewResolver
accountManagement.jsp
Model
6.7.
8.
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
@RequestMapping:用來處理網址請求映射的annotations
有六個屬性• value:指定請求的URL• method:指定請求時的method類型• params:指定request中必須包含的參數• headers:指定header中必須包含特定header值• consumes:指定content-type類型• produces:指定回傳內容類型,當request
header中accept有含才回傳
在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);
}
在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) {
...}
HTTP Request Method的意義
• GET:取得資源。• POST:建立新資源。• PUT:更新資源。• DELETE:刪除資源。
請求新增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);}
請求刪除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);}
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);}
Request Header限定
@RequestMapping(value="/account", method=RequestMethod.GET, headers="Referer=http://www.gorilla-technology.com/")public void handle(Model model) {
...}
Rule In Request Header Or Parameter
• params={"q", "p", "s"}• params={"!q", "p", "s"}• params={"q!=xyz", "p", "s"}• params={"q=xyz", "p", "s"}
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• …
@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);}
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.• …
@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);}
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";
}
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);}
Mapping the response body with the @ResponseBody annotation
@RequestMapping(value="/something", method=RequestMethod.PUT)@ResponseBodypublic String handle3() {
return "Hello World";}
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);}
Using @ModelAttribute on a method
@ModelAttribute(“account")public Account handle5(@RequestParam String number) {
return accountService.findAccount(number);}
Using @ModelAttribute on a method argument
@RequestMapping(value="/accounts/{aid}", method=RequestMethod.PUT)public String handle6(@ModelAttribute Account account) {
...}
Mapping cookie values with the @CookieValue annotation
@RequestMapping("/something")public void handle7(@CookieValue("JSESSIONID") String cookie) {
...}
Mapping request header attributes with the @RequestHeader annotation
@RequestMapping("/something")public void handle8(@RequestHeader("Accept-Encoding") String encoding, @RequestHeader("Keep-Alive") long keepAlive) {
...}
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);}
}
使用@ControllerAdvice捕捉全域的Exception
@ControllerAdvicepublic class AbstractAjaxController {
…}
Q & A