SpringBoot学习
1.第一个springboot项目
1.1点击File–>new project–>选择Spring Initializr–>
第二步:选择web应用;选择数据库Mybatis
项目创建完成后的结构如下:
2.SpringBoot一些常见问题说明
springboot中默认的页面前缀是templates,后缀是.html
3.SpringBoot中的注解
@Configuration 的详细注解:https://blog.csdn.net/loongkingwhat/article/details/105752446
4.拦截器(实现登录功能)
实现拦截器的步骤:
- 创建拦截器类实现HandlerInterceptor接口
- 配置拦截器
- 测试拦截器的拦截效果
4.1.创建LoginInterceptor拦截器类实现HandlerInterceptor接口
/* 登录检查
* 1、配置好拦截器要拦截哪些请求
* 2、把这些配置放在容器中
*/
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目标方法执行之前 */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
log.info("preHandle拦截的请求路径是{}",requestURI);
//登录检查逻辑
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser != null){
//放行
return true;
}
//拦截住。未登录。跳转到登录页
request.setAttribute("msg","请先登录");
// re.sendRedirect("/");
request.getRequestDispatcher("/").forward(request,response);
return false;
}
}
4.2 配置拦截器
拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)
@Configuration //这里是springboot的总配置类,里面如果有@Bean则是将该类的实例对象放到IOC容器中
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") //所有请求都被拦截包括静态资源
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**"); //放行的请求
}
}
PS:登录检测的代码
//登录检测
@RequestMapping("/login")
public String login(String username, String password, HttpSession session){
User user= userService.login(username,password);
if(user!=null){
//登录成功,将user存储到session,并重定向到主页
session.setAttribute("loginUser",user);
return "redirect:/index.jsp";
}
//登录失败,重定向回登录页
return "redirect:/login.jsp";
}
5.异常处理
5.1 SpringMVC异常处理
异常处理方式
- 配置简单异常处理器SimpleMappingExceptionResolver
- 自定义异常处理器
自定义异常处理步骤:
- 创建异常处理器类实现HandlerExceptionResolver
- 配置异常处理器
- 编写异常页面
- 测试异常跳转
5.1.1配置简单异常处理器SimpleMappingExceptionResolver
简单异常处理器只需要在springmvc.xml文件中配置即可,所有异常都会在这里进行匹配
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 这是默认的错误视图,即如果下面的异常都不匹配,则走这个异常-->
<!-- value指出现异常后跳转到哪个页面-->
<property name="defaultErrorView" value="errorPage1"></property>
<!-- 在这里可以配多个异常,需要在map键里面-->
<!-- key指异常的类型,value指报异常后需要跳转到哪个页面-->
<property name="exceptionMappings">
<map>
<entry key="cn.xiao.ssm.exception.MyException" value="errorPage2"></entry>
<entry key="java.lang.ClassCastException" value="errorPage3"></entry>
</map>
</property>
</bean>
5.1.2自定义异常处理器
1.创建异常处理器类实现HandlerExceptionResolver
public class MyExceptionResolver implements HandlerExceptionResolver {
//Exception 是异常对象
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView=new ModelAndView();
if(e instanceof MyException){
modelAndView.addObject("info","自定义异常");//这里的info是在errorPage.jsp页面中的
}else if(e instanceof ClassCastException){
modelAndView.addObject("info","类型转换异常");
}else if(e instanceof NullPointerException){
modelAndView.addObject("info","空指针异常");
}
modelAndView.setViewName("errorPage");
return modelAndView;
}
}
2.配置异常处理器
在sprinfmvc.xml文件中配置,将自定义的异常处理器装入到IOC容器中
<bean class="cn.xiao.ssm.exception.MyExceptionResolver"></bean>
5.2 Springboot异常处理
springboot异常处理主要分为以下方式
- 自定义异常错误页面
- 使用@ControllerAdvice + @ExceptionHandler注解处理全局异常
- 配置SimpleMappingExceptionResolver类处理异常
- 实现HandlerExceptionResolver接口
5.2.1自定义异常错误页面
SpringBoot 默认的异常处理机制:一旦程序中出现了异常 SpringBoot 就会请求 /error
的 url 。在 SpringBoot 中提供了一个叫 BasicExceptionController 来处理 /error
请求,然后跳转到默认显示异常的页面来展示异常信息。接下来就是自定义异常错误页面了,方法很简单,就是在目录 src/main/resources/templates/
下定义一个叫 error
的文件,可以是 jsp 也可以是 html 。
5.2.2 使用@ControllerAdvice + @ExceptionHandler注解处理全局异常
使用 @ControllerAdvice
+ @ExceptionHandler
注解能够处理全局异常,这种方式推荐使用,可以根据不同的异常对不同的异常进行处理。
使用方式:定义一个类,使用 @ControllerAdvice 注解该类,使用 @ExceptionHandler 注解方法,这里我定义了一个 GlobalException 类表示来处理全局异常,代码如下:
/**
* @Description 全局异常处理类
*/
@ControllerAdvice
public class GlobalException {
private static final Logger log = LoggerFactory.getLogger(GlobalException.class);
/**
* 描述:捕获 ArithmeticException 异常(即算术异常,如分母为0)
* @param model 将Model对象注入到方法中
* @param e 将产生异常对象注入到方法中
* @return 指定错误页面
*/
@ExceptionHandler(value = {ArithmeticException.class})
public String arithmeticExceptionHandle(Model model, Exception e) {
model.addAttribute("msg", "@ControllerAdvice + @ExceptionHandler :" + e.getMessage());
log.info(e.getMessage());
return "error";
}
}
5.2.3 配置 SimpleMappingExceptionResolver 类处理异常
通过配置 SimpleMappingExceptionResolver
类处理异常也是全局范围的,通过将 SimpleMappingExceptionResolver
类注入到 Spring 容器。这里可以参照前面SpringMVC是怎么配置的。
@Configuration
public class GlobalException {
@Bean
public SimpleMappingExceptionResolver
getSimpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
/*
* 参数一:异常的类型,注意必须是异常类型的全名
* 参数二:视图名称
*/
mappings.put("java.lang.ArithmeticException", "errors");
//设置异常与视图映射信息的
resolver.setExceptionMappings(mappings);
return resolver;
}
}
5.2.4 实现HandlerExceptionResolver接口
@Configuration
public class HandlerExceptionResolverImpl implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", "实现 HandlerExceptionResolver 接口处理异常");
//判断不同异常类型,做不同视图跳转
if(ex instanceof ArithmeticException){
modelAndView.setViewName("error");
}
return modelAndView;
}
}
5.GetMapping和RequestMapping,PostMapping的区别
- @GetMapping是一个作为快捷方式的组合注释:@RequestMapping(method = RequestMethod.GET)。
- @PostMapping是一个作为快捷方式的组合注释:@RequestMapping(method = RequestMethod.POST)。