html+css+jquery+框架:视图,框架不熟练,css不好
javaWeb:独立开发MVC三层架构的网站:原始
SSM:框架:简化了我们的开发流程,配置也开始较为复杂
war:tomcat运行
spring再简化:SpringBoot-jar;内嵌tomcat;微服务架构!
服务越来越多:springcloud
Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。
为了降低Java开发的复杂性,Spring采用了以下4种关键策略:
1、基于POJO的轻量级和最小侵入性编程,所有东西都是bean;
2、通过IOC,依赖注入(DI)和面向接口实现松耦合;
4、通过切面和模版减少样式代码,RedisTemplate,xxxTemplate;
所谓单体应用架构(allinone)是指,我们将一个应用中的所有应用服务都封装在一个应用中。
无论ERP,CRM或是其他什么系统,你都把数据库访问,web访问,等等各个都放到一个war中
allinone的架构方式,我们把所有的功能单元放在一个应用里面。然后我们把整个应用部署到服务器上。如果负载能力不行,我们将整个应用进行水平复制,进行扩展,然后在负载均衡。
这样做的好处是
官方:提供了一个快速生成的网站!IDEA集成了这个网站!
使用spring-boot-devtools,可以实现指定目录(默认为classpath路径)下的文件进行更改后,项目自动重启,更改后的代码自动生效。
Banner.txt修改启动图
自动配置
pom.xml
启动器
//程序的主入口//@SpringBootApplication:标注这个类是一个springboot的应用@SpringBootApplicationpublicclassSpringbootApplication{//将springboot应用启动publicstaticvoidmain(String[]args){SpringApplication.run(SpringbootApplication.class,args);}} 注解
@SpringBootConfiguration:springboot的配置 @Configuration:spring配置类 @Component:说明这也是个spring组件@EnableAutoConfiguration:自动配置AutoConfigurationPackage:自动配置包 @Import(AutoConfigurationPackages.Registrar.class):自动配`包注册`@Import(AutoConfigurationImportSelector.class):自动导入选择器//获取所有的配置List
protectedList
Propertiesproperties=PropertiesLoaderUtils.loadProperties(resource);所有资源加载到配置类中结论:springboot所有自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应启动器了,有了启动器,我们自动装配就会生效,然后配置成功了
SpringApplication.run分析
分析该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;
这个类主要做了以下四件事情:
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器,设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
SpringBoot使用一个全局的配置文件,配置文件名称是固定的
application.properties
application.yml
配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
比如我们可以在配置文件中修改Tomcat默认启动的端口号!测试一下!
server.port=8081yaml概述YAML是"YAMLAin'taMarkupLanguage"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML的意思其实是:"YetAnotherMarkupLanguage"(仍是一种标记语言)
这种语言以数据作为中心,而不是以标记语言为重点!
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
传统xml配置:
server: prot:8080yaml基础语法说明:语法要求严格!
1、空格不能省略
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
3、属性和值的大小写都是十分敏感的。
字面量:普通的值[数字,布尔值,字符串]
字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号;
k:v注意:
“”双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思;
比如:name:"kuang\nshen"输出:kuang换行shen
''单引号,会转义特殊字符,特殊字符最终会变成和普通字符一样输出
比如:name:‘kuang\nshen’输出:kuang\nshen
对象、Map(键值对)
#对象、Map格式k: v1: v2:在下一行来写对象的属性和值得关系,注意缩进;比如:
student: name:qinjiang age:3行内写法
student:{name:qinjiang,age:3}数组(List、set)
用-值表示数组中的一个元素,比如:
pets: -cat -dog -pig行内写法
pets:[cat,dog,pig]修改SpringBoot的默认端口号
配置文件中添加,端口号的参数,就可以切换端口;
server: port:808yaml可以给实体类赋值1、在springboot项目中的resources目录下新建一个文件application.yml
2、编写一个实体类Dog;
packagecom.kuang.springboot.pojo;@Component//注册bean到容器中publicclassDog{ privateStringname; privateIntegerage;//有参无参构造、get、set方法、toString()方法}3、思考,我们原来是如何给bean注入属性值的!@Value,给狗狗类测试一下:
@Component//注册beanpublicclassDog{ @Value("阿黄") privateStringname; @Value("18") privateIntegerage;}4、在SpringBoot的测试类下注入狗狗输出一下;
@SpringBootTestclassDemoApplicationTests{@Autowired//将狗狗自动注入进来Dogdog;@TestpublicvoidcontextLoads(){ System.out.println(dog);//打印看下狗狗对象}}结果成功输出,@Value注入成功,这是我们原来的办法对吧。
5、我们在编写一个复杂一点的实体类:Person类
@Component//注册bean到容器中publicclassPerson{ privateStringname; privateIntegerage; privateBooleanhappy; privateDatebirth; privateMap
person:name:qinjiangage:3happy:falsebirth:2000/01/01maps:{k1:v1,k2:v2}lists:-code-girl-musicdog:name:旺财age:17、我们刚才已经把person这个对象的所有值都写好了,我们现在来注入到我们的类中!
@SpringBootTestclassDemoApplicationTests{@AutowiredPersonperson;//将person自动注入进来@TestpublicvoidcontextLoads(){System.out.println(person);//打印person信息}}结果:所有值全部注入成功!
yaml配置注入到实体类完全OK!
课堂测试:
1、将配置文件的key值和属性的值设置为不一样,则结果输出为null,注入失败
2、在配置一个person2,然后将@ConfigurationProperties(prefix="person2")指向我们的person2;
@PropertySource:加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;
1、我们去在resources目录下新建一个person.properties文件
name=kuangshen2、然后在我们的代码中指定加载person.properties文件
@PropertySource(value="classpath:person.properties")@Component//注册beanpublicclassPerson{@Value("${name}")privateStringname;......}3、再次输出测试一下:指定配置文件绑定成功!
配置文件还可以编写占位符生成随机数
person:name:qinjiang${random.uuid}#随机uuidage:${random.int}#随机inthappy:falsebirth:2000/01/01maps:{k1:v1,k2:v2}lists:-code-girl-musicdog:name:${person.hello:other}_旺财age:1回顾properties配置我们上面采用的yaml方法都是最简单的方式,开发中最常用的;也是springboot所推荐的!那我们来唠唠其他的实现方式,道理都是相同的;写还是那样写;配置文件除了yml还有我们之前常用的properties,我们没有讲,我们来唠唠!
【注意】properties配置文件在写中文的时候,会有乱码,我们需要去IDEA中设置编码格式为UTF-8;
settings-->FileEncodings中配置;
测试步骤:
1、新建一个实体类User
@Component//注册beanpublicclassUser{privateStringname;privateintage;privateStringsex;}2、编辑配置文件user.properties
user1.name=kuangshenuser1.age=18user1.sex=男3、我们在User类上使用@Value来进行注入!
@Component//注册bean@PropertySource(value="classpath:user.properties")publicclassUser{//直接使用@value@Value("${user.name}")//从配置文件中取值privateStringname;@Value("#{9*2}")//#{SPEL}Spring表达式privateintage;@Value("男")//字面量privateStringsex;}4、Springboot测试
@SpringBootTestclassDemoApplicationTests{@AutowiredUseruser;@TestpublicvoidcontextLoads(){ System.out.println(user);}}结果正常输出:
@Value这个使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦;我们来看个功能对比图
1、@ConfigurationProperties只需要写一次即可,@Value则需要每个字段都添加
2、松散绑定:这个什么意思呢比如我的yml中写的last-name,这个和lastName是一样的,-后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下
3、JSR303数据校验,这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性
4、复杂类型封装,yml中可以封装对象,使用value就不支持
结论:
配置yml和配置properties都可以获取到值,强烈推荐yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式;
使用数据校验,可以保证数据的正确性;
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;
多配置文件
我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml,用来指定多个环境版本;
例如:
application-test.properties代表测试环境配置
application-dev.properties代表开发环境配置
但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
我们需要通过一个配置来选择需要激活的环境:
#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;#我们启动SpringBoot,就可以看到已经切换到dev下的配置了;spring.profiles.active=dev六、SpringBoot配置6.1、配置文件加载位置外部加载配置文件的方式十分多,我们选择最常用的即可,在开发的资源文件中进行配置!
官方外部配置文件说明参考文档
springboot启动会扫描以下位置的application.properties或者application.yml文件作为Springboot的默认配置文件:
优先级1:项目路径下的config文件夹配置文件优先级2:项目路径下配置文件优先级3:资源路径下的config文件夹配置文件优先级4:资源路径下配置文件优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;
一但这个配置类生效;这个配置类就会给容器中添加各种组件;
这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;
配置文件能配置什么就可以参照某个功能对应的这个属性类
1、SpringBoot启动会加载大量的自动配置类
2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
xxxxAutoConfigurartion:自动配置类;给容器中添加组件
那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。
我们怎么知道哪些自动配置类生效?
我们可以通过启用debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;
jar:webapp
自动装配
SpringBoot到底帮我们配置了什么?我们能不能修改?能修改哪些东西?能不能扩展?
要解决问题:
系统默认可以放在以下位置,自定义后会失效
"classpath:/META-INF/resources/"====>通过webjars实现"classpath:/resources/""classpath:/resources/static/""classpath:/resources/public/"首页定制"classpath:/resources/static/""classpath:/resources/public/"模版引擎Thymeleaf导入包
练习测试:
1、我们编写一个Controller,放一些数据
@RequestMapping("/t2")publicStringtest2(MapHello
");map.put("users",Arrays.asList("qinjiang","kuangshen"));//classpath:/templates/test.htmlreturn"test";}2、测试页面取出数据
importjava.util.Locale;@ConfigurationpublicclassMyMvcConfigimplementsWebMvcConfigurer{//ViewResolver:实现了视图解析器接口的类,我们就可以把它看作视图解析器@BeanpublicViewResolvermyViewResolve(){returnnewMyViewResolve();}//自定义了一个自己的视图解析器的静态内部类MyViewResolvepublicstaticclassMyViewResolveimplementsViewResolver{@OverridepublicViewresolveViewName(StringviewName,Localelocale)throwsException{returnnull;}}具体实现:
//如果我们要扩展springmvc,官方建议我们这样去做!@ConfigurationpublicclassMyMvcConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddViewControllers(ViewControllerRegistryregistry){registry.addViewController("test1").setViewName("test");}}自定义的配置日期格式化
#自定义的配置日期格式化spring:mvc:format:date-time:yyyy-MM-ddHH:mm:ss小demo
==============================================
配置yaml:
spring:datasource:username:rootpassword:root1@12url:jdbc:mysql://localhost:3306/mybatisuseUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTCdriver-class-name:com.mysql.cj.jdbc.Drivertest测试:
@AutowiredDataSourcedataSource;@TestvoidcontextLoads()throwsSQLException{//查看一下默认的数据源:classcom.zaxxer.hikari.HikariDataSourceSystem.out.println(dataSource.getClass());//获得数据库的连接Connectionconnection=dataSource.getConnection();System.out.println(connection);//xxxxTemplate:SpringBoot已经配置好模版bean,拿来即用CURD//关闭数据库的连接connection.close();}使用template查询数据库多的user表的所有数据
@RestControllerpublicclassJDBCController{@AutowiredJdbcTemplatejdbcTemplate;//查询数据库的所有信息@GetMapping("userlist")publicList
配置Druid监控页面
spring:datasource:username:rootpassword:root1@12url:jdbc:mysql://localhost:3306/mybatisuseUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTCdriver-class-name:com.mysql.cj.jdbc.Driver#指定数据源type:com.alibaba.druid.pool.DruidDataSource#数据源其他配置druid:#SpringBoot默认是不注入这些的,需要自己绑定#druid数据源专有配置initialSize:5minIdle:5maxActive:20maxWait:60000timeBetweenEvictionRunsMillis:60000minEvictableIdleTimeMillis:300000validationQuery:SELECT1FROMDUALtestWhileIdle:truetestOnBorrow:falsetestOnReturn:falsepoolPreparedStatements:true#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入#如果允许报错,java.lang.ClassNotFoundException:org.apache.Log4j.Properity#则导入log4j依赖就行filters:stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize:20useGlobalDataSourceStat:trueconnectionProperties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500写一个JDBC的请求
@RestControllerpublicclassJDBCController{@AutowiredJdbcTemplatejdbcTemplate;//查询数据库的所有信息@GetMapping("userlist")publicList
导入包
spring:datasource:username:rootpassword:root1@12url:jdbc:mysql://localhost:3306/mybatisuseUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTCdriver-class-name:com.mysql.cj.jdbc.Driver##整合mybatismybatis:type-aliases-package:com.pojomapper-locations:classpath:mybatis/mapper/*.xml写入实体类
@Data@AllArgsConstructor@NoArgsConstructorpublicclassUser{privateintid;privateStringname;privateStringpwd;}写一个mapper接口
packagecom.mapper;importcom.pojo.User;importorg.apache.ibatis.annotations.Mapper;importorg.springframework.stereotype.Repository;importjava.util.List;//这个注解表示了这是一个mybatis的mapper类@Mapper@RepositorypublicinterfaceUserMapper{List
在web开发中,安全第一位!过滤器,拦截器~
功能性需求:否
做网站:安全应该在什么时候考虑设计?设计之初!
shiro、SpringSecurity:两个很像,除了类不一样,名字不一样
AOP:横切~配置类
简介
SpringSecurity是针对Spring项目的安全框架,也是SpringBoot底层安全模块默认的技术选型,它可以实现强大的Web安全控制,对于我们安全控制,我们仅需要引入pring-boot-starter-security模块,进行少量的配置,即可实现强大的安全管理
‘’认证“(Authentication)
这个概念是通用的,而不是只在SpringSecurity种存在
测试:
开启无权限的模块屏蔽以及用户名的展示
导入thymeleaf-extras-springsecurity5
Quickstart核心:
add