Spring MVC
概念
Spring的子模块;
基于Servlet开发的;核心是DispatcherServlet(截获请求并分派给相应处理器)的表现层(web层)框架
SpringMVC运作流程
-
浏览器–(Request)–DispatcherServlet
用户发起请求 -
DispatcherServlet–(request)–映射器
DispatcherServlet拿到request,寻找一个HandlerMapping去处理处理器映射器: ① BeanNameURLHandlerMapping:将浏览器上的URL与处理器name映射,寻找到对应处理器 ② SimpleUrlHandlerMapping:配合HttpRequestHandlerAdapter实现多个URL对应一个页面资源 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/second1">handler</prop>(Handler指的是一个实现了HttpRequestHandler的处理器类,这5个key都可以访问这个处理器类对应的页面) <prop key="/second2">handler</prop> <prop key="/second3">handler</prop> <prop key="/second4">handler</prop> <prop key="/seconda">handler</prop> </props> </property> </bean>
-
映射器–(Controller)–DispatcherServlet
HandlerMapping根据URL找到对应Controller(即Handler),返回Controller给DispatcherServlet处理器(controller/Handler): ① 自定义类,实现controller接口 ② 自定义类,实现HTTPRequestHandler接口
-
DispatcherServlet–(Controller)–适配器
DispatcherServlet运作:将Controller传递给适配器HandlerAdapter处理器适配器: ① SimpleControllerHandlerAdapter:处理实现了controller接口的处理器; ② HttpRequestHandlerAdapter:处理实现了HTTPRequestHandler接口的处理器(配合SimpleUrlHandlerMapping,实现多个URL对应一个页面资源) -------------------- 以上缺点:每种适配器只能处理一种Handler
-
适配器–(ModelAndView)–DispatcherServlet
HandlerAdapter根据实际情况,运作Controller并返回一个ModelAndView(包含了view和数据)给DispatcherServletmodelAndView: model存储数据,view进行页面展示 modelAndView的方法: setViewName("跳转页面地址");设置路径 addObject(“键”,“值”);存储attribute到request域
-
DispatcherServlet–(ModelAndView)–解析器
DispatcherServlet运作:将ModelAndView传递给适配器ViewResolver视图解析器:
① InternalResourceViewResolver(可以配置逻辑视图名)
不配置前后缀,则Controller中需要写物理视图名(完整路径);
配置前后缀,则Controller中只需指定逻辑视图名,会自动拼接(不适用于继承HTTPRequestHandler的Handler/直接请求转发方式)
-
解析器–(View)–DispatcherServlet
ViewResolver视图解析器:将ModelAndView解析成view(将model的数据取出并渲染到view)给DispatcherServlet -
DispatcherServlet–(Response)–浏览器
DispatcherServlet将view封装成一个responseresponse返回给浏览器
作用、优势
SSM整合难度降低(Spring与SpringMVC整合没有难度,不会互斥)
WEB项目的创建
多种页面&多种视图解析器
方法1:
同时需要配置多个视图解析器怎么办
方法2:
使用 ContentNegotiatingViewResolver,配置viewResolvers属性-list标签下加入多种视图解析器的bean节点复制进来
多个视图解析器都需要增加viewNames属性,配置html/* 或jsp/* (之前配置的前缀都要把HTML和jsp去掉改到这里,会自动拼接prefix+ viewNames + suffix)
return后面的逻辑视图名需要改用 html/页面名称 或 jsp/页面名称 写法
传值与跳转
1+5+1种传值方式
向前端页面传递:
ModelAndView对象
Model对象
ModelMap对象
Map对象
Request对象
Session对象
(以上都是Spring封装好自带的)
@ResponseBody
直接在方法上添加注解,该方法return 的内容会直接在页面展示
如果return的是Json形式数据,项目需要添加Jackson等json解析依赖包;
如果return的是字符串,不会做跳转处理而是直接显示
2+3+2种跳转方式
请求转发:跳转页面
return "页面物理视图名 "
return "页面逻辑视图名 "
return "forward:页面物理视图名 "
请求转发:跳转接口
return "forward:本类中的另一个接口名 "
return "forward:接口完整表示名 "(/根路径接口名/接口名)
重定向:跳转接口
return "redirect:接口名 "
return "redirect:接口完整表示名 "(/类的接口名/接口名)
return "redirect:页面物理视图名 "(WEB-INF下的页面不能使用物理视图名重定向访问)
@Controller
@RequestMapping("index")
public class MyControllerA {
@RequestMapping(value = "showa",method = RequestMethod.GET)
public String showA(Model model, ModelAndView mv,Map<String, Object> map, HttpSession hs, ModelMap mm, HttpServletRequest request, HttpServletResponse resp){
request.setAttribute("req", "这是第一个信息");
model.addAttribute("modelattr", "model~~");
hs.setAttribute("hs", "session!!");
map.put("map1", "asda9");
mv.addObject(new Random().nextInt(10));
mm.addAttribute("mm", new Random().nextInt(10));
// 不使用forward,直接逻辑视图名
// return "showa";
// 使用forward,只能跳转到接口或绝对路径-绝对路径
// return "forward:/WEB-INF/jsp/showa.jsp";
// 使用forward/redirect,只能跳转到接口或绝对路径-接口-相对路径写法:
// return "redirect:showamid";
// return "forward:showamid";
// 使用forward/redirect,只能跳转到接口或绝对路径-接口-"/"开头,表示根路径的接口,(从根路径开始指定接口)写法:
// return "redirect:/index/showamid";
return "forward:/index/showamid";
}
@RequestMapping(value = "showamid",method = RequestMethod.GET)
public String showA2(Model model, ModelAndView mv,Map<String, Object> map, HttpSession hs, ModelMap mm, HttpServletRequest request, HttpServletResponse resp){
return "showa";
}
}
3种取值方式
从前端获取:
request取值
形参一致取值
形参不一致@RequestParam取值