最近好几天没有更新了,这次就更新一个大的吧。这次是初识了springboot,跟着视频写了一些小栗子,源码放在下载栏目中了。一共53个小栗子。
下面是对这53个小栗子的总结。
00 这是自己写的一个后台商品查询的小项目。
1.注意干掉test测试
01 创建Springboot工程
02 所有的代码与Application同级或者更低
@Controller
@RequestMapping
@ResponseBody
@Component 把此类交给spring容器进行管理
@Autowired
@Value
@Service 将接口的实现类交给spring容器进行管理。
@Mapper 写在dao接口的头上:扫描DAO接口到spring容器。
03 核心配置文件是 :application.properties
04 核心配置文件也可以是:application.yaml
05 application.properties与application.yaml同时存在:
application.properties更优先。
06 开发、测试、准生产、生产四种环境:4个配置文件+1个主配置文件
想用哪个配置文件,就在主配置文件激活哪一个配置文件。 (基于application.properties)
07 开发、测试、准生产、生产四种环境:4个配置文件+1个主配置文件
想用哪个,就在主配置文件激活。 (基于application.yam)
08 主配置文件中,自定义配置。在其他类中可以使用@Value()获取到主配置文件中自定义的的(***=****)
@Value("${school.name}")
private String schoolName;
09 使用:@ConfigurationProperties(prefix = "abc") 注解,写在实体类的头上,
然后可以在主配置文件中给实体类的属性赋值。
10 jsp与springboot的融合。
jsp:pom文件添加依赖和编译位置选择、主配置文件配置视图解析器。
使用ModelAndView这个类进行页面的跳转。
11 没用
--------------------------------------------------------------------------------------------
12是核心,必须搞明白!!!!
12 使用GeneratorMapper.xml文件进行mybatis的自动生成。
1.mapper文件自动生,包含:mapper文件、dao接口
1.1@Mapper写在dao接口的头上:扫描DAO接口到spring容器
2.model文件自动生成,包含:student实体类
3.service文件,自己写的,包含业务接口、业务接口的实现类
3.1 @Service 写在业务接口实现类的头上
3.2 @Autowired //注入dao接口
private StudentMapper studentMapper;
3.3 经过重重验,发现:上面的studentMapper就是一个mapper文件的代理对象
3.4 所以可以直接调用mapper文件中的方法:studentMapper.selectByPrimaryKey(id)
4.web文件,自己写的,包含:Controller(相当于一个servlet)
4.1在这里可以直接去调用业务接口中的方法。
5.Application:项目的启动文件
至此们终于完全搞明白了,所有了这个模式下的所有的大框架的问题。
无非就是上面的mapper文件,dao接口,model实体类,业务接口,业务接口的实现。
--------------------------------------------------------------------------------------------
13.解决问题:在StudentMapper.xml文件中,传进来的参数,使用的是Integer等封装类型,规避了不等于空的判断。
14.和12一样,但是解决了一个问题:不用在mapper文件下的,每个Mapper接口的头上写@Mapper了
14.1 之前的操作是:通过扫描的方式,将dao接口和其对应的mapper文件写入到spring容器中(最麻烦)
14.2 StudentMapper接口的头上写@Mapper=============(改进)
扫描DAO接口到spring容器
14.3 =====再改进====:在Application.java文件里写这样的注解:
@MapperScan("com.bjpowernode.springboot.mapper")
直接开启扫描Mapper接口的包以及子目录。
14.4面向懒狗编程,越来越轻松了嘿嘿嘿。
--------------------------------------------------------------------------------------------
15.mapper文件的两种存放位置:
15.1直接和dao接口存放在一起,这也是使用GeneratorMapper插件自动生成的样子,
但是呢,编译的时候不能编译进去,所以要在pom文件那里通知:xml文件的编译
<!--手动规定src/main/java下的xml文件夹为resources里的文件
因文resources文件下的文件是能够自动编译,java文件下的文件只能编译.java文件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
15.2把mapper文件,放在resources文件下面(这样不用考虑编译时,不能编译进去)
但是呢,需要在application.properties主配置文件里,指定MyByBatis映射文件的路径:
mybatis.mapper-locations=classpath:mapper/*.xml
--------------------------------------------------------------------------------------------
16.Spring支持事务。使用到的技术是:@Transactional注解。
写在service实现类的方法上面。
--------------------------------------------------------------------------------------------
17.springboot整合springmvc的一些注解
17.1 @Controller +@RequestMapping+ @ResponseBody 返回json对象
=@RestController+@RequestMapping 返回json对象
当实际开发中,控制器返回的都是json格式的数据,就直接使用:@RestController
17.2 复习:@RequestMapping 属性值有两个:value和method。
value:书写的是请求地址
method:书写的是请求的方式-----默认是post、get请求方式均可。
(value = "/queryStudentById",method = {RequestMethod.GET,RequestMethod.POST})
17.3 @RequestMapping的替代品@GetMapping和@PostMapping
例子:@GetMapping(value="/say") 处理器只能接受get请求 查询数据使用
@PostMapping(value="/say") 处理器只能接受post请求 增加数据使用
注意:地址栏发出的请求均是get请求。
17.4@DeleteMapping
例子:@DeleteMapping(value="/say") 处理器只能接受delete请求 删除数据使用
注:不仅仅只是有get和post两种请求方式啊,还有很多种请求方式的。
17.5@PutMapping
作为 @RequestMapping(value = "/say",method = RequestMethod.PUT)的替代品
例子:@PutMapping(value="/say") 处理器只能接受put请求 改数据使用
--------------------------------------------------------------------------------------------
18. RESTful请求风格。
18.1 @PathVariable注解:接受路径形式的请求参数。
@GetMapping(value = "/student/detail/{id}/{age}") //作为RESTful风格,请求路径是写成路劲形式的。
public Object student1(@PathVariable("id") Integer id,
@PathVariable("age") Integer age) {
****
****
}
--------------------------------------------------------------------------------------------
19.springboot集成redis
1.添加redis依赖
2.核心配置文件,配置redis信息
你妈的,必须是要设置一个redis的密码,不然会报一大堆的什么狗屁错误。密码:123456
auth 123456
ok
3.业务接口的实现类要:注入操作redis的模板
@Autowired //关键点:注入操作redis的模板
private RedisTemplate<Object,Object> redisTemplate;
坚持住,后面肯定是不会大规模的用redis的。就这个屌redis的链接,搞了我一个上午。
--------------------------------------------------------------------------------------------
20-21-22整体:spring集成dubbo框架
ch20 interface接口工程(Maven工程)----------------存放实体bean和业务接口
这个所谓的业务接口是:provider暴露出来的业务接口,这个接口的实现是在provider中书写的。
ch21 provider服务提供者(SpringBoot-Web工程)-------业务接口的实现类,将服务暴露并注册到注册中心,调用数据持久层
1.pom文件中: 添加依赖(Dubbo、注册中心、接口工程)
2.主配置文件中:提供者的配置文件
3.//这是把这个接口的实现类交给spring容器去管理
@Component
//这是把provider自己的业务暴露给接口工程,让接口工程统一管理。
@Service(interfaceClass = StudentService.class,version = "1.0.0",timeout = 15000)
//interfaceClass = StudentService.class这是暴露出去的接口的名字。
//timeout = 15000指定接口超时配置
注:有两个@Service
这个@Service是import com.alibaba.dubbo.config.annotation.Service包下面的。
ch22 consumer服务消费者(SpringBoot-Web工程)-------处理浏览器客户端发发送的请求,从注册中心调用服务者提供的请求
1.pom文件中: 添加依赖(Dubbo、注册中心、接口工程)
2.主配置文件中:消费者的配置文件
3.//这是指定,引用的是哪个接口的名字。
@Reference(interfaceClass = StudentService.class,version = "1.0.0",check = false)
private StudentService studentService;
注:有两个@Reference
这个@Reference是import com.alibaba.dubbo.config.annotation.Reference这个包下面的。
尼玛币,一顿集成,眼花缭乱!
现在看来,已经弄明白了。
--------------------------------------------------------------------------------------------
23-24-25整体:spring集成dubbo、redis、mybatis、spring、springmvc、jsp
对比于上面的20 21 22集成dubbo,这里是加入了redis和逆向工程的生成。
ch23:interface接口工程(Maven)存放实体bean和业务接口
ch24: provider服务提供者(实现接口工程以提供服务)---spring web项目,集成mybatis和redis
添加的依赖:mybatis依赖、mysql驱动依赖、dubbo依赖、zookeeper依赖、redis依赖、接口工程
springboot核心
配置文件:配置连接数据库、配置连接redis、配置dubbo
ch25: consumer服务消费者(使用提供者的服务)---spring web项目
添加的依赖:dubbo依赖、zookeeper依赖、解析jsp的依赖、接口工程
springboot核心配置文件:配置视图解析器、配置dubbo
--------------------------------------------------------------------------------------------
26.springboot实现普通java工程第一种(即非web应用)-----了解
27.springboot实现普通java工程第二种(即非web应用)-----了解
实际工作中,不会去创建springboot的java工程的,直接创建一个mavenjava工程好了。
真是麻烦的要死springboot的java工程。
--------------------------------------------------------------------------------------------
28.关闭springboot的启动logo(了解)
29.修改springboot的启动logo(了解)
只需要在resources文件夹下面,直接加上banner.txt文件即可。
--------------------------------------------------------------------------------------------
30. springboot使用拦截器。(有时间还是要研究一下他的原理)
1.定义一个拦截器,实现HandlerInterceptor接口
2.创建一个配置类---在类的头上加上@Configuration,然后继承WebMvcConfigurer
--------------------------------------------------------------------------------------------
31.springboot集成servlet第一种方式(了解)
使用到两个注解:
1.@WebServlet(urlPatterns = "/myservlet")在某类的头上写,注明这是一个servlet
2.在Application主文件中写:表示扫描所有的Servlet包。
@ServletComponentScan(basePackages = "com.bjpowernode.springboot.servlet")
32.springboot集成servlet第二种方式(了解)(通过配置类注册主键的方式)
--------------------------------------------------------------------------------------------
33.springboot集成过滤器第一种方式(注解的方式)
1.在自己写一个过滤器MyFilter类,头上标注:@WebFilter(urlPatterns = "/myfilter") 说明这是一个过滤器。
a. MyFilter类需要继承Filter类 public class MyFilter implements Filter
b. /myfilter:是过滤器的访问路径。
2.在springboot的启动文件中扫描过滤器@ServletComponentScan
@ServletComponentScan(basePackages = "com.bjpowernode.springboot.filter")
34.springboot集成过滤器第二种方式(了解)(通过配置类注册主键的方式)
--------------------------------------------------------------------------------------------
35/36 springboot 设置字符编码的两种方式。
简直了,真是魔鬼啊,没看懂在操作什么。
37.springboot项目打包----war包。Lifecycle-->package即可
部署到tomcat中,之前在核心配置文件application.properties设置的上下文根和端口号失效,以本地tomcat为准
38.springboot项目打包----jar包。Lifecycle-->package即可
端口号和上文的根就是核心配置文件application.properties设置的值
39.springboot的日志开启什么玩意,一套套的,没听懂,以后再说吧。
--------------------------------------------------------------------------------------------
40-49 百叶香 Thymeleaf
40.springboot集成Thymeleaf模板--------初识
1.HTML页面是写在resources包下的templates包里的
2.在HTML页面是需要,写上:命名空间=xmlns:th="http://www.thymeleaf.org"
3.这个地址是一个约束文件,约束你使用thymeleaf表达式的一个规则文件,就好比我们之前在xml文件中的一此dtd文件
4.为什么使用了th前缀就可以获取后台数据?
那是因为项目中添加了thymeleaf的核心依赖,它的核心依赖会去
解析thymeleaf自己定义的这些标签名称,通过thymeleaf自己的java核心
代码来获取我们的后台数据---->即可以直接使用EL表达式了。
41.Thymeleaf:解决40中的问题:修改index页面的代码,每次都需要重新启动springboot,太麻烦烦了。
能不能像以前一样,直接在浏览器刷新静态页面?
答案:可以的?怎么做?1.#主配置文件,设置thymeleaf模版引擎的缓存为false(关闭页面缓存)
2.部署springboot时Edit Configuration时,update resources+update resources
注:Thymeleaf的出现就是为了前后端的分离,各访问各的,这样用户体验好,jsp本质是一个servlet,需要渲染,速度太慢 。
42.Thymeleaf之
标准变量表达式(推荐使用)和*变量表达式(不推荐使用)
1.在HTML中,使用:标准用户变量表达式-----> 用户编号:<span th:text="${user.id}"></span><br/>
2.三种方式拿到后端的数据:1.标准用户变量表达式(推荐使用) 参见:userDetail.html
2.*变量表达式(不推荐使用) 参见:userDetail.html
3. 1、2的混合使用(不推荐使用) 参见:userDetail.html
3.URL路径表达式:@{....}
详见url.html
43.Thymeleaf之
在这里学一招:使用@Data注解:这样就不用写实体类中的那一套东西了
如何使用@Data:1.下载插件:lombok 2.添加lombok的依赖 3.在实体类的头上写@Data
只用在项目组允许的情况下才能好使用这个注解,否则不要轻易使用这个注解。
1.thymeleaf拿到后端的list集合,遍历输出 (list集合放的是user对象)
2.thymeleaf拿到后端的map集合,遍历输出 (map集合放的是键值对,key值Integer类型,value值是user对象)
3.thymeleaf拿到后端的数组,遍历输出 (数组中放的是user对象)
4.thymeleaf拿到后端的复杂集合,遍历输出
44.thymeleaf的条件判断 (很简单的)
if的用法:div中的if语句成立的话,就显示div板里的内容---->男
div中的if语句不成立的话,就不显示div板里的内容
<div th:if="${sex eq 1}">男</div>
unless的用法:和if相反
<div th:unless="${sex ne 1}">女</div>
switch用法
<div th:switch="${productType}">
<span th:case="0">产品0</span>
<span th:case="1">产品1</span>
<span th:case="*">无此产品</span>
</div>
45.thymeleaf中内敛表达式的用法
内敛表达式的作用是:使th表达式不用再依托于标签而写。甚至可以:<body th:inline="text"></body>,一劳永逸
1.内敛表达式
<div th:inline="text"> 在标签里写th:inline="text" 这样标准变量表达式就不用每次依托于标签了
数据:[[${data}]]
</div>
2.内敛脚本 的使用 <script type="text/javascript" th:inline="javascript">
java script代码
</script>
详情请见:045中的inline-test.html
46.Thymeleaf之
1.字面量?感觉不是很重要的知识点。
2.字符串的拼接。
传统的方式
<span th:text="'共'+${totalRows}+'条'+${totalPage}+'页,当前第'+${currentPage}+'页,首页 上一页 下一页 尾页'">共120条12页,当前第1页,首页 上一页 下一页 尾页</span>
新方式: |要拼接的字符串内容|
<span th:text="|共${totalRows}条${totalPage}页,当前第${currentPage}页,首页 上一页 下一页 尾页|">共120条12页,当前第1页,首页 上一页 下一页 尾页</span>
47.Thymeleaf之:数学运算
48.Thymeleaf之:基本内置对象(掌握)
#request #session #httpServletRequest等
49.Thymeleaf之:功能内置对象(了解)
#dates #calendars #numbers #strings #bools #arrays等:#开头,s结尾功能内置对象
<span th:text="${#dates.format(curDate, 'yyyy-MM-dd HH:mm:ss')}"></span>
--------------------------------------------------------------------------------------------
50 51 52 53 整体。综合案例。springboot 集合mysql redis zookeeper dubbo
50.父工程(是管理下面的三个子模块的)
50.1 父工程:src干掉
50.2 <packaging>pom</packaging> <!--作为父工程,这是必须加上的一句话-->
51.接口工程(儿子) 暴露的业务接口、实体类
52.提供者工程(儿子)
53.消费者工程(儿子)
--------------------------------------------------------------------------------------------
结束了终于,下一阶段是解决Nginx。