一、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、上传图片
- 必须是post提交,因为post可以提交二进制;get是地址栏拼接,不能提交二进制;
- 具备file组件;
- 设置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里即可;