从0开始学spring boot

413 阅读4分钟

项目的git地址:https://gitee.com/wlh520/taco

thymeleaf spring:https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html

spring boot guides:http://spring.io/guides

可学习功能的网站:https://www.hifreud.com/categories/#Spring-Boot-ref

spirng 数据库注释搜索文档:https://docs.oracle.com/javaee/7/api/overview-summary.html(Google + 搜索的包名也可以)

关闭8080: https://www.cnblogs.com/thankyouGod/p/6506380.html

spring 1 初始化项目

IDEA Spring Initializr Core -> Devtoolds Lombok; Web -> Web; Template Engines -> Thymeleaf

中间有一步初始化化选择从url的网站中获取初始化

  • mvnw mvnw.cmd:构建项目(不太了解)
  • pom.xml: maven 构建说明书(开始包含了我们选择的内容)packaging>jar</packaging jar适合云服务器,jar 可被jvm直接使用 ,jar中除了class文件还可以包括一些资源和配置文件,通常一个jar包就是一个java程序或者一个java库.war:Web application Archive(档案文件),与jar基本相同,但它通常表示这是一个Java的Web应用程序的包,tomcat这种Servlet容器会认出war包并自动部署。<parent 未指定Spring Boot版本的将用这个版本。starter 依赖1.集合了需要的依赖2.不需关注依赖包的版本,只要关注spring boot的版本。maven-plugin:1.保证了所有依赖包含在可执行的jar中,并且运行时路径是可用的。2.提供了jar的引导文件(TacoWlhApplication)
  • TacoWlhApplication.java:引导工程启动 @SpringBootApplication 代表这是spring boot 应用,由3个其他的注解组成:@SpringBootConfiguration(@Configuration):添加spring框架的配置。@EnableAutoConfiguration:告诉spring boot自动配置需要的组件。@ComponentScan:启动组件扫描:定义类用注释( @Component, @Controller, @Service,...)spring会自动发现和注册为组件在spring的应用环境中。main()创建spring应用环境
  • application.properties: 项目配置文件(开始为空)
  • static:服务浏览时候的东西(images, stylesheets, Javascript)
  • templates: 网页,渲染的内容到浏览器上
  • TacoWlhApplicationTests.java: 开始为保证我们的spring context 能正常启动。@RunWith JUnit 注释,提供测试运行者(SpringRunner 别名 SpringJUnit4ClassRunner)指导JUnit 运行个测试(看编译器旁有个运行图标)。 @SpringBootTest 引导测试用spring boot 的能力(类似于调用SpringApplication.run() 在 main()方法中)。

任务:显示个手抓饼的图片的网页,写个单元测试测试这个页面

spring 2 模板tymeleaf

任务:模板数据展示,验证提交数据。

/design: 设计taco页面 功能介绍:展示数据,验证数据错误后保存填入的信息,上方显示对应的错误信息

/orders/current: 设计taco成功后的跳转页面 功能介绍:验证复杂数据

spring 3 内置数据库JDBC h2 JPA

JDBC H2

设计为多对多的是用个关联表来记录,一对多的*多的存ID(文章可以有很多评论,评论里存文章的ID),一对一的互相存id;这个项目统一了关联的都存关联表(数据量较小不考虑效率问题)。对象表需要ID给关联表,关联表不需要ID。

  • Taco_Ingredients(关联表,无ID): taco 手抓饼的ID ingredient 手抓饼原料的ID 维护Taco关联Ingredient(各个对象独立存储没关联)
  • Taco: 手抓饼的ID,name, createdAt
  • Taco_Order:
  • Taco_Order_Tacos(关联表,无ID):Taco_Order id, Taco(id)

H2:

1.http://localhost:8080/h2-console 查看h2控制台。2.h2数据库为临时性数据库,服务器关闭后数据就没了

  • 默认的应用生成的JDBC URL: jdbc:h2:mem:testdb 控制台地址:http://localhost:8080/h2-console/login.jsp

JDBC

schema.sql 在src/main/resources下:应用启动的时候会运行

任务

/design: 提交的时候保存到h2数据库中(设计 保存taco.name, 到Taco表中用插入保存,保存前生成下时间。保存taco.ingredient(其实就是ingredient.id)和关联的taco.id到关联表Taco_Ingredients)

/orders 提交的手抓饼订单,保存用map来存

bug记录

有个bug没解决在/design页面中order.name 会在添加了taco.name的时候变成 taco.name的东西 (https://my.oschina.net/ososchina/blog/344174, https://blog.csdn.net/u012546203/article/details/74295087) 开始找这个问题是用thyemleaf 来找的,后面在别人的提示下发现这个是springMVC的问题

JPA

Spring Data JPA - JPA persistence against a relational database.

bug记录

  • 实体字段 ccNumber 数据库中为 cc_Number
  • @GeneratedValue(strategy= GenerationType.IDENTITY) 自己选择,AUTO数据库选择
  • 对应连接表的要写出来
  @JoinTable(
          name = "TACO_ORDER_TACO",
          joinColumns = @JoinColumn(name = "order_id", referencedColumnName = "id"),
          inverseJoinColumns = @JoinColumn(name = "taco_id", referencedColumnName = "id")
  )
  @OneToMany(targetEntity=Taco.class)   // 一个订单有好可以有好几个taco,一个taco只能对应一个订单
  private List<Taco> tacos;

security

CSRF https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0

spring 4 user security 不同用户的访问权限

LDAP authentication: LDAP是轻量目录访问协议。https://www.cnblogs.com/obpm/archive/2010/08/28/1811065.html,http://jianshi-dlw.iteye.com/blog/1557846,文档https://oav.net/mirrors/LDAP-ObjectClasses.html。DEMO(例子):https://spring.io/guides/gs/authenticating-ldap/#scratch

数据库模式定义语言DDL(Data Definition Language)

待解决的问题

try {
        userRepo.save(form.toUser(passwordEncoder)); // 1
      }
      catch (DbException e) {   // DbException继承RuntimeException  这里进不去???用RuntimeException可以
      // 运行时异常最好自己在前面自己解决
          System.out.println("RuntimeException ----");
      }
org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "CONSTRAINT_INDEX_2 ON PUBLIC.USER(USERNAME) VALUES ('ben', 2)"; SQL statement:
insert into user (id, city, fullname, password, phone_number, state, street, username, zip) values (null, ?, ?, ?, ?, ?, ?, ?, ?) [23505-196]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.196.jar:1.4.196]
	at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.196.jar:1.4.196]
	at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.196.jar:1.4.196]

解决方法:在1处bebug F8 会发现有个叫targetException 里面有对应的错误类,或者getClass. 他在里面如果捕捉到异常,直接Throw一个大方向的异常,真正的异常原因是直接printStackTrace() 出来了 try {} catch{ printStackTrace() ; throw Exception; // 把异常拦截转化成了DataIntegrityViolationException }

spring 5 配置文件

配置spring 抽象环境的beans, 自己写bean配置文件,不同环境不同配置

6 REST

REST 是REpresentational State Transfer (表现层状态转移)