restful&ssm整合
- 1.f12禁用缓存,但是得一直开这个调试工具,才能禁用缓存。
- 2.restController(复合注解) = controller + responseBody
- 3.路径上{id}表示占位符
- 4.todo,注释//todo-->列表清单,底层工具有todo窗口。
- 5.spring扫描全部,但不要controller
- 6.mybatis配置文件,起别名是啥?
- 7.spring的声明式事务管理器:
- 8.spring+mybaties整合的时候,mybaties基本都配成了bean对象,放到spring容器中去。
- 9.springMVC+spring整合时,tomcat可以启动,但是spring容器和环境并不会被启动。
- 10.ssm整合配置文件流程:
- 11.Spring统一异常处理器:
- 12.ssm项目:查询功能思路图:
- 13.Spring + Mybatis
- 14.resultInfor类:查询,返回对象,增删改,返回null.
- 15.对象转换成json的时候,Date类型默认是转换成了时间戳。
- 16.所有异常,都被自己创建的异常类(异常管理器),所捕获,并打印到控制台上。
- 17.ssm各自的容器是什么?会有两个容器(springMVC有一个,spring有一个)?
- 18.Spring、SpringMVC及Web容器分析
1.f12禁用缓存,但是得一直开这个调试工具,才能禁用缓存。
2.restController(复合注解) = controller + responseBody
3.路径上{id}表示占位符
@pathVariable:表示获取请求路径中的{id}值
这种方式,参数少的时候用。
4.todo,注释//todo–>列表清单,底层工具有todo窗口。
5.spring扫描全部,但不要controller
springmvc仅仅扫描controller.
6.mybatis配置文件,起别名是啥?
typeAliases:用于给映射文件中的类起别名
<!--
typeAliases:用于给映射文件中的类起别名
-->
<typeAliases>
<!--方式一:typeAlias 表示起别名 type:指定的原始类型 alias指的是别名-->
<!--<typeAlias type="com.itheima.pojo.User" alias="user"/>-->
<!--方式二:package 用于给指定包下所有的类起别名,别名默认就是当前类名首字母小写-->
<package name="com.itheima.pojo"/>
</typeAliases>
7.spring的声明式事务管理器:
(transactionManager->DataSourceTransactionManager)是一个接口,它可以管理mybatis的事务。
8.spring+mybaties整合的时候,mybaties基本都配成了bean对象,放到spring容器中去。
9.springMVC+spring整合时,tomcat可以启动,但是spring容器和环境并不会被启动。
所以:tomcat启动时也要加载spring的配置文件并启动spring容器(类似于测试类的配置运行环境,和读取配置文件)。
测试环境的注解配置
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class StudentServiceTest {
需要在web.xml中配置一个监听器,监听到tomcat启动就–>加载spring配置文件,启动spring容器。
<!--配置spring启动环境:配置文件和容器-->
<!--加载配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--配置spring的监听器,当tomcat启动时,会读取spring配置文件,启动spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
10.ssm整合配置文件流程:
1)mybatise配到spring中。
2)springmvc和spring分开扫描包的注解,避免资源浪费(springmvc不用和spring配置,他俩是一家公司,所以比较友好)。
3)spring配置到tomcat的web.xml中。
11.Spring统一异常处理器:
使用Spring框架后,异常就不必在三层代码去处理了,而是直接抛给框架,框架会将所有的异常统一转交给我们自定义的统一异常处理类来处理。
SpringMVC支持下面两个注解来实现全局异常处理
//@ControllerAdvice 标注在类上,声明当前类是一个用于专门处理异常的类
//@ExceptionHandler 标注在方法上,声明当前方法可以处理哪些异常
//统一异常处理类
@ControllerAdvice//标注在类上,代表这是一个专门用于处理异常的类
@ResponseBody//这个玩意可以写在方法上,也可写在类上; 写在类上代表每个方法上都有
public class CommonExceptionHandler {
//定义空指针异常处理方法
@ExceptionHandler(NullPointerException.class)
public ResultInfo handlerNullPointerException(NullPointerException ex) {
//1. 记录异常
ex.printStackTrace();
//2. 返回前端一个好看的提示
return new ResultInfo(500, "空指针异常");
}
12.ssm项目:查询功能思路图:
1. 首先浏览器上访问路径 /listCategory
2. tomcat根据web.xml上的配置信息,拦截到了/listCategory,并将其交由DispatcherServlet处理。
3. DispatcherServlet 根据springMVC的配置,将这次请求交由CategoryController类进行处理,所以需要进行这个类的实例化
4. 在实例化CategoryController的时候,注入CategoryServiceImpl。 (自动装配实现了CategoryService接口的的实例,只有CategoryServiceImpl实现了CategoryService接口,所以就会注入CategoryServiceImpl)
5. 在实例化CategoryServiceImpl的时候,又注入CategoryMapper
6. 根据ApplicationContext.xml中的配置信息,将CategoryMapper和Category.xml关联起来了。
7. 这样拿到了实例化好了的CategoryController,并调用 list 方法
8. 在list方法中,访问CategoryService,并获取数据,并把数据放在"cs"上,接着服务端跳转到listCategory.jsp去
9. 最后在listCategory.jsp 中显示数据
SSM系列教材 (一)- Spring+Sping MVC + Mybatis 三大框架整合详细步骤 (how2j.cn)
13.Spring + Mybatis
1、建好数据库
2、准备pojo类,用来对应数据库里的表
3、准备Mapper接口,在别的地方相当于Dao
4、在Mapper接口的包下准备xml文件配置,通过namespace字段绑定Mapper(Dao)。这个字段非常牛叉,我们完全不用去写Mapper接口中的实现类了,mybatis会根据sql语句的对应id去自动绑定Mapper接口中同名方法
5、在src目录下准备applicationContext.xml,里面的内容结合Spring和Mybatis的配置。主要做了这么几个工作:①告诉Spring我们要用注解的方式来实现对象注入(@Autowired@Resource)②连接数据库③交给Spring来管理SqlSession④扫描Mapper自动实现SqlSession.getMapper()
14.resultInfor类:查询,返回对象,增删改,返回null.
15.对象转换成json的时候,Date类型默认是转换成了时间戳。
需要在实体类上加一个注解
@JsonFormat(pattern = “yyyy-MM-dd”,timezone = “GMT+8”)
16.所有异常,都被自己创建的异常类(异常管理器),所捕获,并打印到控制台上。
17.ssm各自的容器是什么?会有两个容器(springMVC有一个,spring有一个)?
为什么在整合ssm时候,会有两个容器(springMVC有一个,spring有一个)?
答: 首先说明,springMVC容器只负责Controller对象,不会创建service和dao,并且他是一个子容器。而spring的容器只负责Service和dao对象,是一个父容器。
他们的关系:子容器可以看见父容器的对象,而父容器看不见子容器的对象。
1)假设1:如果只用一个spring容器?
这时候,springmvc的controller不会正确跳转。因为springMVC初始化时,会寻找所有当前容器中的所有@Controller注解的Bean,,而当前容器springMVC中注册的Bean中并没有@Controller注解的。但是父容器有呀,为什么没拿到呢?因为默认是总子容器拿的,如果想要从父容器拿到,则需要配置。
所以解决办法是有的,即在springMVC的配置文件中配置HandlerMapping的detectHandlerMethodsInAncestorContexts属性为true即可(这里需要根据具体项目看使用的是哪种HandlerMapping),让其检测父容器的bean。
2)假设2:如果只是用一个springmvc容器
从假设1可以看出,springMVC肯定能启动,并能跳转。但是当用到service呢?springMVC容器的service是没有事务管理的。所以会出现错误。
通过前面两个假设,还有另一个假设:
3)假设3:两个容器里面全部都配上(controller,service,dao)
和假设2类似,在controller中注入service时,到底注入的是哪个容器的呢?如果是springMVC 的,那么没有事务管理功能,会出错。
经过上面三种假设,所以最好是springMVC容器负责controller;spring容器负责service 和 dao,这样各司其职。
原文链接:https://blog.csdn.net/weixin_44375878/article/details/112212858
18.Spring、SpringMVC及Web容器分析
1)Spring 容器
Spring容器是什么?
Spring容器是Spring的核心,Spring容器是管理bean对象的地方,其通过IoC技术管理。Spring容器也就是一个bean工厂(BeanFactory)。应用中bean的实例化,获取,销毁等都是由这个bean工厂管理的。更进一步讲,spring容器是管理service和dao的容器.
2)Spring MVC容器
什么是Spring MVC容器
SpringMVC是管理bean对象的地方,更进一步的讲,pringMVC是管理controller的容器。其次,spring容器和springMVC容器是父子容器的关系,spring容器是父容器,springMVC是子容器,而子容器可以访问父容器中的对象,父容器却不能访问子容器对象。通俗点就是,controller可以访问service对象,service不能访问controller对象。
3)Spring和Spring MVC的关系及区别
Spring是根容器,SpringMVC是其子容器。子容器的创建依赖于父容器的创建,父容器先于子容器创建。子容器(SpringMVC容器)可以访问父容器(Spring容器)的Bean,父容器(Spring容器)不能访问子容器(SpringMVC容器)的Bean。也就是说,当在SpringMVC容器中getBean时,如果在自己的容器中找不到对应的bean,则会去父容器中去找,这也解释了为什么由SpringMVC容器创建的Controller可以获取到Spring容器创建的Service组件的原因。
ContextLoaderListener中创建Spring容器主要用于整个Web应用程序需要共享的一些组件,比如DAO、数据库的ConnectionFactory等;而由DispatcherServlet创建的SpringMVC的容器主要用于和该Servlet相关的一些组件,比如Controller、ViewResovler等。在实际工程中,一个项目中会包括很多配置,根据不同的业务模块来划分,我们一般思路是:Spring根容器负责所有其他非controller的Bean的注册,而SpringMVC只负责controller相关的Bean的注册。
4)Web容器
什么是Web容器了
web容器是管理servlet,以及监听器(Listener)和过滤器(Filter)的。 这些都是在web容器的掌控范围里。但他们不在spring和springmvc的掌控范围里 。因此,我们无法在这些类中直接使用Spring注解的方式来注入我们需要的对象,是无效的,
web容器是无法识别的。
但我们有时候又确实会有这样的需求,比如在容器启动的时候,做一些验证或者初始化操作,这时可能会在监听器里用到bean对象;又或者需要定义一个过滤器做一些拦截操作,也可能会用到bean对象
原文链接:https://blog.csdn.net/shangrila_kun/article/details/88994097