目录
一、EasyMVC
1.三层架构
- 控制层(MVC)、业务层(Spring)、持久层(MyBatis)
2.MVC原理
- 使控制逻辑、业务逻辑调用、展示逻辑相互分离(责任分离)
- Model (模型) :数据模型,包含要展示的数据和业务功能。
- View (视图) :用户界面,在界面上显示模型数据。
- Controller ( 控制器) :起调度作用,接收用户请求、调用业务处理请求、共享模型数据并跳转界面。
3.前端控制器
- 前端控制器模式:在所有控制器之前有一个统一的控制器;用来集中的对请求进行统一处理,然后前端控制器再把每一个请求分发给各自的处理器(减少重复代码,抽离出公有的部分)
- 后端控制器:专门用来处理特定的,具体的请求;分发器会分发到不同的后端控制器;Apache体系(struts2)称之为XxxAction;Spring体系(Spring MVC)称之为XxxController
二、走进SpringMVC
1.Spring Web框架
-
SpringMVC是同步阻塞的IO模型,Spring的异步丰阻塞Web框架Spring WebFlux可以做到异步非阻塞,也可以使用其它方式来达到异步。
1.1SpringMVC和Struts2对比
- ①. Spring MVC的前端控制器是Servlet,而Struts2是Filter.
- ②. Spring MVC会稍微比Struts2快些. Spring MVC是基于方法设计.默认是单例的,而Sturts2 是基于类.每发一次请求都会创建一个新的对象,是多例的。
- ③、Spring MVC更加简洁。开发效率Spring MVC比Struts2高.如支持JSR303校验,且处理AJAX请求更方便。
- ④. Struts2 的OGNL表达式(模型和视图之间传递数据),Spring MVC(通过Model对象传递)
2.入门程序(使用XML开发)
2.1开发步骤
- ①:配置前端控制器: DispatcherServlet(在web.xml配置)
- ②:配置处理器映射器: BeanNameUrlHandlerMapping(在springMVC.xml配置)
- ③:配置处理器适配器: SimpleControllerHandlerAdapter(在springMVC.xml配置)
- ④:配置视图解析器: InternalResourceViewResolver(在springMVC.xml配置)
- ⑤:开发和配置处理器: HelloController(在XxxContrller里进行开发,在springMVC.xml配置)
- ⑥:开发视图:View(在页面里进行开发)
ps:根据请求的URL寻找对应的Bean,根据Bean的id/name(都可)寻找到对应的处理器;
ps:springMVC.xml这个配置文件,默认是/WEB-INF目录去找(servlet-name)-servlet.xml;配置classpath路径是在resources包里面去找;
ps:DispatcherServiet.properties部分配置(默认配置了映射器,适配器,解析器);
3.执行流程
- 客户端发送请求,到前端控制器DispatcherServlet先进行请求的统一封装处理,
- 根据处理器映射器获取到处理器,
- 根据处理器获取到对应的适配器,
- 适配器去进行具体的执行并且返回ModelAndView数据给分派器,
- 传送给视图解析器进行处理(数据替换等)并返回填充好的view对象(JSTLView,FreeMarker,PdfView等模板引擎)给分派器,
- 分配器将view(HTML/JSP等)对象最终通过浏览器进行模板渲染,然后在进行呈现。
4.使用注解开发
4.1基本注解
- 控制层(mvc):@Controller,用在类上
- 业务逻辑层(Service):@Service,用在类上
- 数据持久层(DAO):@Resposotory,用在类上
- 其他组件使用通用注解:@Component
- 在springMVC.xml配置Ioc注解扫描器和MVC注解解析器(注册处理器、适配器、解析器);
4.2@RequestMapping注解:处理地址请求映射,可以用在类上(父路径),可以用在方法上(子路径),六大属性如下:
- value:和path一样,指定请求的URL,比如 /hello。
- method:指定请求方式的类型,比如GET,HEAD,PATCH,POST,PUT,DELETE,OPTIONS,TRACE。
- consumes(消费):指定请求内容格式:Content-Type=application/json;
- produces(生产):指定响应内容格式:Accept=application/json; charset=UTF-8;
- params :指定request 中必须包含某些参数值,包含该方法才处理,
- headers :指定request中必须包含指定的header,包含才能处理。”
5.静态资源访问
问题:Tomcat默认的web.xml里的servlet配置为‘/’,项目的web.xml配置为‘/’,会出现项目覆盖了Tomcat的路径,未进行动态映射的请求寻找不到默认的路径就会失败。
解决:使用<mvc:default-servlet-handler>在开发中使用比较多.SpringMVC如果发现没有经过映射请求,就交给Tomcat的默认servlet来处理.
三、请求和响应
1.返回类型
- ModelAndView:指定数据模型+指定视图名;
mv.addObject("bs", books);//指定数据模型
mv.setViewName("book");//指定视图名
- String:配合入参Model使用,不加ResponseBody返回视图名称否则返回json字符串,也可重定向和请求转发;
- Java数据结构:加ResponseBody常见的 List 集合、Map,实体类等都可以返回,这些数据由 HttpMessageConverter 自动转为 JSON ;
ps:一般需要在springMVC.xml配置视图解析器的请求路径的前缀和后缀;
2.请求跳转
2.1请求转发:返回String类型比如:forward:/hello.html;(共享数据,只有一个请求)
- 原理:request.getRequestDispatcher ("") . forward (request, response) ;
2.2重定向:返回String类型比如:redirect:/hello.html;(不共享数据,有两个请求)
- 原理:response. sendRedirect ("") ;
2.3重定向的共享数据(只能显式传参/隐式传参)
- 可以通过Flash属性进行共享数据:原方法传入参数RedirectAttributes,调用ra.addFlashAttribute ("msg2", "msg2") ;接收方法ModelAttribute ("msg2") String msg2来进行获取;
- 原理:a向b传输数据,a先将数据传入HttpSession里然后让b去取,然后删除;
2.4重定向和请求转发的绝对路径和相对路径
- 访问资源的时候前面带上/, 表示绝对路径,从根路径开始去寻找资源.比如:/response/test6 ------/hello.html
- 访问资源的时候签名不加/,表示相对路径,从上一级上下文路径中去寻找资源.比如:/response/test6 ------/response/hello.html
3.参数处理
- 方法可传入参数HttpServletRequest request, HttpServletResponse response , HttpSession session
- 可以给对象(单例的)属性进行自动注入注解,比如@Autowired
- 获取请求参数,可以直接获取(保证URL的参数和方法的参数相同):String username, int age相同,
- 使用注解获取:@RequestParam ("name") String usexname, @Requescparam(value = "age", requixed = ralse) int age可以自定义顺序,进行设定名称并且选择该参数是否必须
- RESTful风格传参,将URL中占位符绑定到方法的形参中,RequestMapping ("/delete/{id} "),void test3 (@PathVariable ("id")Long id)
- 使用Bean对象来进行接收,方法形参传入对象,针对Bean这种复合类型(非简单类型)参数,缺省情况下就会放到model中(共享) ,缺省的key就是类型首字母小写。
4.其他请求信息
- @RequestHeader ("User- Agent") string userAgent;
- @CookieValue ("JSESSIONID") String cName;
- @SessionAttribute可以将request中的数据放入session中共享;
5.处理多对象属性名相同的问题
- 使用自定义数据绑定注册,view属性名设置前缀,controller的方法设置前缀即可
6.JSON数据处理
- 利用Jackson开源库可以将JavaBean对象和JSON/XML的格式对象互相转;SpringMVC默认支持jackson处理JSON数据。
6.1请求响应格式:
- application/x-www-form-urlencoded:传统的key-value表单格式;
- application/multipart:文件上传的请求,也能处理普通表单数据;
- application/json:参数是JSON格式,等价application/xml
6.2注解处理:
- @ResponseBody注解:处理响应,将对象转化为JSON字符串;可以放到方法,也可以放到类上;(一般处理js发出的ajax请求)
- @RestController注解:等价@Controller+ResponseBody;
- @RequestBody注解:处理请求,将JSON格式的请求数据转化成对象
7.日期类型处理
- 将字符串参数转化为日期类型:@DaceTime Format (pattern="yyyy -MM -dd") Date d;还可以使用@ControllerAdvice注解(对控制器进行增强)单独抽离出一个类,在利用@InitBinder注解进行注册;
- JSP显示Date类型,引入taglib标签库;
- 后台往前台传,转化为JSON格式:使用注解@JsonFormat (pattern= "yyyy-MM-dd HH:mm:ss") ;
四、拦截器
1.拦截器执行流程:
- 在通过映射器获取到处理器的时候,会获取到处理器执行链,可以获取到每一个节点的拦截器,以及(唯一)处理器;
1.1三大方法:
- preHandle方法(处理器处理之前):在请求达到Handler之前,先执行这个前置处理方法。当该方法返回false时,请求直接返回,不会传递到链中的下一个拦截器,更不会传递到处理链末端的Handler中。只有返回true时,请求才向链中的下一个处理节点传递。
- postHandle方法(处理器处理之后,模板渲染之前) :控制器方法执行后.视图渲染之前执行可以加入统一的响应信息。
- afterCompleti方法(模板渲染之后):视图渲染之后执行处理Controller异常信息记录操作日志,清理资源等。
1.2在mvc.xml里进行配置实现好的拦截器(实现HandlerInterceptor接口),<mvc:mapping path="/**"/>,<mvc: exclude-mapping path="/login"/>
五、异常处理
1.使用Spring MVC提供的
- 简单异常处理器SimpleMappingExceptionResolver;
- 需要配置mvc.xml;
2.实现Spring的异常处理接口
-
实现HandlerExceptionResolver接口自定义自己的异常处理器;
3.使用注解实现异常处理;
- @ExceptionHandler(可对具体异常进行处理而不是Exception)
- 借助@ControllerAdvice注解对@Controller注解进行增强,不需要配置mvc.xml;
六、数据校验
1.实体类的属性校验:
1.1使用Spring自带的验证框架:spring-validator
1.2使用JSR 303的实现:jsr303-validator;(常用)
- 在控制器的方法传参@Valid Employee e,BindingResult bindingResult;
- 通过bindingResult获取错误信息,在通过model传给页面显示;
七、SpringMVC标签
1.表单标签
通过SpringMVC的表单标签可以实现将模型数据中的属性和HTML表单元素相绑定,以实现表单数据编辑和表单值的回显.
- 引入标签<%@ taglib url= "http://wwv. springtramevork . org/tags/foxm" prefix= "form"'>
八、文件上传和下载
1.文件上传
1.1view视图层:基于表单的提交具体实现
1.2controller控制层
- 可以基于Apache的.上传组件,需要jar包,需要配置mvc.xml文件,在实现控制器的方法即可;
- 可以基于Servlet3.0:spring Boot默认支持,配置项目的web.xml文件,实现控制器的思路是相同的;
2.文件下载
- 原来的操作request方式,实现控制器方法;
- SpringMVC也做了封装,返回值变为ResponseEntity(转为字节流);