目录
静态资源如何访问实现
(1)5个默认位置:会先拦截/**这个路径
还有一个/目录 (webapp下的资源):在访问静态资源的时候一定不能加/static,不然就会从/static/static中去查找文件
(2) 自定义位置的两种方式
在WebMvcProperties中配置 (推荐的方式)
spring.mvc.static.path-pattern=/javagirl/**
spring.resources.static-location-classpath:/javagirl/
还有一种配置的形式:在Java代码中写
@Configuration
public class WebMcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/java.girl");
}
}
JSON处理器怎么替换?
(1) Gson
- 替换依赖即可
在pom.xml中排除之前的,然后把Gson加入即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
如果两个同时存在的话,只有json生效,gson并不生效
(2) Fastjson(系统没有为我们自动提供)
- 替换依赖
- 额外自己配置HttpMessageConverter(将User对象转换为json的工具类)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
@Configuration
public class WebMcConfig implements WebMvcConfigurer {
//第一种方式
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter e = new FastJsonHttpMessageConverter();
e.setDefaultCharset(Charset.forName("utf-8"));
FastJsonConfig config = new FastJsonConfig();
config.setCharset(Charset.forName("utf-8"));
e.setFastJsonConfig(config);
converters.add(e);
}
//第二种方式:直接返回一个Bean,自动注入spring容器中去,然后被框架给找到
@Bean
FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){
FastJsonHttpMessageConverter e = new FastJsonHttpMessageConverter();
e.setDefaultCharset(Charset.forName("utf-8"));
FastJsonConfig config = new FastJsonConfig();
config.setCharset(Charset.forName("utf-8"));
e.setFastJsonConfig(config);
return e;
}
}
自定义异常处理
(1) 传统的异常处理方式
(2) SpringBoot中的默认行为
在static中新建一个目录:error,error里创建两个文件500.html 404.html, 可以在error里面枚举出很多错误文件出来,还为我们提供了两个模糊的页面,4xx.html和5xx.html
也可以利用动态页面进行渲染,在thymeleaf中创建一个error目录,同样可以创建4xx.html和5xx.tml,动态和静态同时存在的话优先显示动态下的。
(3)自定义异常信息:系统默认提供的异常信息:path、error、message、timestamp、status
@Component
public class MyErrorAttribute extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
Map<String, Object> map = super.getErrorAttributes(webRequest, options);
map.put("myerror","出错了");
return map;
}
}
然后就可以通过${myerror}访问到里面的值
(4)自定义异常页面
自定义一个MyErrorViewResolver类来实现(自定义异常页面解析器)
@Component
public class MyErrorViewResolver extends DefaultErrorViewResolver {
public MyErrorViewResolver(ApplicationContext applicationContext, ResourceProperties resourceProperties) {
super(applicationContext, resourceProperties);
}
//关键是这个方法
@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
ModelAndView mv = new ModelAndView("javagirl");
mv.addObject(model);
return mv;
}
}
然后在thymeleaf的error文件夹下创建一个javagirl.html文件
SpringBoot如何处理跨域问题?
(1) 传统方案JSONP
(2) CORS
可以看到发生了CORS异常,无法跨域访问。
项目默认端口是8081
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.1.1.js"></script>
</head>
<body>
<div id="result"></div>
<input type="button" value="获取数据" onclick="getData()">
<script>
function getData(){
$.get("http://localhost:8080/hello", function (msg) {
$("#result").html(msg)
});
}
</script>
</body>
</html>
解决方案:只要@RestController:在另一个项目的控制器中如下设置即可
@CrossOrigin("http://localhost:8081") //表示允许这个域来请求我这个项目的方法
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
问题:如果每个类上都需要这么加注解的话,又太繁琐,可以给与一个全局的配置
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
//可以在里面做全局配置
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.allowedOrigins("*")
.maxAge(1800); //如果是put请求的话会现在刚开始发送一个探测的请求
}
}
如何快速构建RESTful应用
只要通过一个依赖就可以实现:spring-boot-strater-data-rest
创建数据表:user
创建一个User类
@Entity(name="user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String username;
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public User(Integer id, String username) {
this.id = id;
this.username = username;
}
}
创建一个接口:
public interface UserDao extends JpaRepository<User, Integer> {
}
然后可以直接在postman中操作数据库 增:POST 删:DELETE 改:PUT 查:GET
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
怎么实现热部署
devtool:一个工具
希望修改代码后能自动重启,而不是每次靠程序员手动启动。IDEL只有在运行之后才会编译,而Eclipse中是一保存就会自动编译。加了devtool之后,编译完了就会自动重启。也可以自动编译。spring boot中有两个类加载器,一个是Base 加载器,就是导入的jar包等等,另一个是restart加载器,对应的是开发者自己写的会变化的类。冷启动(从头开始启动)的话,两个加载器都需要工作,但热部署,只是restart加载器去加载变化的类,不变的类可以不用再加载(比如低三方的jar包),因此速度会更快。
整合常见的页面模板
Thymeleaf:导入依赖:然后搜索ThymeleafProperties类进行查看,可以在配置文件中做出相应的配置
Freemarker:和Thymeleaf的整合是类似的 可以在FreeMarkerProperties中查看相应的配置
Jsp:需要手动额外地加一个依赖
另一个区别在于:JSP需要放入webapp目录下,而项目结构默认是没有webapp目录的。
因为没有jsp的自动化配置,所以还需要再额外增加一个配置类。
还需要自动配置webMVC视图解析器
如何整合MyBatis
MyBatis的使用频率高于JPA
(1) 添加依赖 xxx-spring-boot-starter表示由第三方提供 spring-boot-strater-xxx表示由spring提供
然后在application.properties中配置即可
创建UserMapper.class
一:可以在每个UserMapper类上添加一个注解
package javagirl.cuihua.mapper;
@Mapper
public class UserMapper {
List<User> getAllUser();
}
二:可以在启动类上直接配置即可
@SpringBootApplication
@MapperScan(basePackage="javagril.cuihua.mapper")
public class CuihuaApplication {
public static void main(String[] args) {
SpringApplication.run(CuihuaApplication.class, args);
}
}
三、创建UserMapper.xml文件(要放在资源文件夹下,不然打包的时候会自动被忽略掉了)
(2) 处理mapper位置问题(如果需要)
如何放在别的目录下,需要在pom.xml中进行配置,默认的话是在资源目录下
如果放在resources下新创建的mapper文件夹中的话,还是需要在application.properties中配置相应的位置
mybatis.mapper.location=classpath:/mapper/*.xml(比较常用的写法)
@SpringBootTest
class MybatisApplicationTests{
@Autowired
UserMapper userMapper;
@Test
void contextLoads(){
List<User> list = userMapper.getAllUsers();
}
}
SpringBoot如何管理接口文档?
swagger2
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
<!--用人家已经提供好的ui即可,就能把一个接口在网页上展示出来,比较省事-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
(1)开启配置
@SpringBootApplication
@EnableSwagger2
public class CuihuaApplication {
public static void main(String[] args) {
SpringApplication.run(CuihuaApplication.class, args);
}
}
(2)提供Docket实例
@Configuration
public class Swagger2Config {
@Bean
Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.pathMapping("/")
.select()
.apis(RequestHandlerSelectors.basePackage("javagirl.swagger2.controller"))
.paths(PathSelectors.any())
.build()
.apiInfo(new ApiInfoBuilder()
.title("微认识项目接口文档")
.description("这个网站主要提供了微人事项目的接口文档")
.contact(new Contact("cuicui", "www.javagirl.org", "1577153977@qq.com"))
.version("1.0")
.build()
);
}
}
@RequestBody:表示的是使用json来传递数据