目录
第3种:模板/静态目录种均无相应错误页面,直接响应SpringBoot默认错误页面
目录
第3种:模板/静态目录种均无相应错误页面,直接响应SpringBoot默认错误页面
SpringBoot的核心功能
- 起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
- 自动配置
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。
SpringBoot的配置文件
SpringBoot配置文件类型和作用
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置。
SpringBoot默认会从Resources目录下加载application.properties或application.yml(application.yaml)文件
其中,application.properties文件是键值对类型的文件,之前一直在使用,所以此处不在对properties文件的格式进行阐述。除了properties文件外,SpringBoot还可以使用yml文件进行配置。
application.yml配置文件
YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,YML文件的扩展名可以使用.yml或者.yaml。
实体类(entity)的注解。
@Data注解
@Data注解的主要作用就是提高代码的简洁,在代码中使用这个注解,便可省去大量的get()、set()等方法,不仅提供了便利,还减少了出错的概率。如下图实体类SysUser,并没有使用get()、set()等方法。
@Data注解的功能:
- @Data可以为类提供读写功能,从而不用写get、set方法。
- 会为类提供 equals()、hashCode()、toString() 方法。
service层的注解
@Service注解
作用:
- 用于标识一个类是Spring容器中的服务组件。@Service是Spring框架中的一个注解,用于标注一个类作为服务类(Service)。
- @Service注解用于类上,标记当前类是一个service类,该注解会将当前类自动注入到spring容器中,在调用该service的时候只需要将该类注入接口中
@Autowired注解
作用:
- 用于自动装配Spring容器中的Bean。
- 在调用service类的时候,使用该注解,便可调用service。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
// 实现UserService接口中的方法
}
Mapper层的注解
@Mapper注解
Mapper的注解就是@Mapper。
1.使用@Mapper将接口交给Spring进行管理
2.不用写Mapper映射文件(XML)
3.为这个接口生成一个实现类,让别的类进行引用
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
}
@Repository注解
@Repository:@Repository
的作用与@Controller
,@Service
的作用都是把对象交给Spring
管理。@Repository
是标注在Dao
层接口上,作用是将接口的一个实现类交给Spring
管理。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
controller层的注解
@Controller注解
在 Spring MVC 中,@Controller 注解用于标识一个 Java 类是一个控制器。控制器负责接收请求、处理请求,并返回响应。具体来说,使用 @Controller 注解的类将会被 Spring MVC 自动扫描,并注册为一个控制器。
@Controller 注解的作用和 @Component 注解类似,都是将一个类标记为 Spring 的组件。但是,@Controller 注解还有以下特性:
- 自动映射 URL。@Controller 注解可以自动将请求映射到控制器的方法上。
- 支持视图解析。@Controller 注解可以将方法的返回值解析为视图,并渲染到客户端。
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
@GetMapping("/hello")
public String hello() {
return "hello";
}
@RequestMapping注解
从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。
SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。
@Controller
@RequestMapping("/hello")
public class TestController {
/**
* 此时请求的路径是/hello/test
* @return
*/
@RequestMapping("/test")
public String success(){
return "success";
}
}
@RequestParam注解
@RequestParam 是Spring框架中的一个注解,用于将请求参数的值绑定到方法的参数上。它通常用于处理 HTTP 请求中的查询参数或表单参数。
@RequestParam 注解的value 属性值没有对应上jsp中name 值则会直接报400错误,因为required 属性默认为true,不写将会使用默认值。
@PathVariable注解
@PathVariable 映射 URL 绑定的占位符
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
@PathVariable(“xxx”) 绑定到操作方法的入参中。
@RequestMapping(value = "/save",method = RequestMethod.POST)
public String save(@ModelAttribute("order") Order entity
//跟edit对应,是否缴清,是否开发票
, @RequestParam("isPayComplete") boolean isPayComplete
, @RequestParam("isRequireInvoicing") boolean isRequireInvoicing
, @RequestParam("parkingLotId") Long parkingLotId
, @RequestParam("pricingStandardId") Long pricingStandardId
, @RequestParam("vehicleId") Long vehicleId) throws Exception{
自定义异常处理
Spring Boot提供了默认的错误处理机制,由于弹窗信息基本使用的是WhitelabelErrorPage页面,
信息提示通常也是以英文呈现,对用户并不友好。
从出错提示中,可以发现无论发生什么错误,Spring Boot都会返回一个状态码及错误页面,如果关注源码可以知道,这些错误信息的底层原来是ErrorMvcAutoConfiguration错误自动配置类。当应用程序出现4xx或5xx之类错误是,ErrorPageCustomizer就会被激活,它主要用于定制错误处理的响应规则。
第1种:有模板引擎
- 精确匹配error状态码,通过将错误页面命名为具体的错误状态码,例如:404.html放在引擎目录templates/error目录中,当发生对应状态码错误时,就可以响应对应的模板页
- 模糊匹配error状态码,通过定义4xx或5xx,匹配对应类型的所有错误此种方式,精确匹配优先于模糊匹配
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验错误
第2种:没有模板引擎
此种方式,模板引擎无法找到对应的错误页面
- 将至静态资源目录中的error目录中找相应页
第3种:模板/静态目录种均无相应错误页面,直接响应SpringBoot
默认错误页面
如果BasicErrorController的errorhtml方法没有找到对应的view对象,将前往error定义在
ErrorMvcAutoConfiguation的defaultErrorView中
自定义错误页面
- 在resources/templates中添加首页的index.html页面
- 在源码文件夹Application类的同目录中添加web文件夹,并创建IndexController
- 使用@Controller注解,完整名称org.springframework.stereotype.Controller
Annotation(注解)是Java的一种特殊注释机制,JVM可通过反射读取注解内容,从而根据
注解内容进行特定操作。
注解以@开头常见注解如@Override,给toString等方法注解表示重写,这类的注解仅用于开发者,编
译器处理完就会被去掉
该注解用于定义控制器类,在spring项目中由控制器负责将用户发来的请求转发到对应的
服务接口(Service层)
- 添加一个index方法,为index页面提供页面数据(此处无)
- 为index方法添加@GetMapping("/")注解,该注解提供路由信息,负责URL到Controller中的
- 具体方法的映射;也可以通过WebMvcConfigurer进行视图和控制器的映射实现页面映射
- 在templates中创建error文件夹,并创建404.html和500.html两个页面
- 运行测试,并在index方法中主动制造错误,测试500页面,访问不存在的url,测试404页面
packagecn.edu.lzzy.config;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.servlet.config.annotation.ViewControllerRegistry;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
*
springmvc自定义配置
*
/
@Configuration
publicclassMvcConfigureimplementsWebMvcConfigurer{
publicvoidaddViewControllers(ViewControllerRegistryregistry){
//这样就不需要为每一个页面编写Controller代码了,对于纯渲染的页面可以直接这样定义就可
以
registry.addViewController("/home").setViewName("index");//forWard实现
}
}
<!--templates/index.html-->
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>主页</title>
</head>
<body>
<h1>
我是站点首页<br>
内容正在建设中,请耐心等待
</h1>
</body>
</html>
<!--templates/error/404.html-->
<!DOCTYPEhtml>
<htmllang="en"xmlns:th="http://www.thymeleaf.org">
<head></head>
<body>
<divclass="container">
<divclass="starter-template">
<h1>404——找不到对象</h1>
<divth:inline="text">你好,'[[${#httpServletRequest.remoteUser}]]'你访问的
页面不存在</div>
</div>
</div>
</body>
</html>
自定义错误处理
- 在web同目录下添加handler文件夹
- 添加两个自定义异常类,NotFoundException和BusinessException,代表资源不存在和业异常
- 添加一个统一的异常处理类PracticeExceptionHandler
- 使用@ControllerAdvice注解该类,该注解将所有Controller作为切面,利用切面技术为Controller扩展功能
- 添加专用于业务异常处理的异常处理方法,并使用ExceptionHandler注解,参数为自定义的业务异常类
- 添加通用的异常处理方法,并使用ExceptionHandler注解,参数为Exception类
另一个@RestControllerAdvice注解将所有的RestController作为切面,为RESTfulApi扩展功能。
除全局异常处理外,还提供全局数据绑定功能:
全局数据绑定:@ModelAttribute,可对所有Controller的Model添加全局属性,示例如下:
①全局控制器添加全局数据
@ControllerAdvice
publicclassGlobalController{
@ModelAttribute
publicvoidaddGlobalData(Modelmodel){
model.addAttribute("contact","lzzy@163.com");
model.addAttribute("homeUrl","https://www.baidu.com")
}
}
②在控制器类中无需绑定数据,如:
@Controller
publicclassHomeController{
@GetMapping("/")
publicStringindex(){
return
"index"
}
}
③在index.html中使用Thymeleaf绑定全局数据
<!DOCTYPEhtml>
<html>
<head>
<title>主页</title>
</head>
<body>
<h1>
<spanth:text="'欢迎访问必应搜索引擎:'+${homeUrl}+'惊不惊喜,意不意
外'"></span><br>
<spanth:text="'联系偶们:'+${contact}"></span>
</h1>
</body>
</html>
- 在error/error.html页面中显示异常信息,以标题显示业务异常,其他详细异常信息以注释的形式保存,在源代码视图中查看