SpringBoot学习

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.拦截器(实现登录功能)

实现拦截器的步骤:

  1. 创建拦截器类实现HandlerInterceptor接口
  2. 配置拦截器
  3. 测试拦截器的拦截效果

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
  • 自定义异常处理器

自定义异常处理步骤:

  1. 创建异常处理器类实现HandlerExceptionResolver
  2. 配置异常处理器
  3. 编写异常页面
  4. 测试异常跳转

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异常处理主要分为以下方式

  1. 自定义异常错误页面
  2. 使用@ControllerAdvice + @ExceptionHandler注解处理全局异常
  3. 配置SimpleMappingExceptionResolver类处理异常
  4. 实现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)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值