Spring MVC
三层架构 REVIEW
- 表现层
- Spring MVC
- 业务层
- Spring
- 持久层
- Mybatis
表现层需要做:
- 接收请求
- 响应结果
MVC REVIEW
- Model (模型)
- java bean
- View (视图)
- jsp || HTML
- Controller (控制器)
- servlet
Spring MVC 优势
角色划分清晰
- 前端控制器(DispatcherServlet)
- 请求到处理器映射(HandlerMapping)
- 处理器适配器(HandlerAdapter)
- 视图解析器(ViewResolver)
- 处理器或页面控制器(Controller)
- 验证器( Validator)
- 命令对象(Command 请求参数绑定到的对象就叫命令对象)
- 表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)
执行流程
- Client – Request -> DispatcherServlet
- DispatcherServlet – Request for Handler -> HandlerMapping
- HandllerMapping find the Method position
- HandlerMapping – Response an executable chain -> DispatcherServlet
- DispatcherServlet – Request for execute -> HandlerAdapter
- HandlerAdapter – Execute -> Handler/Controller
- Handler/Controller – Response Model and View -> HandlerAdapter
- HandlerAdapter – Response Model and View -> DispatcherServlet
- DispatcherServlet – Request for view resolve -> ViewResolver
- ViewResolver – Response the View -> DispatcherServlet
- DispatcherServlet – Apply Colors to a Drawing -> View
- DispatcherServlet – Response -> Client
常用注解
@RequestParam
@RequestMapping("/Path")
public String method(@RequestParam(name = "nameInRequest") String username) {
...
}
@RequestBody
// get 不适用;异步时传json有用
// 获得类似("username=name&age=20")
@RequestMapping("/Path")
public String method(@RequestBody String body) {
...
}
@PathVariable
// REST 风格
@RequestMapping("/Path/{id}")
public String method(@PathVariable(name = "id") String id) {
...
}
@RequestHeader
// 获得请求头的值
@RequestMapping("/Path")
public String method(@RequestHeader(value = "HeaderName") String header) {
...
}
@CookieValue
// 获得cookie
@RequestMapping("/Path")
public String method(@CookieValue(value = "CookieName") String cookie) {
...
}
@ModelAttribute
// 放在方法上,该方法会先执行
@ModelAttribute
public String attributeMethod(String id) {
...
return attribute;
}
// 获得attribute
@RequestMapping("/Path")
public String method(Attribute attribute) {
...
}
// 第二种写法,利用Map
@ModelAttribute
public void attributeMethod(String id, Map<String, Attribute> map) {
...
map.put(id, attribute);
}
@RequestMapping("/Path")
public String method(@ModelAttribute(value = id) Attribute attribute) {
...
}
@SessionAttribute
// add attribute to session
@RequestMapping("/Path")
public String setSessionAttribute(Model model) {
model.addAttribute("key", value);
...
}
// get attribute from session
@RequestMapping("/path")
public String getSessionAttribute(ModelMap modelMap) {
result = (String) modelMap.get("key");
...
}
// delete attribute from session
@RequestMapping("/path")
public String deleteSessionAttribute(SessionStatus status) {
status.setComplete();
...
}
补充
REST 风格:
restfule: 对多个方法来说请求地址相同,根据不同的请求方式来做不同的功能。
拦截器和过滤器的区别
拦截器为SpringMVC特有,过滤器是Sevrlet的一部分。
- 过滤器:
- 在url-pattern配置/*之后,可以对所有要访问的资源拦截。
- 拦截器:
- 只会拦截访问的控制器方法,如果是jsp,html之类就不会拦截。
理解:拦截器是弱化版的拦截器。
拦截器中拦截方法的顺序:
preHandle - > method - > postHandle - > jsp - > afterCompletion
如果有两个拦截器(1 -> 2 -> Controller):
preHandle1 - > preHandle2 - > method - > postHandle2 - > postHandle1 - > jsp - > afterCompletion2 - > afterCompletion1