SpingBoot工作应用类

目录

 

静态资源如何访问实现

 JSON处理器怎么替换?

自定义异常处理 

SpringBoot如何处理跨域问题?

如何快速构建RESTful应用

怎么实现热部署

整合常见的页面模板

如何整合MyBatis

SpringBoot如何管理接口文档?


静态资源如何访问实现

(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", "[email protected]"))
                        .version("1.0")
                        .build()
                );
    }
}

@RequestBody:表示的是使用json来传递数据 

猜你喜欢

转载自blog.csdn.net/weixin_37841366/article/details/109076192