Spring mvc 是简化web开发的一个框架
mvc是什么?
model+view+controller 设计模式
java ee当前流行的架构为 控制层 业务层 持久层
Spring mvc三大件
视图解析器
处理器映射器
处理器适配器
九大组件
HandlerMapping 处理器映射器
接收了dispatherServlet的分发后 根据url选择具体的handler,然后返回选好的handler和inertceptor(拦截器就是在这用的)
HandlerAdapter处理器适配器
让你可以不限制在servelet 方法的形式中,可以自定义参数,适配器就负责干这个
HandlerExceptionResolver
处理handler的异常
ViewResolver 视图解析器
拼接返回页面参数
RequestViewNameTranslator 请求视图名翻译处理器
LocaleResolver国际化解析器
ThemeResolver主题解析器
MultipartResolver上传请求解析器
FlashMapManager重定向参数传递
url pattern 设置 / 将拦截除JSP和servlet所有请求 tomcat也有web.xml tomcat的servlet是defaultServlet,jsp是JspServlet, 所以我们覆盖时用了SpringMvc 写了/ 那就拦截了所有.而Jsp 是父类的jsp Servlet 所以就能处理
如何解决Springmvc拦截静态资源
1:<mvc-defualt-servlet-handler/>
设置了就会在Spring MVC上下文中定义个DefaultServletHttpRequestHandler对象,检查请求是否为静态资源
2:<mvc:resource location="" mapping="">
mapping:指定的资源规则名
location:具体落实在哪个路径
设置 /* 没有例外,全部拦截
设置*.do 拦截所有.do后缀的请求
所有的静态资源都需要这么设置.否则会非正常访问(但是这个只是受限于tomcat容器原因,springboot的配置会好点,所以现在比较提倡前后端分离,会解决一些资源加载问题)
ajax问题:必须要使用注解来处理 负责无法接收到,这就是为什么我在工作中不写requestBody Ajax请求不到,安卓和IOS不是ajax请求调用接口,所以不写可以接收,
过滤器:
filter是在sevlet前执行,起到过滤请求的作用. 主要为过滤URL请求的样式.对请求增加一些检查项目,比如字符集的转换
监听器Listener:
服务器启动它初始化,服务器销毁他销毁,可以做为一些组件初始化用
拦截器interceptor:
Spring MVC的组件,拦截器只会拦截handler,
三个拦截时机:
在hanler执行之前拦截,
执行完没跳转时拦截,
执行后跳转了拦截
注解声明拦截器:
<mvc:interceptors>
<mvc:interceprtor>
写<mvc:mapping path> 进行过滤拦截Url
exclude-mapping path 可以排除一些
<bean>把自己写的bean加载进去
</mvc:interceptors>
springmvc上传文件相关
需要引入common-fileupload.jar
springmvc要添加组件:
多元素解析器(也就是上传文件相关)
bean id固定是multipartResolver
class是CommonsMultpartResolver
springmvc异常处理机制
HadnlerExceptionResolver异常处理器
注解@ExceptionHandler(异常的class) 写啥异常 就捕获啥异常,写在方法下,就是方法所在类的异常捕获,可以回信息,可以回页面,可以回数据,就如同正常的handler方法一样.
@ControllerAdvice加强Controller
将异常拦截方法写在标此注解的类,就可捕获所有controller的异常
问题:@ControllerAdvice这个注解的方法是否也是在所有controler中的handler方法执行之前先执行一下这个方法呢?
Springmvc重定向传递参数的问题
使用flash属性
RedirectAttributes 添加参数,往这个属性里addFlashAttribute属性会被存在session中重定向后既销毁
手写MVC框架的一些技术点:
(init方法默认参数)ServletConfig可以加载web.xml中配置的servlet配置类,然后进行初始化方法.
扫描类路径下所有类,思路为递归,file对象不断获取子对象是否是class,是class就存储class名,如果是目录接着往里深入
手写mvc框架核心
handler映射器 需要自己手写
spring mvc源代码剖析
DispatcherServlet继承了freamworkServlet类;
FreamworkServlet继承了ServletBean类;
ServletBean继承了HttpServlet类实现了Servlet的方法
其中FreamworkServlet重写了doPost等方法,调用了自身pocessRequest方法,然后调用了doService方法,DispatcherServlet重写了doService这个抽象方法,doService最终调用了doDispatch方法进行hanler的匹配.从而完成了从底层servlet到spring MVC框架的转换.
doDispatch方法的几个核心步骤
1:getHandler()获取执行链(就是你的一堆mapping注解的方法)
2:getHandlerAdapter()获取匹配的handler
3:handle方法执行这个handler
4:processDispatchResult 来渲染视图
步骤详解:
getHandler():
遍历handlerMappings(多版本的映射器,兼容老版本)
getHandlerAdapctor
SSM整合:
整合策略
1:spring+mybatis
2+springMvc
1)这连两个框架整合的目标
连接池和事物 给spring 容器
SqlSeesionFactory 入IOC容器
mapper动态代理 和spring的 aop进行交流 然后spring负责生成mapper的动态代理(这个地方初始化容器就已经生成好的应该)
jar包需要:
测试(必备)、mybatis(必备)、spring(必备的包)、连接池、jdbc.
最后一个主要的jar包:mybatis/spring整合包 mybatis-spring.xx.jar
------Spring Data JPA
持久层框架
可以省略sql语句
ORM思想是在JDBC之后的一种思想,就是关系模型
JPA规范 Java持久化API
SpringDataJPA是封装了JPA的规范的一个框架
JPA规范依赖于满足JPA的hibernate
hibernate是基于orm思想对jdbc的一个封装的框架
总结:
spring data jpa 利用的是hibernate的底层,对JPA规范的一个更好的封装.所以spring data jpa是基于hibernate升级开发的
spring data jpa的配置项:
1:数据源
2:JPA主要配置bean:entityManagerFactory class LocalContainerEntityManagerFactoryBean
小1:配置数据源
小2:添加扫描entity包
小3设置jpa具体实现,HibernateProvider
小4:设置hibernate方言(jpaDialect)
小5:jpaVendorAdapter配置 <bean class hibernateJpaVendorAdaptor
小小1:配置数据表是否创建generateDdl 就是自动创建映射实体.设置false
小小2:设置hibernate数据库类型
小小3:配置数据库语法databasePlatform
小小4:showSql是否打印sql
3:引用entityManagerFactory
小1:<jpa:repositories 配置basepackage entity-manager导入 transaction事物导入>
4:事物
事务类改为jpaTransactionManager
5:声明式事务
不使用事物了就,也不写service,不扫描了
6:扫描包
spring ioc的包扫描
dao层:
继承JpaRepository<entity,idType>
(基本crud操作)
JpaSpecifucationExecutor<Entity>
(负责查询)
service层
jpql语句查询(类似于hql)
同mybatis 可以用注解写语句
sql语句支持
在注解里 加上nativeQuery = true 表示使用原生的SQL语句
JPA特有:按照方法命名规则进行查询
按照一定的规则去写方法名,JPA就会识别出来并转换为sql执行
如:find查询By属性like查询方式(不写默认equals "=")可以接and,
动态拼接SQL语句 这个条件构造器没有mybatisplus好用
jpa叫Specification
想用的话还要继承Specification接口,实现toPredicate方法()
Root 查询属性,实体里的属性
第二个用不上
CriteriaBuilder 条件构造器
构造器用模糊查询时 需要声明你传入的属性转换成什么类型,就是传属性时写属性.as多个条件生成后,CriteriaBuilder.and进行连接