三层架构 REVIEW

  • 表现层
    • Spring MVC
  • 业务层
    • Spring
  • 持久层
    • Mybatis

表现层需要做:

  1. 接收请求
  2. 响应结果

MVC REVIEW

  • Model (模型)
    • java bean
  • View (视图)
    • jsp || HTML
  • Controller (控制器)
    • servlet

Spring MVC 优势

角色划分清晰

  • 前端控制器(DispatcherServlet)
  • 请求到处理器映射(HandlerMapping)
  • 处理器适配器(HandlerAdapter)
  • 视图解析器(ViewResolver)
  • 处理器或页面控制器(Controller)
  • 验证器( Validator)
  • 命令对象(Command 请求参数绑定到的对象就叫命令对象)
  • 表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)

执行流程

  1. Client – Request -> DispatcherServlet
  2. DispatcherServlet – Request for Handler -> HandlerMapping
  3. HandllerMapping find the Method position
  4. HandlerMapping – Response an executable chain -> DispatcherServlet
  5. DispatcherServlet – Request for execute -> HandlerAdapter
  6. HandlerAdapter – Execute -> Handler/Controller
  7. Handler/Controller – Response Model and View -> HandlerAdapter
  8. HandlerAdapter – Response Model and View -> DispatcherServlet
  9. DispatcherServlet – Request for view resolve -> ViewResolver
  10. ViewResolver – Response the View -> DispatcherServlet
  11. DispatcherServlet – Apply Colors to a Drawing -> View
  12. 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