• springboot快速入门一篇文章全


    springboot快速入门一篇文章全

    springboot快速入门一篇文章全

     springboot01、基本配置

    springboot简介

    Spring Boot 为简化 Spring 应用开发而生,Spring Boot 中的 Boot 一词,即为快速启动的意思。Spring Boot 可以在零配置情况下一键启动,简洁而优雅。

    为了让 Spring 开发者痛快到底,Spring 团队做了以下设计:

    • 简化依赖,提供整合的依赖项,告别逐一添加依赖项的烦恼;
    • 简化配置,提供约定俗成的默认配置,告别编写各种配置的繁琐;
    • 简化部署,内置 servlet 容器,开发时一键即运行。可打包为 jar 文件,部署时一行命令即启动;
    • 简化监控,提供简单方便的运行监控方式。

    基于以上设计目的,Spring 团队推出了 Spring Boot 。

    目录

    1、pom.xml

    2、项目层次

    3、启动文件【com.item/Action.java】

    4、controller文件

    5、启动测试(数据是跨域的)


    1、pom.xml

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.3.4.RELEASE</version>
    5. </parent>
    6. <dependencies>
    7. <dependency>
    8. <groupId>org.springframework.boot</groupId>
    9. <artifactId>spring-boot-starter-web</artifactId>
    10. </dependency>
    11. </dependencies>

    2、项目层次

    3、启动文件【com.item/Action.java】

    1. package com.item;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. @SpringBootApplication
    5. public class Action {
    6. public static void main(String[] args) {
    7. SpringApplication.run(Action.class,args);//一定是被@SpringBootApplication标记的类
    8. }
    9. }

    4、controller文件

    其中@RestController = @Controller + @ResponseBody;

    1. package com.item.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.CrossOrigin;
    4. import org.springframework.web.bind.annotation.GetMapping;
    5. import org.springframework.web.bind.annotation.ResponseBody;
    6. import org.springframework.web.bind.annotation.RestController;
    7. import java.util.HashMap;
    8. @RestController
    9. @CrossOrigin
    10. public class UsersController {
    11. @GetMapping("GetInfo")
    12. public Object GetInfo(){
    13. HashMap<String,Object> map=new HashMap<String,Object>();
    14. map.put("state",true);
    15. map.put("msg","成功");
    16. map.put("result","有一个字符串");
    17. return map;
    18. }
    19. }

    5、启动测试(数据是跨域的)

    访问路径:【http://127.0.0.1:8080/GetInfo

     springboot02、打war包

    Spring Boot 打包为 war 并运行

    将 Spring Boot 打包为 war ,然后放置于 Tomcat 的 webapps 目录下加载运行,接下来我们就详细描述下打包为 war 的过程。

    目录

    1、修改打包方式

    2、修改启动文件【Action.java】

    3、打包命令

    4、打包效果:


    1、修改打包方式

    在【pom.xml】文件中修改默认的打包方式,显式指定打包方式为 war。

    1. <name>demospring</name>
    2. <packaging>war</packaging>

    由于 Spring Boot 内置了 Tomcat ,所以我们在打包时需要排除内置的 Tomcat ,这样可以避免内置 Tomcat 和 war 包部署运行的 Tomcat 产生冲突。在 pom.xml 中添加如下依赖即可:

    1. <!-- 阻断器·打包的是否排除内置的tomcat -->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-tomcat</artifactId>
    5. </dependency>

    2、修改启动文件【Action.java】

    1. package com.item;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.boot.builder.SpringApplicationBuilder;
    5. import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    6. @SpringBootApplication
    7. public class Action extends SpringBootServletInitializer {
    8. @Override
    9. protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    10. return application.sources(Action.class);
    11. }
    12. public static void main(String[] args) {
    13. SpringApplication.run(Action.class,args);//一定是被@SpringBootApplication标记的类
    14. }
    15. }

    3、打包命令

    项目路径中打开【cmd】并执行

    mvn clean package -Dmaven.test.skip=true

    4、打包效果:

    使用 mvn clean package -Dmaven.test.skip=true 命令打包应用了,运行命令后会在 target 目录下生成 war 文件,将该文件放置于 Tomcat 的 webapps 目录下运行即可。

    前后端分离部署的方式,更能发挥服务器的性能,如果要进行版本升级,直接替换后端war包就OK。

    springboot03、实现mybatis

    目录

    1、pom引包

    2、数据源配置application.properties

    3、model对应数据库的类Users

    4、dao层·需要加上@Repository注解

    5、添加映射文件UsersMapper.xml

    6、service层编码

    7、serviceimpl层编码

    8、Controller层编码

    9、测试效果:


    1、pom引包

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter</artifactId>
    4. </dependency>
    5. <!-- 热部署 -->
    6. <dependency>
    7. <groupId>org.springframework.boot</groupId>
    8. <artifactId>spring-boot-devtools</artifactId>
    9. </dependency>
    10. <!-- Web支持 -->
    11. <dependency>
    12. <groupId>org.springframework.boot</groupId>
    13. <artifactId>spring-boot-starter-web</artifactId>
    14. </dependency>
    15. <!-- JDBC -->
    16. <dependency>
    17. <groupId>org.springframework.boot</groupId>
    18. <artifactId>spring-boot-starter-jdbc</artifactId>
    19. </dependency>
    20. <!-- MySQL驱动 -->
    21. <dependency>
    22. <groupId>mysql</groupId>
    23. <artifactId>mysql-connector-java</artifactId>
    24. </dependency>
    25. <!-- 集成MyBatis -->
    26. <dependency>
    27. <groupId>org.mybatis.spring.boot</groupId>
    28. <artifactId>mybatis-spring-boot-starter</artifactId>
    29. <version>2.1.2</version>
    30. </dependency>
    31. <!-- junit -->
    32. <dependency>
    33. <groupId>junit</groupId>
    34. <artifactId>junit</artifactId>
    35. <scope>test</scope>
    36. </dependency>
    37. <!-- 测试 -->
    38. <dependency>
    39. <groupId>org.springframework.boot</groupId>
    40. <artifactId>spring-boot-starter-test</artifactId>
    41. <scope>test</scope>
    42. <exclusions>
    43. <exclusion>
    44. <groupId>org.junit.vintage</groupId>
    45. <artifactId>junit-vintage-engine</artifactId>
    46. </exclusion>
    47. </exclusions>
    48. </dependency>

    2、数据源配置application.properties

    Spring Boot 会将数据源自动注入到 MyBatis 的 sqlSessionFactory 组件中。对于我们开发者来说,这一切都是自动实现的,非常简单。

    1. # 配置数据库驱动
    2. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    3. # 配置数据库url
    4. spring.datasource.url=jdbc:mysql://rm-bp1zq3879r28p726lco.mysql.rds.aliyuncs.com:3306/test?characterEncoding=utf8
    5. # 配置数据库用户名
    6. spring.datasource.username=qwe8403000
    7. # 配置数据库密码
    8. spring.datasource.password=Qwe8403000
    9. # 指定MyBatis配置文件位置
    10. mybatis.mapper-locations=classpath:mapper/*.xml
    11. # 指定模型位置
    12. mybatis.typeAliasesPackage=com.item.model
    13. # 修改端口号避免冲突
    14. server.port=8088
    15. # 服务路径
    16. server.servlet.context-path=/demospring

    3、model对应数据库的类Users

    1. package com.item.model;
    2. public class Users {
    3. public int getId() {
    4. return id;
    5. }
    6. public void setId(int id) {
    7. this.id = id;
    8. }
    9. public String getUserName() {
    10. return userName;
    11. }
    12. public void setUserName(String userName) {
    13. this.userName = userName;
    14. }
    15. public String getPwd() {
    16. return pwd;
    17. }
    18. public void setPwd(String pwd) {
    19. this.pwd = pwd;
    20. }
    21. public String getNickName() {
    22. return nickName;
    23. }
    24. public void setNickName(String nickName) {
    25. this.nickName = nickName;
    26. }
    27. @Override
    28. public String toString() {
    29. return "Users{" +
    30. "id=" + id +
    31. ", userName='" + userName + '\'' +
    32. ", pwd='" + pwd + '\'' +
    33. ", nickName='" + nickName + '\'' +
    34. '}';
    35. }
    36. private int id;
    37. private String userName;
    38. private String pwd;
    39. private String nickName;
    40. }

    4、dao层·需要加上@Repository注解

    1. package com.item.dao;
    2. import com.item.model.Users;
    3. import org.apache.ibatis.annotations.Param;
    4. import org.springframework.stereotype.Repository;
    5. import java.util.List;
    6. /**
    7. * 数据访问组件
    8. */
    9. @Repository
    10. public interface UsersMapper {
    11. List<Users> GetInfo();
    12. List<Users> SelectName(@Param("nickName") String nickName);
    13. Users UsersSelectById(@Param("id") int id);
    14. int UsersAddInfo(
    15. @Param("userName") String userName,
    16. @Param("pwd") String pwd,
    17. @Param("nickName") String nickName
    18. );
    19. int UsersUpdateInfo(
    20. @Param("pwd") String pwd,
    21. @Param("id") int id
    22. );
    23. int UsersDeleteById(@Param("id") int id);
    24. }

    5、添加映射文件UsersMapper.xml

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.item.dao.UsersMapper">
    4. <!-- 用作基础查询测试 -->
    5. <select id="GetInfo" resultType="Users">
    6. select * from users
    7. </select>
    8. <!-- 用做传递参数测试 -->
    9. <select id="SelectName" resultType="Users">
    10. select * from users where nickName like "%${nickName}%"
    11. </select>
    12. <!-- id精准查询 -->
    13. <select id="UsersSelectById" resultType="Users">
    14. select * from users where id=#{id}
    15. </select>
    16. <!-- 增加 -->
    17. <insert id="UsersAddInfo">
    18. insert into users values(0,"${userName}","${pwd}","${nickName}");
    19. </insert>
    20. <!-- 修改 -->
    21. <update id="UsersUpdateInfo">
    22. update users set pwd="${pwd}" where id=#{id}
    23. </update>
    24. <!-- 删除 -->
    25. <delete id="UsersDeleteById">
    26. delete from users where id=#{id}
    27. </delete>
    28. </mapper>

    6、service层编码

    1. package com.item.service;
    2. import com.item.model.Users;
    3. import java.util.List;
    4. public interface UsersService {
    5. /**
    6. * 获取所有
    7. * @return
    8. */
    9. List<Users> GetInfo();
    10. /**
    11. * 获取nickName的模糊查询结果集
    12. * @param nickName
    13. * @return
    14. */
    15. List<Users> SelectName(String nickName);
    16. /**
    17. * id精准查询
    18. * @param id
    19. * @return
    20. */
    21. Users UsersSelectById(int id);
    22. /**
    23. * 添加信息
    24. * @param userName
    25. * @param pwd
    26. * @param nickName
    27. * @return
    28. */
    29. int UsersAddInfo(
    30. String userName,
    31. String pwd,
    32. String nickName
    33. );
    34. /**
    35. * 修改密码
    36. * @param pwd
    37. * @param id
    38. * @return
    39. */
    40. int UsersUpdateInfo(
    41. String pwd,
    42. int id
    43. );
    44. /**
    45. * 删除信息
    46. * @param id
    47. * @return
    48. */
    49. int UsersDeleteById(int id);
    50. }

    7、serviceimpl层编码

    1. package com.item.serviceimpl;
    2. import com.item.dao.UsersMapper;
    3. import com.item.model.Users;
    4. import com.item.service.UsersService;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. import org.springframework.util.DigestUtils;
    8. import java.io.UnsupportedEncodingException;
    9. import java.security.MessageDigest;
    10. import java.security.NoSuchAlgorithmException;
    11. import java.util.List;
    12. @Service
    13. public class UsersServiceImpl implements UsersService {
    14. @Autowired
    15. private UsersMapper usersMapper;
    16. @Override
    17. public List<Users> GetInfo() {
    18. return usersMapper.GetInfo();
    19. }
    20. @Override
    21. public List<Users> SelectName(String nickName) {
    22. return usersMapper.SelectName(nickName);
    23. }
    24. @Override
    25. public Users UsersSelectById(int id) {
    26. return usersMapper.UsersSelectById(id);
    27. }
    28. @Override
    29. public int UsersAddInfo(String userName, String pwd, String nickName) {
    30. pwd=encrypt(pwd);
    31. return usersMapper.UsersAddInfo(userName, pwd, nickName);
    32. }
    33. @Override
    34. public int UsersUpdateInfo(String pwd, int id) {
    35. pwd=encrypt(pwd);
    36. return usersMapper.UsersUpdateInfo(pwd, id);
    37. }
    38. /**
    39. * MD5加密
    40. * @param password
    41. * @return
    42. */
    43. private String encrypt(String password) {
    44. String passwordMd5 = null;
    45. try {
    46. MessageDigest md5 = MessageDigest.getInstance("MD5");
    47. byte[] bytes = md5.digest(password.getBytes("utf-8"));
    48. passwordMd5 = toHex(bytes);
    49. } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
    50. e.printStackTrace();
    51. }
    52. return passwordMd5;
    53. }
    54. private static String toHex(byte[] bytes) {
    55. final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();
    56. StringBuilder ret = new StringBuilder(bytes.length * 2);
    57. for (int i = 0; i < bytes.length; i++) {
    58. ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]);
    59. ret.append(HEX_DIGITS[bytes[i] & 0x0f]);
    60. }
    61. return ret.toString();
    62. }
    63. @Override
    64. public int UsersDeleteById(int id) {
    65. return usersMapper.UsersDeleteById(id);
    66. }
    67. }

    8、Controller层编码

    1. package com.item.controller;
    2. import com.item.model.Users;
    3. import com.item.service.UsersService;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.ui.Model;
    6. import org.springframework.web.bind.annotation.*;
    7. import javax.servlet.http.HttpServletRequest;
    8. import java.util.HashMap;
    9. import java.util.List;
    10. @RestController
    11. @CrossOrigin
    12. public class UsersController {
    13. @Autowired
    14. private UsersService usersService;
    15. @GetMapping("/GetInfoApi")
    16. public Object GetInfoApi(){
    17. List<Users> list=usersService.GetInfo();
    18. HashMap<String,Object> map=new HashMap<String,Object>();
    19. map.put("state",true);
    20. map.put("msg","成功");
    21. map.put("result",list);
    22. return map;
    23. }
    24. @GetMapping("/GetName")
    25. public Object GetName(HttpServletRequest request,Model model){
    26. String nickName = request.getParameter("nickName");
    27. List<Users> list=usersService.SelectName(nickName);
    28. HashMap<String,Object> map=new HashMap<String,Object>();
    29. map.put("state",true);
    30. map.put("msg","成功");
    31. map.put("result",list);
    32. return map;
    33. }
    34. /**
    35. * 添加接口,访问方式post
    36. * @param request
    37. * @param model
    38. * @return
    39. */
    40. @PostMapping(value = "/UserAddInfoApi")
    41. public Object UserAddInfoApi(HttpServletRequest request,Model model){
    42. String userName = request.getParameter("userName");
    43. String pwd = request.getParameter("pwd");
    44. String nickName = request.getParameter("nickName");
    45. usersService.UsersAddInfo(userName, pwd, nickName);
    46. HashMap<String,Object> map=new HashMap<String,Object>();
    47. map.put("state",true);
    48. map.put("msg","成功");
    49. map.put("result","");
    50. return map;
    51. }
    52. /**
    53. * 单个查询
    54. * @param request
    55. * @param model
    56. * @return
    57. */
    58. @GetMapping("/UsersSelectById")
    59. public Object UsersSelectById(HttpServletRequest request,Model model){
    60. String id = request.getParameter("id");
    61. Users users = usersService.UsersSelectById(Integer.parseInt(id));
    62. HashMap<String,Object> map=new HashMap<String,Object>();
    63. map.put("state",true);
    64. map.put("msg","成功");
    65. map.put("result",users);
    66. return map;
    67. }
    68. /**
    69. * 修改api
    70. * @param request
    71. * @param model
    72. * @return
    73. */
    74. @PostMapping(value = "/UserUpdateInfoApi")
    75. public Object UserUpdateInfoApi(HttpServletRequest request,Model model){
    76. String id = request.getParameter("id");
    77. String pwd = request.getParameter("pwd");
    78. usersService.UsersUpdateInfo(pwd,Integer.parseInt(id));
    79. HashMap<String,Object> map=new HashMap<String,Object>();
    80. map.put("state",true);
    81. map.put("msg","成功");
    82. map.put("result","");
    83. return map;
    84. }
    85. /**
    86. * 删除api
    87. * @param request
    88. * @param model
    89. * @return
    90. */
    91. @GetMapping(value = "/UsersDeleteById")
    92. public Object UsersDeleteById(HttpServletRequest request,Model model){
    93. String id = request.getParameter("id");
    94. usersService.UsersDeleteById(Integer.parseInt(id));
    95. HashMap<String,Object> map=new HashMap<String,Object>();
    96. map.put("state",true);
    97. map.put("msg","成功");
    98. map.put("result","");
    99. return map;
    100. }
    101. }

    备注:dao层引入

    1. package com.item;
    2. import org.mybatis.spring.annotation.MapperScan;
    3. import org.springframework.boot.SpringApplication;
    4. import org.springframework.boot.autoconfigure.SpringBootApplication;
    5. import org.springframework.boot.builder.SpringApplicationBuilder;
    6. import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    7. @MapperScan("com.item.dao")
    8. @SpringBootApplication
    9. public class Action extends SpringBootServletInitializer {
    10. @Override
    11. protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    12. return application.sources(Action.class);
    13. }
    14. public static void main(String[] args) {
    15. SpringApplication.run(Action.class,args);//一定是被@SpringBootApplication标记的类
    16. }
    17. }

    9、测试效果:

    可以使用postman测试:

    效果很明显,成功了。

    StringUtils判断字符串是否为空

     可以直接看到测试效果,无论是null还是""都是空。

    StringUtils依赖包:

    1. <!-- 判断字符串是否为空 -->
    2. <dependency>
    3. <groupId>org.apache.commons</groupId>
    4. <artifactId>commons-lang3</artifactId>
    5. <version>3.8.1</version>
    6. </dependency>

    StringUtils测试编码:

    1. import org.apache.commons.lang3.StringUtils;
    2. public class Action {
    3. public static void main(String[] args) {
    4. String a=null;
    5. String b="";
    6. if(StringUtils.isEmpty(a)){
    7. System.out.println("a空");
    8. }
    9. if(StringUtils.isEmpty(b)){
    10. System.out.println("b空");
    11. }
    12. }
    13. }

    StringUtils测试效果:

     springboot04、swagger配置

    前言:

    springboot的swagger配置与SSM稍微有些不同,SSM对2.9.0以上的兼容性很差,但是springboot就可以使用2.9.0以上的包了,其实区别不算太大,除了能对对象直接操作外就是页面更清爽了。

    目录

    1、pom依赖

    2、swagger配置文件

    3、接口api写法

    4、启动效果:【http://127.0.0.1:8088/swagger-ui.html】

    5、使用方法

    ​编辑

    6、可能出现的异常总结:


    1、pom依赖

    1. <!-- swagger包这里2.9.2 -->
    2. <dependency>
    3. <groupId>io.springfox</groupId>
    4. <artifactId>springfox-swagger2</artifactId>
    5. <version>2.9.2</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>io.springfox</groupId>
    9. <artifactId>springfox-swagger-ui</artifactId>
    10. <version>2.9.2</version>
    11. </dependency>

    2、swagger配置文件

    这里单独创建了一个包【com.item.swagger】来放置swagger的配置文件

    需要注意的是:【com.item.controller】这里需要改成自己的包位置。

    1. package com.item.swagger;
    2. import org.slf4j.Logger;
    3. import org.slf4j.LoggerFactory;
    4. import org.springframework.context.annotation.Bean;
    5. import org.springframework.context.annotation.Configuration;
    6. import springfox.documentation.builders.ApiInfoBuilder;
    7. import springfox.documentation.builders.PathSelectors;
    8. import springfox.documentation.builders.RequestHandlerSelectors;
    9. import springfox.documentation.service.ApiInfo;
    10. import springfox.documentation.service.Contact;
    11. import springfox.documentation.spi.DocumentationType;
    12. import springfox.documentation.spring.web.plugins.Docket;
    13. import springfox.documentation.swagger2.annotations.EnableSwagger2;
    14. @Configuration
    15. @EnableSwagger2
    16. public class SwaggerConfig {
    17. private static Logger log = LoggerFactory.getLogger(SwaggerConfig.class);
    18. @Bean
    19. public Docket createRestApi() {
    20. log.info("进入到swagger的配置中");
    21. return new Docket(DocumentationType.SWAGGER_2)
    22. // 指定构建api文档的详细信息的方法:apiInfo()
    23. .apiInfo(apiInfo())
    24. .groupName("红目香薰")
    25. .select()
    26. // 指定要生成api接口的包路径,这里把controller作为包路径,生成controller中的所有接口
    27. .apis(RequestHandlerSelectors.basePackage("com.item.controller"))
    28. .paths(PathSelectors.any())
    29. .build();
    30. }
    31. /**
    32. * 构建api文档的详细信息
    33. * @return
    34. */
    35. private ApiInfo apiInfo() {
    36. return new ApiInfoBuilder()
    37. // 设置页面标题
    38. .title("Spring Boot集成Swagger2接口总览")
    39. // 设置接口描述
    40. .description("Swagger接口")
    41. // 设置联系方式
    42. .contact(new Contact("测试swagger","http://localhost:8080/",""))
    43. // 设置版本
    44. .version("1.0")
    45. // 构建
    46. .build();
    47. }
    48. }

    3、接口api写法

    我写了一套的注释方法,一目了然

    1. package com.item.controller;
    2. import com.item.model.Users;
    3. import com.item.service.UsersService;
    4. import io.swagger.annotations.Api;
    5. import io.swagger.annotations.ApiImplicitParam;
    6. import io.swagger.annotations.ApiImplicitParams;
    7. import io.swagger.annotations.ApiOperation;
    8. import org.apache.commons.lang3.StringUtils;
    9. import org.springframework.beans.factory.annotation.Autowired;
    10. import org.springframework.ui.Model;
    11. import org.springframework.web.bind.annotation.*;
    12. import javax.servlet.http.HttpServletRequest;
    13. import java.util.HashMap;
    14. import java.util.List;
    15. @Api("用户操作接口")
    16. @RestController
    17. @CrossOrigin
    18. public class UsersController {
    19. @Autowired
    20. private UsersService usersService;
    21. /**
    22. * 获取所有信息
    23. * @return
    24. */
    25. @GetMapping("/GetInfoApi")
    26. @ApiOperation(value = "获取信息",notes = "没啥留言的")
    27. public Object GetInfoApi(){
    28. List<Users> list=usersService.GetInfo();
    29. HashMap<String,Object> map=new HashMap<String,Object>();
    30. map.put("state",true);
    31. map.put("msg","成功");
    32. map.put("result",list);
    33. return map;
    34. }
    35. @GetMapping("/GetName")
    36. @ApiOperation(value = "获取信息",notes = "没啥留言的")
    37. @ApiImplicitParams({
    38. @ApiImplicitParam(name = "nickName",required = true,paramType = "query",dataType = "String",value = "通过昵称模糊查询")
    39. })
    40. public Object GetName(HttpServletRequest request,Model model){
    41. String nickName = request.getParameter("nickName");
    42. List<Users> list=usersService.SelectName(nickName);
    43. HashMap<String,Object> map=new HashMap<String,Object>();
    44. map.put("state",true);
    45. map.put("msg","成功");
    46. map.put("result",list);
    47. return map;
    48. }
    49. /**
    50. * 添加信息
    51. * @param userName
    52. * @param pwd
    53. * @param nickName
    54. * @return
    55. */
    56. @PostMapping(value = "/UserAddInfoApi")
    57. @ApiOperation(value = "添加",notes = "没啥留言的")
    58. @ApiImplicitParams({
    59. @ApiImplicitParam(name = "userName",required = true,paramType = "query",dataType = "String",value = "用户名"),
    60. @ApiImplicitParam(name = "pwd",required = true,paramType = "query",dataType = "String",value = "密码"),
    61. @ApiImplicitParam(name = "nickName",required = true,paramType = "query",dataType = "String",value = "昵称")
    62. })
    63. public Object UserAddInfoApi(String userName,String pwd,String nickName){
    64. HashMap<String,Object> map=new HashMap<String,Object>();
    65. if(
    66. StringUtils.isEmpty(userName)||
    67. StringUtils.isEmpty(pwd)||
    68. StringUtils.isEmpty(nickName)
    69. ){
    70. map.put("state",false);
    71. map.put("msg","参数不润许为空");
    72. map.put("result","");
    73. return map;
    74. }
    75. usersService.UsersAddInfo(userName, pwd, nickName);
    76. map.put("state",true);
    77. map.put("msg","成功");
    78. map.put("result","");
    79. return map;
    80. }
    81. /**
    82. * 单个查询
    83. * @param id
    84. * @return
    85. */
    86. @GetMapping("/UsersSelectById")
    87. @ApiOperation(value = "id查询",notes = "没啥留言的")
    88. @ApiImplicitParams({
    89. @ApiImplicitParam(name = "id",required = true,paramType = "query",dataType = "String",value = "编号")
    90. })
    91. public Object UsersSelectById(String id){
    92. Users users = usersService.UsersSelectById(Integer.parseInt(id));
    93. HashMap<String,Object> map=new HashMap<String,Object>();
    94. map.put("state",true);
    95. map.put("msg","成功");
    96. map.put("result",users);
    97. return map;
    98. }
    99. /**
    100. * 修改api
    101. * @param id
    102. * @param pwd
    103. * @return
    104. */
    105. @PostMapping(value = "/UserUpdateInfoApi")
    106. @ApiOperation(value = "添加",notes = "没啥留言的")
    107. @ApiImplicitParams({
    108. @ApiImplicitParam(name = "id",required = true,paramType = "query",dataType = "String",value = "编号"),
    109. @ApiImplicitParam(name = "pwd",required = true,paramType = "query",dataType = "String",value = "密码"),
    110. })
    111. public Object UserUpdateInfoApi(String id,String pwd){
    112. usersService.UsersUpdateInfo(pwd,Integer.parseInt(id));
    113. HashMap<String,Object> map=new HashMap<String,Object>();
    114. map.put("state",true);
    115. map.put("msg","成功");
    116. map.put("result","");
    117. return map;
    118. }
    119. /**
    120. * 删除api
    121. * @param id
    122. * @return
    123. */
    124. @GetMapping(value = "/UsersDeleteById")
    125. @ApiOperation(value = "根据id删除",notes = "没啥留言的")
    126. @ApiImplicitParams({
    127. @ApiImplicitParam(name = "id",required = true,paramType = "query",dataType = "String",value = "编号")
    128. })
    129. public Object UsersDeleteById(String id){
    130. usersService.UsersDeleteById(Integer.parseInt(id));
    131. HashMap<String,Object> map=new HashMap<String,Object>();
    132. map.put("state",true);
    133. map.put("msg","成功");
    134. map.put("result","");
    135. return map;
    136. }
    137. }

    4、启动效果:【http://127.0.0.1:8088/swagger-ui.html

    这里为了看着方便,我将服务路径改为了【/】

    1. # 服务路径
    2. server.servlet.context-path=/

    5、使用方法

    POST的也类似

    6、可能出现的异常总结:

    1、SwaggerConfig的配置文件中忘记写注解,就2个注解:

    1. @Configuration
    2. @EnableSwagger2

    2、接口中的注解:

    1. @Api("用户操作接口")
    2. @ApiOperation(value = "获取信息",notes = "没啥留言的")
    3. @ApiImplicitParams({
    4. @ApiImplicitParam(name = "nickName",required = true,paramType = "query",dataType = "String",value = "通过昵称模糊查询")
    5. })

    3、没有明确接口的访问类型,导致出现一堆的同名不同访问类型的接口提示。

    使用@GetMapping或者@PostMapping就可以解决此问题。

     springboot05、封装结果集

    不可能一直用map写数据返回,很麻烦的,那么咱们就可以进行一次封装此次使用。

    目录

    springboot05、封装结果集

    创建【com.item.res】包

    注意问题


    编辑一个SUCCESS类和ERROR类,他们都有state、msg、result,那么就创建一个公用的父类base。

    创建【com.item.res】包

    Base:

    1. package com.item.res;
    2. public class BASE {
    3. private boolean state;
    4. private String msg;
    5. private Object result;
    6. public BASE(boolean state, String msg, Object result) {
    7. this.state = state;
    8. this.msg = msg;
    9. this.result = result;
    10. }
    11. public boolean isState() {
    12. return state;
    13. }
    14. public void setState(boolean state) {
    15. this.state = state;
    16. }
    17. public String getMsg() {
    18. return msg;
    19. }
    20. public void setMsg(String msg) {
    21. this.msg = msg;
    22. }
    23. public Object getResult() {
    24. return result;
    25. }
    26. public void setResult(Object result) {
    27. this.result = result;
    28. }
    29. }

    ERROR:

    1. package com.item.res;
    2. public class ERROR extends BASE {
    3. public ERROR(String msg, Object result) {
    4. super(false, msg, result);
    5. }
    6. }

    SUCCESS:

    1. package com.item.res;
    2. public class SUCCESS extends BASE {
    3. public SUCCESS(Object result) {
    4. super(false, "操作成功", result);
    5. }
    6. }

    返回修改:

    1. package com.item.controller;
    2. import com.item.model.Users;
    3. import com.item.res.ERROR;
    4. import com.item.res.SUCCESS;
    5. import com.item.service.UsersService;
    6. import io.swagger.annotations.Api;
    7. import io.swagger.annotations.ApiImplicitParam;
    8. import io.swagger.annotations.ApiImplicitParams;
    9. import io.swagger.annotations.ApiOperation;
    10. import org.apache.commons.lang3.StringUtils;
    11. import org.springframework.beans.factory.annotation.Autowired;
    12. import org.springframework.ui.Model;
    13. import org.springframework.web.bind.annotation.*;
    14. import javax.servlet.http.HttpServletRequest;
    15. import java.util.HashMap;
    16. import java.util.List;
    17. @Api("用户操作接口")
    18. @RestController
    19. @CrossOrigin
    20. public class UsersController {
    21. @Autowired
    22. private UsersService usersService;
    23. /**
    24. * 获取所有信息
    25. * @return
    26. */
    27. @GetMapping("/GetInfoApi")
    28. @ApiOperation(value = "获取信息",notes = "没啥留言的")
    29. public Object GetInfoApi(){
    30. List<Users> list=usersService.GetInfo();
    31. return new SUCCESS(list);
    32. }
    33. @GetMapping("/GetName")
    34. @ApiOperation(value = "获取信息",notes = "没啥留言的")
    35. @ApiImplicitParams({
    36. @ApiImplicitParam(name = "nickName",required = true,paramType = "query",dataType = "String",value = "通过昵称模糊查询")
    37. })
    38. public Object GetName(HttpServletRequest request,Model model){
    39. String nickName = request.getParameter("nickName");
    40. List<Users> list=usersService.SelectName(nickName);
    41. return new SUCCESS(list);
    42. }
    43. /**
    44. * 添加信息
    45. * @param userName
    46. * @param pwd
    47. * @param nickName
    48. * @return
    49. */
    50. @PostMapping(value = "/UserAddInfoApi")
    51. @ApiOperation(value = "添加",notes = "没啥留言的")
    52. @ApiImplicitParams({
    53. @ApiImplicitParam(name = "userName",required = true,paramType = "query",dataType = "String",value = "用户名"),
    54. @ApiImplicitParam(name = "pwd",required = true,paramType = "query",dataType = "String",value = "密码"),
    55. @ApiImplicitParam(name = "nickName",required = true,paramType = "query",dataType = "String",value = "昵称")
    56. })
    57. public Object UserAddInfoApi(String userName,String pwd,String nickName){
    58. HashMap<String,Object> map=new HashMap<String,Object>();
    59. if(
    60. StringUtils.isEmpty(userName)||
    61. StringUtils.isEmpty(pwd)||
    62. StringUtils.isEmpty(nickName)
    63. ){
    64. return new ERROR("参数为空","参数错误");
    65. }
    66. usersService.UsersAddInfo(userName, pwd, nickName);
    67. return new SUCCESS("添加成功");
    68. }
    69. /**
    70. * 单个查询
    71. * @param id
    72. * @return
    73. */
    74. @GetMapping("/UsersSelectById")
    75. @ApiOperation(value = "id查询",notes = "没啥留言的")
    76. @ApiImplicitParams({
    77. @ApiImplicitParam(name = "id",required = true,paramType = "query",dataType = "String",value = "编号")
    78. })
    79. public Object UsersSelectById(String id){
    80. Users users = usersService.UsersSelectById(Integer.parseInt(id));
    81. HashMap<String,Object> map=new HashMap<String,Object>();
    82. map.put("state",true);
    83. map.put("msg","成功");
    84. map.put("result",users);
    85. return map;
    86. }
    87. /**
    88. * 修改api
    89. * @param id
    90. * @param pwd
    91. * @return
    92. */
    93. @PostMapping(value = "/UserUpdateInfoApi")
    94. @ApiOperation(value = "添加",notes = "没啥留言的")
    95. @ApiImplicitParams({
    96. @ApiImplicitParam(name = "id",required = true,paramType = "query",dataType = "String",value = "编号"),
    97. @ApiImplicitParam(name = "pwd",required = true,paramType = "query",dataType = "String",value = "密码"),
    98. })
    99. public Object UserUpdateInfoApi(String id,String pwd){
    100. usersService.UsersUpdateInfo(pwd,Integer.parseInt(id));
    101. HashMap<String,Object> map=new HashMap<String,Object>();
    102. map.put("state",true);
    103. map.put("msg","成功");
    104. map.put("result","");
    105. return map;
    106. }
    107. /**
    108. * 删除api
    109. * @param id
    110. * @return
    111. */
    112. @GetMapping(value = "/UsersDeleteById")
    113. @ApiOperation(value = "根据id删除",notes = "没啥留言的")
    114. @ApiImplicitParams({
    115. @ApiImplicitParam(name = "id",required = true,paramType = "query",dataType = "String",value = "编号")
    116. })
    117. public Object UsersDeleteById(String id){
    118. usersService.UsersDeleteById(Integer.parseInt(id));
    119. HashMap<String,Object> map=new HashMap<String,Object>();
    120. map.put("state",true);
    121. map.put("msg","成功");
    122. map.put("result","");
    123. return map;
    124. }
    125. }

    使用swagger访问测试返回效果如下:

    设置完成。 

    注意问题:

    每个人的习惯方式均不同,需要看看公司具体用什么方式:

    也可能是这样返回:

    {

    “code”: -9999,

    “message”: “Invalid Request”,

    “data”:{ }

    }

    注意:无论是【ERROR】还是【SUCCESS】他们的返回结果都需要一致,否则前端在处理的时候就会很麻烦,对是一套解析,错又是一套解析,很麻烦。

    例如:

    正确返回:

    1. {
    2. "state": true,
    3. "message": "访问成功",
    4. "data":
    5. [
    6. {
    7. "id": 77,
    8. "userName": "子玉等于摸鱼",
    9. "pwd": "074FD28EFF0F5ADEA071694061739E55",
    10. "nickName": "高大上,牛逼吼吼吼吼吼"
    11. }
    12. ]
    13. }

    错误返回:

    1. {
    2. "state": false,
    3. "message": "访问失败",
    4. "data":"失败"
    5. }

    这就没法玩了。。。。 会挨骂的。

    避免层级过深的URI

    / 在url中表达层级,用于按实体关联关系进行对象导航,一般根据id导航。

    过深的导航容易导致url膨胀,不易维护,如 GET /zoos/1/areas/3/animals/4,尽量使用查询参数代替路劲中的实体导航,如GET /animals?zoo=1&area=3。

    结果过滤,排序,搜索

    url最好越简短越好,对结果过滤、排序、搜索相关的功能都应该通过参数实现。

    过滤:例如你想限制GET /tickets 的返回结果:只返回那些open状态的ticket, GET /tickets?state=open 这里的state就是过滤参数。

    排序:和过滤一样,一个好的排序参数应该能够描述排序规则,而不和业务相关。复杂的排序规则应该通过组合实现。排序参数通过 , 分隔,排序参数前加 - 表示降序排列。

     springboot06、log4j2日志配置

    目录

    前言:

    1、pom配置

    2、log4j2-spring.xml配置文件

    3、在application.properties中引入log4j2的配置

    4、log4j使用


    前言:

    日志接口(slf4j)

    slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)。

    接口用于定制规范,可以有多个实现,使用时是面向接口的(导入的包都是slf4j的包而不是具体某个日志框架中的包),即直接和接口交互,不直接使用实现,所以可以任意的更换实现而不用更改代码中的日志相关代码。

    日志实现(log4j、logback、log4j2)

    Log4j:Apache的一个开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件等,可以控制每一条日志的输出格式,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。虽然已经停止维护了,但目前绝大部分企业都是用的log4j。

    LogBack:logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现。

    Log4j2:Log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。

    1、pom配置

    1. <!-- log4j2所需要的配置 -->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter</artifactId>
    5. <exclusions>
    6. <exclusion><!-- springboot默认是用logback的日志框架的 -->
    7. <groupId>org.springframework.boot</groupId>
    8. <artifactId>spring-boot-starter-logging</artifactId
    9. </exclusion>
    10. </exclusions>
    11. </dependency>
    12. <dependency> <!-- 引入log4j2依赖 -->
    13. <groupId>org.springframework.boot</groupId>
    14. <artifactId>spring-boot-starter-log4j2</artifactId>
    15. </dependency>

    2、log4j2-spring.xml配置文件

    我精简了配置,只输出到控制台。

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    3. <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
    4. <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数, 不设置默认5s
    5. -->
    6. <Configuration status="debug">
    7. <!-- 配置日志信息输出 -->
    8. <Appenders>
    9. <!-- 输出到控制台, target属性一般为SYSTEM_OUT,也可以是 SYSTEM_ERR, -->
    10. <Console name="Console" target="SYSTEM_OUT">
    11. <!--配置日志信息的格式 -->
    12. <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
    13. </Console>
    14. </Appenders>
    15. <!-- 定义logger,只有定义了logger并引入了appender,appender才会有效 -->
    16. <Loggers>
    17. <!-- 将业务dao接口所在的包填写进去,并用在控制台和文件中输出 此处配置的是mybatis的输出 level记得设置为debug -->
    18. <logger name="com.item.dao.*" level="debug" additivity="false">
    19. <AppenderRef ref="Console" />
    20. </logger>
    21. <Root level="info">
    22. <AppenderRef ref="Console" />
    23. </Root>
    24. </Loggers>
    25. </Configuration>

    3、在application.properties中引入log4j2的配置

    1. # 引入log4j
    2. logging.config=classpath:log4j2-spring.xml
    3. # 控制台打印sql
    4. mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

    4、log4j使用

    包:

    1. import org.slf4j.Logger;
    2. import org.slf4j.LoggerFactory;

    声明:

    private final Logger log = LoggerFactory.getLogger(this.getClass());

    使用:

    log.info("访问模糊查询");

    效果:

     springboot07、task定时任务

    定时任务的概述

    在项目中开发定时任务应该是一种比较常见的需求,在Java中开发定时任务主要有三种方案:一是使用JDK自带的Timer,二是使用第三方组件Quartz',三是使用Spring Task。

    Timer是JDK自带的定时任务工具,其简单易用,但是对于复杂的定时规则无法满足,在实际项目开发中也很少使用到,Quartz功能强大,但是使用起来相对笨重,而Spring Task则具备了前两者之间的优点,使用起来简单,除Spring 相关的包外不需要额外的包,而且支持注解和配置文件两种形式。

    所以咱们这里使用springboot的task,相对方便、快捷、高效。

    1、启动类上添加@EnableScheduling

    1. package com.item;
    2. import org.mybatis.spring.annotation.MapperScan;
    3. import org.springframework.boot.SpringApplication;
    4. import org.springframework.boot.autoconfigure.SpringBootApplication;
    5. import org.springframework.boot.builder.SpringApplicationBuilder;
    6. import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    7. import org.springframework.scheduling.annotation.EnableScheduling;
    8. @MapperScan("com.item.dao")
    9. @SpringBootApplication
    10. @EnableScheduling
    11. public class Action extends SpringBootServletInitializer {
    12. @Override
    13. protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    14. return application.sources(Action.class);
    15. }
    16. public static void main(String[] args) {
    17. SpringApplication.run(Action.class,args);
    18. }
    19. }

    2、创建测试包【com.item.task】

    2.1fixedRate定时

    1. package com.item.task;
    2. import org.springframework.scheduling.annotation.Scheduled;
    3. import org.springframework.stereotype.Component;
    4. import java.util.Date;
    5. /**
    6. * 任务类
    7. */
    8. @Component
    9. public class TaskTest {
    10. /**
    11. * 每2秒执行1次
    12. */
    13. @Scheduled(fixedRate = 2000)
    14. public void fixedRateMethod() throws InterruptedException {
    15. System.out.println("task-fixedRate,每2秒执行1此:" + new Date());
    16. Thread.sleep(1000);
    17. }
    18. }

    2.2cron定时

    1. package com.item.task;
    2. import org.springframework.scheduling.annotation.Scheduled;
    3. import org.springframework.stereotype.Component;
    4. import java.text.SimpleDateFormat;
    5. import java.util.Date;
    6. /**
    7. * 任务类
    8. */
    9. @Component
    10. public class TaskCron {
    11. private SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    12. /**
    13. * 在每分钟的00秒执行
    14. */
    15. @Scheduled(cron = "0 * * * * ?")
    16. public void oneMin() throws InterruptedException {
    17. System.out.println("cron每分钟执行:" + simpleDateFormat.format(new Date()));
    18. }
    19. /**
    20. * 每5秒执行
    21. */
    22. @Scheduled(cron = "*/5 * * * * ?")
    23. public void fiveS() throws InterruptedException {
    24. System.out.println("cron每5秒执行:" + simpleDateFormat.format(new Date()));
    25. }
    26. }

    Cron表达式

    cronExpression表达式有至少6个由空格分隔的时间元素,从左往右,这些元素的定义如下:

    秒,分,时,月份中的日期,月份,星期,年份

    字段 允许值 允许的特殊字符 
    秒 0-59 , - * / 
    分 0-59 , - * / 
    小时 0-23 , - * / 
    日期 1-31 , - * ? / L W C 
    月份 1-12 或者 JAN-DEC , - * / 
    星期 1-7 或者 SUN-SAT , - * ? / L C # 
    年(可选) 留空, 1970-2099 , - * / 

    * 表示所有值; 
    ? 表示未说明的值,即不关心它为何值; 
    - 表示一个指定的范围; 
    , 表示附加一个可能值; 
    / 符号前表示开始时间,符号后表示每次递增的值; 

    常用定时:

    每隔5秒执行一次任务:  "*/5 * * * * ?"
     
    每隔1分钟执行一次任务:  "0 */1 * * * ?"
     
    每天23点执行一次任务:  "0 0 23 * * ?"
     
    每天凌晨1点执行一次任务:  "0 0 1 * * ?"
     
    每月1号凌晨1点执行一次任务:  "0 0 1 1 * ?"
     
    每月1号凌晨2点执行一次任务:  "0 0 2 1 * ? *"
     
    每月最后一天23点执行一次任务:  "0 0 23 L * ?"
     
    每周星期天凌晨1点执行一次任务:  "0 0 1 ? * L"

    1. 每隔5秒执行一次任务: "*/5 * * * * ?"
    2. 每隔1分钟执行一次任务: "0 */1 * * * ?"
    3. 每天23点执行一次任务: "0 0 23 * * ?"
    4. 每天凌晨1点执行一次任务: "0 0 1 * * ?"
    5. 每月1号凌晨1点执行一次任务: "0 0 1 1 * ?"
    6. 每月1号凌晨2点执行一次任务: "0 0 2 1 * ? *"
    7. 每月最后一天23点执行一次任务: "0 0 23 L * ?"
    8. 每周星期天凌晨1点执行一次任务: "0 0 1 ? * L"

    效果:

    springboot08、拦截器HandlerInterceptor

    前言

    拦截器这个名词定义的非常形象,就像导弹要攻击目标的时候,可能会被先进的反导系统拦截,此处的反导系统就是一种拦截器。

    我们开发的应用,对外暴露的是控制器中定义的 API 方法,我们可以在 API 方法的外围放置拦截器,所有对 API 的访问都可以通过拦截器进行过滤。

    OK,那么这样的拦截有什么意义吗,其实已经很明显了,反导系统可以保护目标的安全并识别对目标的攻击行为。同理,拦截器可以跟踪对应用的访问行为,对合法访问行为予以放行,对非法访问行为予以拒绝。怎么样,是不是很牛,接下来咱们就在 Spring Boot 项目中具体实现下。

    1、创建拦截器【com.item.handler】

    通过【request】可以获取任何值

    1. package com.item.handler;
    2. import org.springframework.web.servlet.HandlerInterceptor;
    3. import org.springframework.web.servlet.ModelAndView;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.util.Date;
    7. /**
    8. * 自定义拦截器类
    9. */
    10. public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口
    11. /**
    12. * (1) preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用。
    13. */
    14. @Override
    15. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    16. throws Exception {
    17. System.out.println(new Date() + "--preHandle:" + request.getRequestURL());
    18. StringBuffer url = request.getRequestURL();
    19. if(url.substring(url.lastIndexOf("/")+1,url.length()).equals("GetName")){
    20. System.out.println("------模糊查询方法------");
    21. String nickName = request.getParameter("nickName");
    22. System.out.println("获取的是nickName:"+nickName+",我可以根据获取的值判断是否是sql注入等操作");
    23. }
    24. return true;
    25. }
    26. /**
    27. * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。
    28. */
    29. @Override
    30. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
    31. ModelAndView modelAndView) throws Exception {
    32. System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
    33. }
    34. /**
    35. * 该方法将在postHandle请求完成之后,也就是DispatcherServlet渲染了视图执行
    36. */
    37. @Override
    38. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    39. throws Exception {
    40. System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL());
    41. }
    42. }

    在上面的实例中,我们定义了一个拦截器类 MyInterceptor ,通过实现 HandlerInterceptor 接口,该类具备了拦截器的功能。

    MyInterceptor 中的方法执行顺序为 preHandle – Controller 方法 – postHandle – afterCompletion ,所以拦截器实际上可以对 Controller 方法执行前后进行拦截监控。

    最后还有一个非常重要的注意点, preHandle 需要返回布尔类型的值。 preHandle 返回 true 时,对控制器方法的请求才能到达控制器,继而到达 postHandle 和 afterCompletion 方法;如果 preHandle 返回 false ,后面的方法都不会执行。

    2、生效配置【com.item.handler】内创建【WebConfig】

    如果想让配置器生效,还需要通过配置类进行相应配置。

    1. package com.item.handler;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    5. /**
    6. * Web配置类
    7. */
    8. @Configuration
    9. public class WebConfig implements WebMvcConfigurer {
    10. /**
    11. * 添加Web项目的拦截器
    12. */
    13. @Override
    14. public void addInterceptors(InterceptorRegistry registry) {
    15. // 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截
    16. registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    17. }
    18. }

    3、拦截器效果: 

    4、拦截器作用

    主要完成请求参数的解析、将页面表单参数赋给值栈中相应属性、执行功能检验、程序异常调试等工作,例如:登录校验、Token验证等。

    springboot09、监控

    前言

    因为公司开发的项目多、为客户部署的项目实例多。工作中我们都会经常遇到,由于某个客户的项目突然无法访问,一堆研发、售后部门的同事火急火燎处理问题的场景。

    • 能够有一个界面,监控所有关注的项目实例运行状态。
    • 对于某个项目实例来说,可以监控该实例的各项运行参数,例如内存占用情况、磁盘使用情况、数据库连接情况。

    利用 Spring Boot Admin 实现可视化监控,此时至少需要两个项目实例,一个是监控的管理端,一个是被监控的客户端。

    注:会与swagger冲突。这个功能是在上线后使用,所以注意关闭swagger。

    目录

    前言

    1、pom配置

    2、启动项配置

    3、访问主页

    4、客户端pom依赖:

    5、修改客户端配置


    1、pom配置

    1. <!-- Spring Boot Admin 管理端依赖项 -->
    2. <dependency>
    3. <groupId>de.codecentric</groupId>
    4. <artifactId>spring-boot-admin-starter-server</artifactId>
    5. <version>2.2.3</version>
    6. </dependency>

    2、启动项配置

    1. package com.item;
    2. import de.codecentric.boot.admin.server.config.EnableAdminServer;
    3. import org.mybatis.spring.annotation.MapperScan;
    4. import org.springframework.boot.SpringApplication;
    5. import org.springframework.boot.autoconfigure.SpringBootApplication;
    6. import org.springframework.boot.builder.SpringApplicationBuilder;
    7. import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    8. import org.springframework.scheduling.annotation.EnableScheduling;
    9. @MapperScan("com.item.dao")
    10. @SpringBootApplication
    11. @EnableScheduling
    12. @EnableAdminServer
    13. public class Action extends SpringBootServletInitializer {
    14. @Override
    15. protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    16. return application.sources(Action.class);
    17. }
    18. public static void main(String[] args) {
    19. SpringApplication.run(Action.class,args);
    20. }
    21. }

    3、访问主页

    根据端口号访问就行【http://127.0.0.1:8088/

    4、客户端pom依赖:

    1. <!-- Spring Boot Admin监控客户端依赖 -->
    2. <dependency>
    3. <groupId>de.codecentric</groupId>
    4. <artifactId>spring-boot-admin-starter-client</artifactId>
    5. <version>2.2.3</version>
    6. </dependency>

    5、修改客户端配置

    1. # 修改端口号避免冲突
    2. server.port=8081
    3. # 配置监控管理端地址
    4. spring.boot.admin.client.url=http://127.0.0.1:8088
    5. # 客户端的名称,用于区分不同的客户端
    6. spring.boot.admin.client.instance.name=CLIENT1
    7. # 配置客户端展示哪些信息,*表示展示全部信息
    8. management.endpoints.web.exposure.include=*

    启动client_test,可以看到应用是1了,可以多启动几个,都能看到

    点击进去:

    多弄几个效果还是很明显的。

     springboot10、AOP

    前言

    Spring 最重要的两个功能,就是依赖注入和面向切面编程(AOP)。

    AOP 为我们提供了处理问题的全局化视角,使用得当可以极大提高编程效率。

    Spring Boot 中使用 AOP 与 Spring 中使用 AOP 几乎没有什么区别,只是建议尽量使用 Java 配置代替 XML 配置。

    目录

    ​编辑springboot09、AOP

    前言

    1、pom依赖

    2、AOP控制器【com.item.aop】

    3、测试apo效果

    4、使用 AOP 监控性能


    1、pom依赖

    1. <!-- AOP -->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-aop</artifactId>
    5. </dependency>

    2、AOP控制器【com.item.aop】

    1. package com.item.aop;
    2. import org.aspectj.lang.JoinPoint;
    3. import org.aspectj.lang.annotation.Aspect;
    4. import org.aspectj.lang.annotation.Before;
    5. import org.aspectj.lang.annotation.Pointcut;
    6. import org.springframework.stereotype.Component;
    7. import org.slf4j.Logger;
    8. import org.slf4j.LoggerFactory;
    9. import java.util.Date;
    10. /**
    11. * 日志切面
    12. */
    13. @Component
    14. @Aspect // 标注为切面
    15. public class LogAspect {
    16. private Logger logger = LoggerFactory.getLogger(this.getClass());
    17. // 切入点表达式,表示切入点为控制器包中的所有方法
    18. @Pointcut("within(com.item.controller..*)")
    19. public void LogAspect() {
    20. }
    21. // 切入点之前执行
    22. @Before("LogAspect()")
    23. public void doBefore(JoinPoint joinPoint) {
    24. logger.info("访问时间:{}--访问接口:{}", new Date(), joinPoint.getSignature());
    25. }
    26. }

    3、测试apo效果

    可以根据返回的路径进行接口控制

    4、使用 AOP 监控性能

    在研发项目的性能测试阶段,或者项目部署后,我们会希望查看服务层方法执行的时间。以便精准的了解项目中哪些服务方法执行速度慢,后续可以针对性的进行性能优化。

    此时我们就可以使用 AOP 的环绕通知,监控服务方法的执行时间。

    1. package com.item.aop;
    2. import org.aspectj.lang.ProceedingJoinPoint;
    3. import org.aspectj.lang.annotation.Around;
    4. import org.aspectj.lang.annotation.Aspect;
    5. import org.aspectj.lang.annotation.Pointcut;
    6. import org.springframework.stereotype.Component;
    7. import org.slf4j.Logger;
    8. import org.slf4j.LoggerFactory;
    9. /**
    10. * 服务层方法切面
    11. */
    12. @Component
    13. @Aspect // 标注为切面
    14. public class ServiceAspect {
    15. private Logger logger = LoggerFactory.getLogger(this.getClass());
    16. // 切入点表达式,表示切入点为服务层包中的所有方法
    17. @Pointcut("within(com.item.controller..*)")
    18. public void ServiceAspect() {
    19. }
    20. @Around("ServiceAspect()") // 环绕通知
    21. public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable {
    22. long startTime = System.currentTimeMillis();// 记录开始时间
    23. Object result = joinPoint.proceed();
    24. logger.info("接口层方法:{}--执行时间:{}毫秒", joinPoint.getSignature(), System.currentTimeMillis() - startTime);
    25. return result;
    26. }
    27. }

    springboot11、redis

    前言

    redis可以说是现在最火的非关系型数据库,主要是它处理数据的能力是真的很强。就说win环境的处理能力一般的机器也能在每秒3万次以上,已经很厉害了。我们一般的几万用户的APP根本不需要集群,一个Redis即可搞定几乎所有的小规模并发性问题了。

    资源地址:redis服务(windows版)&amp;redis可视化工具.rar_asp.netcoreredis-.Net文档类资源-CSDN下载

    目录

    1、pom依赖

    2、配置声明(application.properties中)

    3、编写配置文件【com.item.redis】

    4、操作提示

    5、RedisBase编码(只包含字符串处理)

    6、创建测试接口【com.item.controller】内

    7、编写redis层级【com.item.Base】

    8、启动测试http://127.0.0.1:8088/swagger-ui.htm


    1、pom依赖

    1. <!-- Redis 依赖 -->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-data-redis</artifactId>
    5. </dependency>
    6. <dependency>
    7. <groupId>redis.clients</groupId>
    8. <artifactId>jedis</artifactId>
    9. <version>3.1.0</version>
    10. </dependency>

    2、配置声明(application.properties中)

    1. #---------------------------------
    2. # Redis数据库索引(默认为0)
    3. spring.redis.database=0
    4. # Redis服务器地址
    5. spring.redis.host=localhost
    6. # Redis服务器连接端口
    7. spring.redis.port=6379
    8. # Redis服务器连接密码(默认为空)
    9. spring.redis.password=
    10. #连接池最大连接数(使用负值表示没有限制)
    11. spring.redis.pool.max-active=8
    12. # 连接池最大阻塞等待时间(使用负值表示没有限制)
    13. spring.redis.pool.max-wait=-1
    14. # 连接池中的最大空闲连接
    15. spring.redis.pool.max-idle=8
    16. # 连接池中的最小空闲连接
    17. spring.redis.pool.min-idle=0
    18. # 连接超时时间(毫秒)
    19. spring.redis.timeout=0
    20. #---------------------------------

    3、编写配置文件【com.item.redis】

    中间有输出语句就是为了表现配置成功,可以删掉。

    1. package com.item.redis;
    2. import org.springframework.boot.context.properties.ConfigurationProperties;
    3. import org.springframework.context.annotation.Bean;
    4. import org.springframework.context.annotation.Configuration;
    5. import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    6. import org.springframework.data.redis.core.RedisTemplate;
    7. import org.springframework.data.redis.serializer.StringRedisSerializer;
    8. import redis.clients.jedis.JedisPoolConfig;
    9. /**
    10. * 完成对Redis整合的配置
    11. */
    12. @Configuration
    13. public class RedisConfig {
    14. /**
    15. * 1.创建 JedisPoolConfig 对象。在该对象中完成一些链接池配置
    16. */
    17. @Bean
    18. @ConfigurationProperties(prefix = "spring.redis.jedis.pool")
    19. public JedisPoolConfig JedisPoolConfig() {
    20. JedisPoolConfig config = new JedisPoolConfig();
    21. System.out.println("redis默认值:" + config.getMaxIdle());
    22. System.out.println("redis默认值:" + config.getMinIdle());
    23. System.out.println("redis默认值:" + config.getMaxTotal());
    24. return config;
    25. }
    26. /**
    27. * 2.创建 JedisConnectionFactory 对象,配置Redis连接属性
    28. *
    29. * @param config
    30. * @return
    31. */
    32. @Bean
    33. @ConfigurationProperties(prefix = "spring.redis")
    34. public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig config) {
    35. System.out.println("redis配置完毕:" + config.getMaxIdle());
    36. System.out.println("redis配置完毕:" + config.getMinIdle());
    37. System.out.println("redis配置完毕:" + config.getMaxTotal());
    38. JedisConnectionFactory factory = new JedisConnectionFactory();
    39. factory.setPoolConfig(config);//关联连接池的配置对象
    40. return factory;
    41. }
    42. /**
    43. * 3.创建RedisTemplate,用于执行Redis操作的方法
    44. *
    45. * @param factory
    46. * @return
    47. */
    48. @Bean
    49. public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory factory) {
    50. RedisTemplate<String, Object> template = new RedisTemplate<>();
    51. //关联JedisConnectionFactory
    52. template.setConnectionFactory(factory);
    53. //为key序列化器
    54. template.setKeySerializer(new StringRedisSerializer());
    55. //为value设置序列化器
    56. template.setValueSerializer(new StringRedisSerializer());
    57. return template;
    58. }
    59. }

    4、操作提示

    1. //通过依赖注入使用redis
    2. @Autowired
    3. private RedisTemplate redisTemplate;
    4. redisTemplate.opsForValue();//操作字符串
    5. redisTemplate.opsForHash();//操作hash
    6. redisTemplate.opsForList();//操作list
    7. redisTemplate.opsForSet();//操作set
    8. redisTemplate.opsForZSet();//操作有序set

    5、RedisBase编码(只包含字符串处理)

    1. package com.item.redis;
    2. import com.item.Base.RedisUrl;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.data.redis.core.RedisTemplate;
    5. import org.springframework.data.redis.core.StringRedisTemplate;
    6. public class RedisBase {
    7. /**
    8. * 返回的是Object
    9. */
    10. @Autowired
    11. private RedisTemplate redisTemplate;
    12. /**
    13. * 返回String
    14. */
    15. @Autowired
    16. private StringRedisTemplate stringRedisTemplate;
    17. /**
    18. * 添加值
    19. * @param key
    20. * @param value
    21. * @return
    22. */
    23. public boolean redisSet(String key,String value){
    24. key= RedisUrl.url+key;
    25. stringRedisTemplate.opsForValue().set(key,value);
    26. String o = stringRedisTemplate.opsForValue().get(key);
    27. return o==null?false:true;
    28. }
    29. /**
    30. * 存储带倒计时的字符串
    31. * @param key
    32. * @param value
    33. * @param second
    34. * @return
    35. */
    36. public boolean redisSetTime(String key,String value,long second){
    37. key= RedisUrl.url+key;
    38. stringRedisTemplate.opsForValue().set(key,value,second);
    39. String s = stringRedisTemplate.opsForValue().get(key);
    40. return s==null?false:true;
    41. }
    42. /**
    43. * 获取key的value
    44. * @param key
    45. * @return
    46. */
    47. public String redisGet(String key){
    48. key= RedisUrl.url+key;
    49. return stringRedisTemplate.opsForValue().get(key);
    50. }
    51. }

    6、创建测试接口【com.item.controller】内

    1. package com.item.controller;
    2. import com.item.model.Users;
    3. import com.item.redis.RedisBase;
    4. import com.item.res.SUCCESS;
    5. import io.swagger.annotations.Api;
    6. import io.swagger.annotations.ApiImplicitParam;
    7. import io.swagger.annotations.ApiImplicitParams;
    8. import io.swagger.annotations.ApiOperation;
    9. import org.springframework.beans.factory.annotation.Autowired;
    10. import org.springframework.data.redis.core.RedisTemplate;
    11. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
    12. import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
    13. import org.springframework.web.bind.annotation.CrossOrigin;
    14. import org.springframework.web.bind.annotation.GetMapping;
    15. import org.springframework.web.bind.annotation.RequestMapping;
    16. import org.springframework.web.bind.annotation.RestController;
    17. @Api("用户操作接口")
    18. @RestController
    19. @CrossOrigin
    20. @RequestMapping("Redis/")
    21. public class RedisController extends RedisBase {
    22. /**
    23. * 测试Redis添加
    24. */
    25. @GetMapping("SetRedis")
    26. @ApiOperation(value = "添加key_value",notes = "没啥留言的")
    27. @ApiImplicitParams({
    28. @ApiImplicitParam(name = "key",required = true,paramType = "query",dataType = "String",value = "redis_key"),
    29. @ApiImplicitParam(name = "value",required = true,paramType = "query",dataType = "String",value = "redis_value")
    30. })
    31. public Object testRedisSet(String key,String value){
    32. redisSet(key,value);
    33. return new SUCCESS("写入成功");
    34. }
    35. /**
    36. * 测试Redis查询
    37. */
    38. @GetMapping("GetRedis")
    39. @ApiOperation(value = "获取key信息",notes = "没啥留言的")
    40. @ApiImplicitParams({
    41. @ApiImplicitParam(name = "key",required = true,paramType = "query",dataType = "String",value = "redis_key")
    42. })
    43. public Object testRedisGet(String key){
    44. return new SUCCESS(redisGet(key));
    45. }
    46. }

    7、编写redis层级【com.item.Base】

    1. package com.item.Base;
    2. public class RedisUrl {
    3. public static final String url="demo:infos:";
    4. }

    8、启动测试http://127.0.0.1:8088/swagger-ui.htm

    能写入,能查询,没问题。 

    我个人喜欢用String和list,自己用自己封装吧。

    https://blog.csdn.net/feng8403000/article/details/125354540
  • 相关阅读:
    py 5.11
    py 5.10
    py 5.9
    py 5.8
    python 5.7
    python 5.4
    python 5.3
    python 5.2
    python 4.28
    python 4.27
  • 原文地址:https://www.cnblogs.com/sunny3158/p/16637076.html
Copyright © 2020-2023  润新知