Spring Boot基础学习

版权声明:著作权归作者所有,未经作者同意不得转载。 https://blog.csdn.net/qq_33417321/article/details/83098210

一、spring boot基础

1、不能直接访问html

需要通过访问controller来访问html页面

在这里插入图片描述

2、spring boot配置文件

第一种: application.properties

spring.datasource.url=jdbc:mysql://192.168.237.130:3306/mysql?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#配置.xml文件路径
#mybatis.config-locations=classpath:/mybatis/mybatis-config.xml
#mybatis.mapper-locations=classpath:/com/maltose/demo/dao/*.xml
#配置模型路径
#mybatis.type-aliases-package=com.yang.springbootDemo.model

#自定义jsp目录
#spring.mvc.view.prefix=/WEB-INF/jsp/
#配置后缀
#spring.mvc.view.suffix=jsp

#修改tomcat访问端口
server.port=80

#开启调试模式,启动时会有很多日志,开发时打开,上线后关闭
debug=true

#应用上下文,一个tomcat部署多个项目时上下文就有用了;如果一个tomcat有三个项目,启动时访问/时会有冲突,在这里给每个项目配上各自访问的前缀就不会有冲突了;
#一般情况下小应用都是在一个tomcat下部署多个webapp,通过这里的上下文来区分;
#在集群或大中型项目里,通常一个tomcat只对应一个webapp,通过不同的端口来区分;
server.servlet.context-path=/myspringboot

#utf-8只包含了2000+个中文字符,对于生僻字显示不了
spring.http.encoding.charset=UTF-8

#关闭thymeleaf缓存(开启热部署),默认有缓存,页面不会自己刷新;注意,需要将idea的自动编译勾上后,这里才起作用
spring.thymeleaf.catch=false

#规定日期格式
spring.mvc.date-format=yyyy-MM-dd
#北京与伦敦有8小时时差,这样设置的话才会显示正确的北京时间
spring.jackson.time-zone=GMT+8
#最后是毫秒
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss SSS

第二种 application.ylm

debug: true  #冒号后有空格

server:
 port: 80  #最前边和冒号后都有一个空格
 
 #idea对yml有良好支持且可以自动生成,在下边敲charset就会有提示,自动生成下边的代码;
spring:
  http:
    encoding:
      charset: UTF-8
 # idea对于前缀相同的配置会自动归类

如果application.properties与application.yml文件同时存在的话,会默认以application.properties为准;

3、springboot日志配置

1、对于线上的系统,日志是唯一查找问题的手段;
2、springboot使用的是SLF4J与LogBack来记录日志的;
3、log4j与LogBack是同一个作者,LogBack比较新;
4、配置项有如下4个(在application.properties里配置日志)

1、logging.file=d:/logs/my.log #日志输出目录;默认只在控制台打印,不输出日志文件;
   日志级别从低到高  debug--info--warn--error,springboot默认是info级别的
2、logging.level.ROOT=ERROR   #ROOT代表默认全局设置(此时日志没错的话就看不到任何日志)
   logging.level.org.springframwork=ERROR #设置指定包的日志级别(把包的前缀写好就行)
3、logging.level.*
4、logging.config
当系统的访问量大时,需要分析日志,就需要将日志下载下来并按某种规定分成许多文件(不可能所有的日志都在一个文件里),springboot做不到,它推荐我们使用自定义的方式来解决;
即在resource目录下新建logback..xml文件,此时就可以将application.properties里有关日志的配置都删除(只要有logback.xml,则application.properties里关于日志的配置就会失效);logback.xml可以百度搜索;

4、Banner的设置

当系统启动的时候,控制台最上边会默认显示很大的"Spring"样式的字符,我们可以对其进行自定义显示设置

 在resource目录下新建banner.txt文件,在里边输入自定义显示的内容即可

也可以设置不显示banner,在入口类里修改代码如下:

在这里插入图片描述

5、环境文件配置

当开发环境、测试环境、生产环境等等配置不一样时,修改会很麻烦,springboot提供了可以随时切换环境的功能;不同环境的配置文件命名规则是application-{env}.yml

新建application-dev.yml(即开发环境的配置)如下:

debug: false
server:
  port: 8080
  servlet:
    context-path: /
spring:
  banner:
    charset: UTF-8
  thymeleaf:
    cache: false
  mvc:
    date-format: yyyy-MM-dd
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/musql
    username: root
    password: root

新建application-prd.yml(即生产环境的配置)如下:

debug: false
server:
  port: 8888
  servlet:
    context-path: /
spring:
  banner:
    charset: UTF-8
  thymeleaf:
    cache: false
  mvc:
    date-format: yyyy-MM-dd
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://l52.168.1.23:4346/musql
    username: root123
    password: root345

在application.yml里指定使用上边哪个环境

spring:
  profiles:
    active: dev  #指定使用开发环境

如果application.yml与application-dev.yml里有相同的配置项的话,以application-dev.yml为准;所以,多个环境有相同的配置的话就放在application.yml里,不一样的配置就放在各个环境的配置项里;

同理,对于logback.xml,开发与生产环境不一样时(比如日志保存目录要变),也可以进行切换;将logback.xml名字修改为logback-spring.xml,然后在configuration节点下编辑如下:

<springProfile name="dev">
        <property name="LOG_HOME" value="d:/log/dev/" />
</springProfile>
<springProfile name="prd">
        <!--生产环境一般是linux目录-->
        <property name="LOG_HOME" value="d:/log/prd/" />
</springProfile>

在这里插入图片描述

6、springboot自定义配置

有两种自定义配置方式
方式一、@Value单个属性注入
新建config.properties(文件名自定义即可)文件,由于idea对于properties文件里中文支持不是很好,所以需要对idea进行设置

config.properties:

app.name=麦芽糖
app.version=1.0.0
app.description=这是个好公司
app.page-size=20
app.show-advert=true
app.website=http://www.maltose.com

在入口类加载上边的文件:

@SpringBootApplication
//在入口类加载自定义的config.properties文件
@PropertySource("classpath:config.properties")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

在类里使用该自定义注解

@Controller
public class MyTestController {
    @Value("${app.name}")
    private String name;//此时,name值就是 "麦芽糖"
    @Value("${app.page-size}")
    private Integer pageSize;//此时,pageSize值就是 "20"
}

方式二、@ConfigurationProperties
新建实体类:

@Component//这是一个组件类,写上这个注解,springBoot会在启动时加载这个类
@ConfigurationProperties(prefix = "app")//将配置文件里所有app前缀的属性值自动赋值给该类里的bean属性
public class AppConfig {
    private String name;
    private Integer pageSize;
    private String webSite;
    //get、set方法....

config.properties:

app.name=麦芽糖
app.version=1.0.0
app.description=这是个好公司
app.page-size=20
app.show-advert=true
app.website=http://www.maltose.com

使用自定义注解:

@Controller
public class MyTestController {
    @Resource //动态注入IOC容器中匹配的Bean,也可以使用AutoWired
    private AppConfig appconfig;//此时,该对象里就有值了
}

7、默认模版引擎Thymeleaf

例如jsp/freemarker就是一个模版引擎,让页面与数据进行分离;
Thymeleaf是主流模版里唯一前后通用的模版引擎,也是官方推荐的模版;
Thymeleaf缺点:必须符合xml格式;特别慢;
案例:前端给了一个静态的html引擎,我们来使用Thymeleaf进行修改,使得html模版里的值是动态的
页面:
在这里插入图片描述
修改要求:
在这里插入图片描述
新建message.properties文件:
在这里插入图片描述

代码修改如下:
在这里插入图片描述
将页面里列表的标题设置为动态的:
在这里插入图片描述

将超链接设置为动态的:
在这里插入图片描述

对显示列表进行动态查数据库后显示
在这里插入图片描述
后台逻辑:
在这里插入图片描述
html里#与$的选取:

#{}用来读取常量,即配置文件里的内容;
${}用来读取变量,即程序里的内容;

将姓名列的字母变为小写:
在这里插入图片描述

部门显示中文:
在这里插入图片描述

重点标出某一职位,如重点显示经理所在行,设置css背景色

在这里插入图片描述

在这里插入图片描述

对日期进行自定义显示格式:
在这里插入图片描述

对工资大于1500员工的工资标红:
在这里插入图片描述

奖金列,没有奖金的话显示N/A:
在这里插入图片描述

当多个页面有公用的模块时,将公用部分抽取出来做成模版:
在这里插入图片描述

引用上边的模版:
在这里插入图片描述

8、springBoot注解

@ControllerAdvice注解用于全局处理 Controller 层异常;


import com.maltose.demo.pojo.ResponseData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author sgw
 * @date 20181104
 * @deprecated 统一异常处理
 */
//该注解用于处理全局异常
@ControllerAdvice
public class GlobalExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    //抛出的 Exception 及其子类的异常,这是最基本的用法了。
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseData defaultHandler (HttpServletRequest req, Exception e) throws Exception{
        logger.error("", e);
        ResponseData rd = new ResponseData();
        rd.setMessage(e.getMessage());
        if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {
            rd.setCode(404);
        } else {
            rd.setCode(500);
        }
        rd.setData(null);
        rd.setStatus(false);
        return rd;
    }
}

二、SpringBoot WEB开发

1、入门小案例

在这里插入图片描述

在这里插入图片描述

2、部门做下拉选
显示效果:
在这里插入图片描述
ajax:
在这里插入图片描述
controller:
在这里插入图片描述
3、选择部门后,岗位的选项会相应的改变--------二级联动
controller:
在这里插入图片描述
ajax:
在这里插入图片描述

4、上传图片

  1. 必须是post提交,因为post可以提交二进制;get是地址栏拼接,不能提交二进制;
  2. 具备file组件;
  3. 设置form的encType的值是"multipart/form-data";
    form:
    在这里插入图片描述
    在这里插入图片描述

controller接收文件:
在这里插入图片描述

默认单个文件最大不得超过1M,一个请求(可能有多个文件)最大不能超过10M,这些默认值是可以在application.properties里进行设置的;设置最大值是为了防止恶意攻击;如果上传文件超过最大值的话,tomcat等web容器就会直接截断请求;
在这里插入图片描述

5、获取form表单数据
先在配置文件里将日期格式化,不然前端的日期映射不到javaBean里
在这里插入图片描述
前端:
在这里插入图片描述
controller:
在这里插入图片描述

6、404与500错误页面
在templater下新建error目录(名字是固定的),在error目录下新建500.html,在这个html里引入自己写好的错误图片进行展示即可
在这里插入图片描述

同理,在error目录下新建404.html…
7、注册Filter
过滤器用来对请求进行过滤和拦截,之前的SSM需要在web.xml里注册过滤器,springBoot没有web.xml;这样可以进行用户行为分析,比如多少人通过手机访问,多少人通过PC访问,每个地区有多少人访问等等;
SpringBoot在入口类里进行Filter的注册:

@SpringBootApplication
//在入口类加载自定义的config.properties文件
@PropertySource("classpath:config.properties")
public class DemoApplication {
    //注册过滤器
    @Bean  //会将方法里的返回对象在SpringBoot启动时放入IOC容器
    public FilterRegistrationBean filterRegiste(){
        FilterRegistrationBean register=new FilterRegistrationBean();
        //创建并注册AccessRecorderFilter
        register.setFilter(new AccessRecorderFilter());
        //拦截所有请求
        register.addUrlPatterns("/*");
        //过滤器名字
        register.setName("AccessRecorder");
          //设置排序;系统中有多个过滤器的话,这里决定哪个过滤器先执行,数字越小越先执行
        register.setOrder(1);
        return register;
    }
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

自定义过滤器:

public class AccessRecorderFilter implements Filter {
    private Logger logger= LoggerFactory.getLogger(AccessRecorderFilter.class);
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest)servletRequest;
        String uri = request.getRequestURI();
        //静态资源过来的访问不进行统计
        if (uri.endsWith(".css")|| uri.endsWith(".js")||uri.endsWith(".jpg")){
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }
        //获得客户端信息(pc/安装/iphone。。。)
        String ua = request.getHeader("user-agent");
        //ip可能不准确(用户挂VPN时ip是不准确的)
        String ip = request.getRemoteAddr();

        Long st=new Date().getTime();
        //请求向后处理
        filterChain.doFilter(servletRequest,servletResponse);
        Long et=new Date().getTime();

        logger.info("uri:{},ip:{},time:{},ua:{}",uri,ip,(et-st),uri,ua);
    }
    @Override
    public void destroy() {
    }
}

8、SpringBoot替换掉默认内嵌的tomcat
在这里插入图片描述

在pom.xml里将tomcat删除
在pom.xml空白处右键选择"maven–ShowDependencies",找到"spring-boot-starter-tomcat",右键点击Exclude移除即可;

添加jetty服务器:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jetty</artifactId>
 </dependency>

或添加undertow服务器:

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-undertow</artifactId>
 </dependency>

三、SpringData与JPA

简介:springData是简化了和数据库的交互,例如封装了jdbc、MongoDB、redis、solor等;针对不同的数据库,提供统一便捷的开发方式;其中,SpringData最重要的模块就是JPA,即java持久化API,JPA是一个规范,由使用它的框架具体实现,例如Hibernate就使用的是JPA规范;
1、搭建JPA环境:
在idea新建SpringBoot项目时,勾选JPA,此时就会自动引入Hibernate核心包
在这里插入图片描述
配置显示SQl:
在这里插入图片描述
2、CRUD
新建实体类,与数据库里的表进行一一映射
在这里插入图片描述
创建接口:
在这里插入图片描述
测试:
先将接口注入进来:
在这里插入图片描述
查询:
在这里插入图片描述
新增:
在这里插入图片描述
更新:
在这里插入图片描述
删除:
在这里插入图片描述

3、JPA查询

在这里插入图片描述

当sql语句复杂时,上边的JPA显然不适合,此时使用JPQL来实现
在这里插入图片描述
JPQL复杂查询:
在这里插入图片描述

4、对象关系映射(实现多表操作)
在这里插入图片描述
此时就可以做查询了(不需要再Dept表写一的一方);

在Dept关联Emp,但是这种一的一方一般不写:
在这里插入图片描述

5、连接池与Druid
连接池:在项目启动时,对于操作数据库进行预加载;用的时候拿走,不用时还回来;其中Druid是阿里开发的最好的连接池;
在pom里增加对druid引用:

<!-- druid连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.31</version>
</dependency>

在入口类里加载连接池:
在这里插入图片描述
在application.properties里进行连接池配置:
在这里插入图片描述
上边就可以使用Druid连接池了;

开启Druid监控:
开启监控后,可以在web页面查看当前应用与数据库连接的一些参数,这是其他连接池不具备的功能;
SpringBoot入口类:
图片里没显示全的信息如下:

ServletRegistrationBean bean=new ServletRegistrationBean(new StatViewServlet(),"/druid/*");

在这里插入图片描述

在入口类里加如下方法:
在这里插入图片描述
此时,访问localhost/druid即可看到连接数据库的信息了

6、事物配置(加一个注解即可,必须为public方法才行,不要捕捉异常,要让异常自动抛出,否则不能进行事务回滚。)
在这里插入图片描述
上边的注解只会对RuntimeExcuption及其子类异常时会回滚,但是其它异常不会回滚;可以这样写,让所有异常都回滚:
在这里插入图片描述
不开启事物的写法:
在这里插入图片描述

一般情况,事物注解写到核心的Service上;

四、SpringBoot整合MyBaties

1、整合步骤
pom里引入相关依赖
在这里插入图片描述

application.properties配置文件
在这里插入图片描述
mybaties-config.xml:
在这里插入图片描述

接口与对应的mapper.xml:
在这里插入图片描述

在启动入口类里配置扫描mapper所在的包:
在这里插入图片描述

五、热部署、打包、发布

1、热部署
热部署前提是要用debug模式启动;
第一步、在配置文件里关闭缓存:
在这里插入图片描述

第二步、在pom里引入官方提供的自动热部署工具
在这里插入图片描述
第三步、修改idea设置(eclipse不用设置第三步)
在这里插入图片描述

2、jar包的打包与发布(之前是war包,springBoot是jar包)
打包步骤:
第一步、
在这里插入图片描述

第二步、
在这里插入图片描述
第三步、
在这里插入图片描述
第四步、
此时这里多了一个选项:
在这里插入图片描述
勾选上边的包,点击运行:
在这里插入图片描述
生产jar文件:
在这里插入图片描述
找到这个jar包,将其上传到linux,执行如下命令进行发布:
java -jar aaaa.jar;
此时xshell关闭后(或ctrl+C终止),程序就停了,我们来让其在后台运行:

nohup  java -jar aaa.jar   >> myout.log  &

关闭后台运行的jar程序:

netstat  -tulpn  #找到8080端口的进程号,使用kill -9  进程号 杀死即可 

3、war包打包发布
springBoot默认打jar包,但是也可以打war包;
第一步、把pom里的打包类型换为war
在这里插入图片描述
第二步、在pom里配置,在打包时不加载内嵌的tomcat
在这里插入图片描述

第三步、原有入口类失效
在这里插入图片描述

打包过程与上边一样,将生成的war包放入tomcat里即可;

猜你喜欢

转载自blog.csdn.net/qq_33417321/article/details/83098210