SSM重点知识汇总
day1
Bean标签范特性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RYU530hB-1651576241344)(C:\Users\xbb\AppData\Roaming\Typora\typora-user-images\image-20220424105331333.png)]
Bean实例化的三种方式
- 无参构造方式
- 默认调用无参构造,大多数情况下的实例化方式
- 工厂静态模式
- 直接调用静态方法获取对象
- 工厂实例模式
- 先要有工厂对象,然后再从工厂对象里面获得你想要的额对象
Bean的依赖注入
依赖注入(Dpendency Injection):是IOC(Inversion of Control)控制反转的具体实现。
servlet层调用service层,service层调用dao层,当然可以每一层都直接从spring容器里面拿相应的对象,但是这样就没有了依赖注入的理念,依赖注入是在spring中就将dao注入到service中,这样serclet调用service的时候,只需要从spring中拿service对象就阔以了
依赖注入有构造方法注入,和set方法注入
getBean(String s):根据id值获取对象
getBean(Class aClass):根据对象的class来获取对象(在容器有多个相同的bean时,此种形式则无法获取)
day2
- 注解@autoWired使用在字段上用于根据类型依赖注入,类似于getBean(Class aClass)这种方式获取对象一样
- 而@Qualifier(“x”)需要结合@autoWired一起使用,是根据被注入对象的id来注入的
- @Resource(“x”) 是第二种的结合体
day3
- 项目新建一个新的模块时,一定要在pom.xml文件中加入war使之在构建时生成war包,否则就会出现Skipping non-war project
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vbFBOR5p-1651576241346)(C:\Users\xbb\AppData\Roaming\Typora\typora-user-images\image-20220426103248268.png)]
- getRequestURL() :http://localhost/day14/demo1
- getRequestURI() :/day14/demo1 获取包括虚拟路径后面的所有子路径
- getContextPath() :/day14 获得项目虚拟路径
- getServletPath() :/demo1 获得servlet路径,springmvc中获得的是标识在controller类上的@RequestMapping中的路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mNG69Ypj-1651576241349)(C:\Users\xbb\AppData\Roaming\Typora\typora-user-images\image-20220428154926360.png)]
day4
<mvc:default-servlet-handler/>标签
使用这个标签前必须加上下面那条标签,否则所有资源均不可见。
Spring MVC 将接收到的所有请求都看作是一个普通的请求,包括对于静态资源的请求。这样以来,所有对于静态资源的请求都会被看作是一个普通的后台控制器请求,导致请求找不到而报 404 异常错误。
对于这个问题 Spring MVC 在全局配置文件中提供了一个mvc:default-servlet-handler/标签。在 WEB 容器启动的时候会在上下文中定义一个 DefaultServletHttpRequestHandler,它会对DispatcherServlet的请求进行处理,如果该请求已经作了映射,那么会接着交给后台对应的处理程序,如果没有作映射,就交给 WEB 应用服务器默认的 Servlet 处理,从而找到对应的静态资源,只有再找不到资源时才会报错。
一般 WEB 应用服务器默认的 Servlet 都是 default。如果默认 Servlet 用不同名称自定义配置,或者在缺省 Servlet 名称未知的情况下使用了不同的 Servlet 容器,则必须显式提供默认 Servlet 的名称,如下:
<mvc:default-servlet-handler default-servlet-name="myCustomDefaultServlet"/>
<mvc:annotation-driven/>标签
mvc注解驱动
注意事项
- web.xml中配置中文乱码的过滤器只对post请求有效,如果是get请求,依然无法解决,当然对于tomcat8以下的服务器,如果使用的是插件,可以在里面配置为utf-8,tomcat8以上则自动解决get请求中文乱码问题
- 文件上传功能有三个扫做,第一导入坐标,commons-io和commons-fileupload,然后在springmvc配置文件上传解析器CommonsMultipartResolver,但是他需要一个id,且必须为multipartResolver;解析器内部参数上传文件大小的单位是KB;最后再controller中编写具体逻辑
- 方法的每个参数都可以使用@RequestParam注解来修饰
day5
搞不懂事项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zYnr9T6K-1651576241351)(C:\Users\xbb\AppData\Roaming\Typora\typora-user-images\image-20220427163203435.png)]
配置Druid连接池,username的value必须直接输入字符串才行,用EL表达式则会报Access denied for user ‘xbb’@‘localhost’ (using password: YES)错误,搞不懂为什么??????
day6
spirngMVC中的redirect和forward
- springMVC无论控制器返回的是String,modelAndView还是View,他都会转化成ModelAndView对象来操作,所以默认情况下都会经过视图解析器解析的,这就会由suffix和prefix加工后确定最终地址
- 然而如果含有redirect或者forward修饰的地址,则直接将其后面的字符串作为地址,不会经过前后缀加工操作
错误解决
- IOException parsing XML document from class path resource [application.xml];这种错误的话,可能原因之一是target中的classes文件没有application.xml文件,大概是创建项目时没有在项目中加入web模板
day9
有关aop的理解
- aop面向切面编程,底层是通过动态代理实现的,主要有两种代理技术
- 基于jdk的动态代理: 这是基于接口的一个代理技术,代理对象和目标对象都实现同一个接口,他们是好兄弟关系,代理对象主要实现了InvocationHandler接口中的invoke方法,调用目标对象的所有方法前都要先经过invoke方法,它的内部对目标对象的方法进行各种功能的增强,实际上代理对象就相当于复制了一份目标对象的所有方法,因为获取了目标对象的class文件;所谓功能增强就是结合将自己的一些新方法在运行时添加上目标对象的方法上。
- 基于cglib的动态代理: 这是基于父类的代理技术,让目标对象称为代理对象的父类。代理对象需要一个Enhancer增强类,内部主要需要设定一个callback方法,其内部有需要实现MethodInterceptor接口的intercept方法,在这个方法里面对目标对象的方法进行各种功能的增强
- spring综合了这两种代理方式,根据目标对象是否实现了接口来采取不同的代理方式实现aop思想
- 有关spring aop的概念理解
- Target(目标对象)
- Proxy(代理):一个类被aop织入增强后,就产生一个结果代理类
- Joinpoint(连接点):就是目标对象中的方法,spring只支持方法类型的连接点
- Pointcut(切入点):我们需要对目标方法中哪些方法(切入点)进行功能增强
- Advice(通知/增强):功能增强靠的也是方法,这也方法称为通知,一般都在切面类中
- Aspect(切面):是切入点和通知的结合
- Weacing(织入):是把通知应用到目标对象来创建新的代理对象的过程,对于程序员来说,就是我们在配置文件配置他们,aspectj采用的是编译器织入和类装载期织入,spring采用的是动态代理织入
- 使用aop的基本步骤
- 如果是接口方式,首先定义一个接口,再新建一个实现该接口的目标类,再需要一个切面类
- 目标类中是各种连接点(Joinpoint),而切面类中是各种通知(Advice)
- 我们首先需要在配置文件中配置目标对象和切面类,然后得让spring知道切面类是切面类,也就是需要<aop:config> 标签,再里面弄一个<aop: aspect ref=“切面类id”>标签,具体看图片
- 对于注解方式的aop,除了在配置文件里面加上组件扫描,还必须加上主动代理的标签aop:aspectj-autoproxy/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R2AWQbxT-1651576241353)(C:\Users\xbb\AppData\Roaming\Typora\typora-user-images\image-20220429160418679.png)]
day10
有关事务的理解
- 编程式事务的三大对象
- PlatformTransactionManager平台事务管理器:根据不同的dao层技术会分配不同的实现类,比如DataSourceTransactionManager:适用于使用JDBC和iBatis进行数据持久化操作的情况。
- TransactionDefinition事务定义对象:按照指定的事务规则来提交或者回滚数据,这里的事务规则就是由TransactionDefinition来决定
- TransactionStatus事务状态:一般是指事务平台分配的某个实现类在事务定义对象的规则下完成的某个事务后产生的状态
- 声明式事务:指通过配置方式,实现方式之一是利用aop思想,不干预业务代码,但又可以对业务进行事务管理
- spring中声明式事务的操作步骤
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yhHWxnjy-1651576241357)(C:\Users\xbb\AppData\Roaming\Typora\typora-user-images\image-20220501110239197.png)]
问题:使用xml配置事务这个通知功能时,可以针对目标对象中的不同方法个性化配置,但是在配置织入时,表达式中的切入点为某个包下的所有类中的所有方法,那么不同类中也可能会有相同的方法名,这个时候通知咋知道是哪个类中的方法呢。还是说只要是同名的,不管在哪个类,都会被增强?
错误解决
- spring-mvc配置控制器的url-pattern时,如果写成了/*,那么访问具体的页面时,就直接原样输出代码,这是因为此时的index.jsp被当成了静态资源展示出来
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmDkJUvw-1651576241360)(C:\Users\xbb\AppData\Roaming\Typora\typora-user-images\image-20220501110714523.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SVLJWO2o-1651576241361)(C:\Users\xbb\AppData\Roaming\Typora\typora-user-images\image-20220501110531436.png)]
详情:https://blog.csdn.net/jinghuashuiyue2/article/details/78589655?locationNum=7&fps=1
-
xml文件必须严格遵守标签顺序,如果顺序不对,则读取失败,比如mybatis的配置文件mapper.xml中,如果将起别名标签 放在标签的后面,那就不行
-
mapper文件中的sql语句黄色背景去除方式:
- setting->Editor->inspercions->SQL,取消勾选下面两项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UiuqHOBD-1651576241362)(C:\Users\xbb\AppData\Roaming\Typora\typora-user-images\image-20220502101428359.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JgNXA30Z-1651576241364)(C:\Users\xbb\AppData\Roaming\Typora\typora-user-images\image-20220502101523959.png)]
l语句黄色背景去除方式:
- setting->Editor->inspercions->SQL,取消勾选下面两项
[外链图片转存中…(img-UiuqHOBD-1651576241362)]
[外链图片转存中…(img-JgNXA30Z-1651576241364)]
- 报错:Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].St 这是因为servlet api没有配置scope为provided,因为它被tomcat容器提供,就不需要maven再重复引入,而provoded依赖在编译和测试时需要,运行时不需要,就不会被打进war包了