这里提到父子容器的概念,getServletConfigClasses 里面的容器可以访问getRootConfigClasses的容器,但是,getRootConfigClasses里的容器不能访问getServletConfigClasses里面的容器
启动类的标准写法
事务处理
public class JdbcConfig{
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
return transactionManager
}
}
@Configuration
@ComponentScan("com.itheima")
@PropertySource("classpath: jdbc.property")
@Import({JdbcConfig.class,MybatisConfig.class})
@EnableTransactionManagement
public class SpringConfig{
}
@Transactional
public interfact BookService{
}
web配置类
public class ServleetContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
protected Class<?>[] getRootConfigClasses(){
return new Class[]{SpringConfig.class};
}
protected Class<?>[] getServletConfigClasses(){
return new Class[]{SpringMvcConfig.class};
}
pritected Filter[] getServletFilters(){
return new String[]{"/"};
}
@Override
protected Filter[] getServletFilters(){
CharacterEncodingFilter filter=new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}
SpringMVC配置类
@Configuration
@ComponentScan({"com.itheima.controller"})
@EnableWebMvc
public class SpringMvcConfig{
}
表现层数据封装
前端接收数据
由于返回的数据可能很多种,所有我们需要一个统一的格式
前端接收数据格式一封装
异常处理器:
程序开发过程中不可避免的会遇到异常现象
各个层级均出现异常,异常处理代码书写在哪一行
所有的异常均抛出到表现层进行处理
异常处理器
@RestControllerAdvice : 声明这是个异常处理类
类注解:
Rest风格开发的控制器增强类定义上方
为Rest风格开发的控制器类做增强
@RestControllerAdvice
public class ProjectExceptionAdvice{
}
此注解自带@ResponseBody注解与@Componene注解,具备对应的功能
@ExceptionHandler : 则是声明要处理什么样的异常
项目异常分类
业务异常(BusinessException)
规范的用户行为产生的异常
不规范的用户行为操作产生的异常
系统异常(SystemException)
项目运行过程中可预计且无法避免的异常
其他异常(Exception)
编程人员未预期到的异常
项目异常处理的步骤
public class SystemException extends RuntimeException{
private Integer code;
public SystemException(Integer code,String message){
super(message);
this.code=code;
}
public SystemException(Integer code ,String message,Throwable cause){
super(message,cause);
this.code=code;
}
public Integer getCode(){
return code;
}
public void setCode(Integer code){
this.code=code;
}
}
放行某些请求
拦截器
拦截器是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
作用:
在指定的方法调用前后执行预先设定的代码
阻止原始方法的执行
拦截器与过滤器
归属不同: Filter属于Servlet技术,Interceptor属于SpringMVC技术
拦截内容不同: Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强
声明拦截器的bean,并实现HandlerInterceptor接口(注意: 扫描加载bean)
@Component把它装进IOC容器
public class ProjectInterceptor implements HandlerInterceptor{
拦截的原始操作之前进行
public boolean preHandle(..) throws Exception{
.......
return true;这里必须是true ,否则原始操作无法进行就终止了
}
拦截的原始操作之后进行
public void postHandle(..) throws Exception{
.........
}
拦截的原始操作之后并且在postHandle之后进行
public void afterCompletion(..) throws Exception{
.........
}
}
拦截器的参数
参数:
request: 请求对象
response: 响应对象
handler: 被调用的处理器对象,本质上是一个方法对象,对反射技术中的method对象进行了再包装
返回值为flase: 被拦截的处理器将不执行
多拦截器执行顺序
当配置多个拦截器时,形成拦截器链