用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。
HandlerMapping负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
它就是我们开发中要编写的具体业务控制器。由DispatcherServlet 把用户请求转发到 Handler。由Handler对具体的用户请求进行处理。
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
适配器对应的处理器以及这些处理器的作用:
ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象返回给DispatcherServlet
view对象会调用render将model中的数据全部存放到request中完成了请求的处理,源码如下:
public interface View {
String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
String PATH_VARIABLES = View.class.getName() + ".pathVariables";
String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType";
@Nullable
default String getContentType() {
return null;
}
//把model里的数据存放到request,request和response负载跳转
void render(Map<String, ?> model, HttpServletRequest request,
HttpServletResponse response) throws Exception;
}
具体步骤
? 第一步:发起请求到前端控制器(DispatcherServlet)
? 第二步:前端控制器请求HandlerMapping查找 Handler
? 第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略
? 第四步:前端控制器调用处理器适配器去执行Handler
? 第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler
? 第六步:Handler执行完成给适配器返回ModelAndView
? 第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
? 第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
? 第九步:视图解析器向前端控制器返回View
? 第十步:前端控制器进行视图渲染 (将数据(在ModelAndView对象中)填充到request域)
? 第十一步:前端控制器向用户响应结果
作用:用于建立请求URL和处理请求方法之间的对应关系。
出现位置:
类上:
请求 URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理,例如:
账户模块:
? /account/add
? /account/update
? /account/delete …
订单模块:
? /order/add
? /order/update
? /order/delete
红色的部分就是把RequsetMappding写在类上,使我们的URL更加精细。
方法上:
请求URL的第二级访问目录,可以窄化请求路径
属性:
value:用于指定请求的URL。它和path属性的作用是一样的。
method:用于指定请求的方式。
注意:以上属性只要出现2个或以上时,他们的关系是与的关系。
使用二级目录访问
@Controller
@RequestMapping("/account")
public class AccountController {
@RequestMapping("/findAccount")
public ModelAndView findAccount() {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "欢迎你 springmvc");
mv.setViewName("success");
return mv;
}
}
在index.jsp里面定义超链接
<a href="/account/findAccount">窄化路径</a>
描述需要使用指定的请求方式来请求该方法
@Controller
@RequestMapping("/account")
public class AccountController {
//指定的请求方式
@RequestMapping(value = "/findAccount1", method = RequestMethod.POST)
public ModelAndView findAccount1() {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "欢迎你 springmvc");
mv.setViewName("success");
return mv;
}
}
测试:在index.jsp里使用get方式请求
<a href="/account/findAccount1">请求方式</a>