




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、桃李科技 httpSpring Boot学习目标1.使用Spring BootSpring Boot简介Spring Boot 是Spring Framework 最激动人心的 Spring 框架。如果说 Spring Framework 目标是帮助开发者写出好的系统,那么 Spring Boot 的目标就是帮助开发者用更少的代码,更快地写出好的系统。Spring Boot 为开发者带来了更好的开发体验,但完成代码只是长征路上的一小步,后续的运维工作才是让很多人真正感到无助的。Spring Boot 在运维方面做了很多的工作,部署、度量,无一不在其涉猎范围之内,结合Spring Cloud 框
2、架,还可以轻松实现服务发现、服务降级等功能。相对于 SSH 和 SSM 需要做大量的配置文件,Spring Boot 就简单的多了,可以用寥寥数行代码完成构建一套基于 Spring 的并满足生产需求的框架。并且它还自带了不少非功能性的特性,比如安全、度量、健康检查、内嵌服务器和外置配置,这些都让 Spring Boot 的流行成为了一种顺理成章的结果。特点简化配置1.2. 下一代框架3. 入门级的微框架微服务架构:Spring CloudHello World环境javamaven1.8.0_1313.3.9第 1 页 共 37 页桃李科技 http创建项目第 2 页 共 37 页桃李科技 h
3、ttp第 3 页 共 37 页桃李科技 httpHello World 程序启动方式1. IDEA 里直接运行 SbHlloApplication 的 main 方法2. CMD 命令打开命令行窗口,进入项目目录路径下运行命令:mvn spring-boot:run3. 使用mvn 命令打包,并运行 jar 文件mvn install进入到 target 目录下java 命令执行 jar 包cd targetjava -jar sb_hello-0.0.1-SNAPSHOT.jar第 4 页 共 37 页桃李科技 http启动banner 的定制这个启动的 banner 是可以定制的。/sof
4、tware/taag/#p=display&h=3&v=3&f=Stop&t=ittaoli1. 打开:2.3. 在项目的 resources 目录中,创建一个 banner.txt 的文件4. 将网页中生成的字符拷贝到 banner.txt 文件中。重启程序,就可以看到的图标了。启动banner 的关闭第 5 页 共 37 页SpringBootApplication public class GirlApplication public static void main(String args) /SpringApplication.run(GirlAppl
5、ication.class, args); SpringApplication app=new SpringApplication(GirlApplication.class); app.setBannerMode(Banner.Mode.OFF);app.run(args);桃李科技 http配置文件perties 文件application.yml 文件自定义属性配置1. 普通值的配置2. 配置文件里变量使用别的配置3. 配置多项到一个类里第 6 页 共 37 页桃李科技 httpapplication.ymlHelloController.javaOurcl
6、assProperties.java第 7 页 共 37 页Component ConfigurationProperties(prefix = "ourclass") public class OurclassProperties private String phase; private String grade;public String getPhase() return phase;public void setPhase(String phase) public class HelloController Value("$room") pri
7、vate String room;Value("$ittaoli") private String ittaoli;Autowiredprivate OurclassProperties ourclassProperties;RequestMapping("/hello") public String hello()return "hi"+ittaoli+ourclassProperties.getPhase();server:port: 8081context-path: /sbhelloroom: training2 price:
8、 10000ittaoli: "room: $room,price: $price" ourclass:phase: 2grade: 1704桃李科技 http生产环境和开发环境配置application-dev.ymlapplication-pro.ymlapplication.yml使用java 命令运行项目时可以指定配置文件第 8 页 共 37 页java -jar sb_hello-0.0.1-SNAPSHOT.jar -files.active=prospring:profiles: active: devserver:port: 8080 o
9、urclass:phase: 2grade: 1704 room: training2 price: 10000server:port: 8081ourclass: phase: 2grade: 1704 room: training2 price: 30000this.phase = phase;public String getGrade() return grade;public void setGrade(String grade) this.grade = grade;桃李科技 httpController 的使用基本用法相同与 spring-mvc Controller Reque
10、stMappingPathVariable获取url 中的数据RequestParam获取请求参数的值组合注解GetMapping扩展有:RestController 直接返回 JSON 数据等同于 Controller+ResponseBodyThymeleaf 模板引擎的使用1.添加thymeleaf 依赖包2.添加配置文件application.yml 文件3.Controller 添加器4.添加模板文件第 9 页 共 37 页<!DOCTYPE html><html lang="" xmlns:th=""><head
11、>RequestMapping(value="/admin/main",method = RequestMethod.GET) public String main(Mmm.addAttribute("name","spring boot"); return "main"thymeleaf: cache: false<!-thymeleaf-><dependency><groupId>org.springframework.boot</groupId><a
12、rtifactId>spring-boot-starter-thymeleaf</artifactId></dependency>RequestMapping(value = "user",method = RequestMethod.GET)/GetMapping(value="user")public String user(RequestParam(value = "user",required = false,defaultValue = "admin") String use
13、r)return user;桃李科技 http5.添加静态文件第 10 页 共 37 页<meta charset="UTF-8" /><title>Title</title><meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, um-scale=1.0, minimum-scale=1.0" /><link rel="stylesheet"
14、 th:href="/layui/css/layui.css" /><script th:src="/js/jquery.min.js"></script><script th:src="/layui/layui.js"></script></head><body class="layui-layout-body">内容区域<script>/JavaScript 代码区域layui.use('element',
15、 function() var element = layui.element;element.tabAdd('demo', title: '选项卡的标题',content: '<div id="1"></div>' /支持传入 html,id: '1');$.get('/admin/main/test', function(res) $('#1').html(res);, 'html'););</script></bod
16、y></html>桃李科技 http6.thymeleaf 默认的模式是 html5 的,对 html 的要求比较严格,所以我们会做如下操作。参考文章:spring-data-jpa 的使用JPA(Java Persistence API)定义了一系列对象持久化的标准,只定义了标准,未做实现。Hibernate、TopLink 等是对 JPA 的实现。第 11 页 共 37 页thymeleaf: cache: falsemode: LEGACYHTML5<!-thymeleaf-><dependency><groupId>net.sour
17、ceforge.nekohtml</groupId><artifactId>nekohtml</artifactId><version>1.9.22</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>桃李科技 http
18、增删改查示例:RESTful API 设计使用spring-data-jpa,需要添加的 jar 包第 12 页 共 37 页<!-jpa-><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-mysql-><dependency><groupId>mysql</groupId
19、>请求类型请求路径功能GET/users获取用户数据POST/users创建用户GET/users/id获取某个用户PUT/users/id某个用户DELETE/users/id删除某个用户桃李科技 http配置application.yml增删改查User.java 类第 13 页 共 37 页Entitypublic class User IdGeneratedValue(generator = "_native") GenericGenerator(name="_native",strategy = "native") p
20、rivate Integer id;private String username; private String address;public Integer getId() return id;public void setId(Integer id) this.id = id;spring:profiles: active: devdatasource:driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql:/:3306/lub_jsp username: rootpassword: root jpa:hiber
21、nate:#create,每次程序运行都会创建一个新的表,原来的数据也会消失#ddl-auto: create#update:如果没有则创建,如果有则不删除数据,更新ddl-auto: updateshow-sql: true<artifactId>mysql-connector-java</artifactId></dependency>桃李科技 httpUserController.java第 14 页 共 37 页RestController RequestMapping("/user") public class UserCont
22、roller Autowiredprivate UserService userService; GetMapping("/users")public List<User> findAll()List<User> users=userService.gl(); return users;PostMapping("/users")public User createUser(User user)User user1=userService.createUser(user); return user1;GetMapping("
23、;/users/id")public User findOne(PathVariable("id") Integer id) return userService.findOne(id);PutMapping("/users/id")public String getUsername() return username;public void setUsername(String username) this.username = username;public String getAddress() return address;public
24、 void setAddress(String address) this.address = address;桃李科技 httpUserService.java第 15 页 共 37 页Servicepublic class UserService Autowiredprivate UserRepository userRepository;public List<User> gl() return userRepository.findAll();public User createUser(User user) return userRepository.save(user)
25、;public User findOne(Integer id) return userRepository.findOne(id);public User updateOne(User user) return userRepository.save(user);public void deleteOne(Integer id) userRepository.delete(id);public User updateOne(PathVariable("id") Integer id,RequestBody User user) user.setId(id);return
26、userService.updateOne(user);DeleteMapping("/users/id")public String deleteOne(PathVariable("id") Integer id)userService.deleteOne(id); return "删除"桃李科技 httpUserRepository.javaPostMan 测试安装:https:/article/f54ae2fc1302f31e92b849e6.html第 16 页 共 37 页public interface UserRepos
27、itory extends JpaRepository<User,Integer> /通过姓名public List<User> findByUsername(String userName);桃李科技 httpJpaRepository 的第 17 页 共 37 页桃李科技 http自定义Query可以通过自定义语句进行数据的查找Specification动态动态拼接 sqlUserRepository.java 要继承一个接口 JpaSpecificationExecutorUserService 中使用第 18 页 共 37 页public List<Use
28、r> specificationUsers(User user)List<User> all = userRepository.findAll(new Specification<User>() OverridepublicPredicatetoPredicate(Root<User>root,CriteriaQuery<?>criteriaQuery, CriteriaBuilder criteriaBuilder) Predicate conjunction = criteriaBuilder.conjunction();/是否有用户名
29、的条件if (user.getUsername() != null && !"".equals(user.getUsername() conjunction.getExpressions().add(criteriaBuilder.like(root.get("username"),publicinterfaceUserRepositoryextendsJpaRepository<User,Integer>, JpaSpecificationExecutor<User>/通过姓名public List<Use
30、r> findByUsername(String userName);/HQLQuery("select u from User u where u.username like %?1") public List<User> findUsers(String name);/原生 SQLQuery(value = "select * from user order by rand() limit ?1",nativeQuery = true) public List<User> randomUsers(Integer limi
31、t) ;public interface UserRepository extends JpaRepository<User,Integer> /通过姓名public List<User> findByUsername(String userName);/HQLQuery("select u from User u where u.username like %?1%") public List<User> findUsers(String name);/原生 SQLQuery(value = "select * from us
32、er order by rand() limit 1",nativeQuery = true) public List<User> randomUsers(Integer limit) ;桃李科技 http递归取数据第 19 页 共 37 页RequestMapping("/comments") ResponseBodypublic List<mentTree>ments()List<mentTree>mentment(1,0); returnmentTrees;/构建评论回复所有递归内容public List<mentT
33、ree>ment(Integer articleid,Integer replyId) /取得所有的直接评论的信息,即:replyId=0List<mentTree> comments = articlment(articleid,replyId); for(mentTree comment : comments)List<mentTree> replys = new ArrayList<mentTree>(); / 实例化回复的集合comment.setChildren(replys); / 设置评论的回复集合ment(ment, replys);
34、/ 构建评论与回复信息return comments;/* 构建评论与回复评论的关系* param comment*/privatevoidment(IntegerarmentTreecomment, List<mentTree> replys)List<mentTree>ments=articlment(ment.getId(); / 获取评论的所有回复"%" + user.getUsername() + "%");/是否有的条件if (user.getAge() != null) conjunction.getExpressi
35、ons().add(criteriaBuilder.gt(root.get("age"),user.getAge();return conjunction;);return all;桃李科技 httpjava 的注释缩进问题进入 Settings -> Code Style -> Java ,在右边选择 “Code Generation” Tab,然后找到 Comment第 20 页 共 37 页replys.addAll(ments); / 把所有的回复添加到评论实例化的回复集合中for(mentTree c :ments) / 遍历回复中的回复List<
36、;mentTree> replyss = new ArrayList<mentTree>(); / 实例化回复的集合c.setChildren(replyss);ment(articleid,c, replyss); / 递归调用RequestMapping(value="/admin/main",method = RequestMethod.GET) public String main(Mm)m/取菜单数据List<mreturn "main"private List<faultValue="0")
37、Integer pid)List<id);for(List< mt.setChildren(childs); this.buildreturn allprivate void buildList<Tree> allss =Service.gls(pid); System.out.println(allss);mts.addAll(allss);for (Tree mtt:allss)List<Tree> childss=new ArrayList< mtt.setChildren(childss);this.buildChilds(mtt.getId(
38、),childss);桃李科技 httpCode 那块,把Line comment at first column Block comment at first column两个前面的复选框去掉就可以了。事务管理表单验证对象参数第 21 页 共 37 页/* 添加用户* return*/ PostMapping(value="/users") public User userAdd(User user)user.setAge(user.getAge(); user.setUsername(user.getUsername(); userRepository.save(use
39、r);public class UserService Autowiredprivate UserRepository userRepository;Transactionalpublic void insertTwoUser() User user1=new User(); user1.setAge(19);user1.setUsername("zhangsan"); userRepository.save(user1);User user2=new User(); user2.setAge(19); user2.setUsername("zhangsan&qu
40、ot;); userRepository.save(user2);桃李科技 http验证第 22 页 共 37 页限制说明Null限制只能为 nullNotNull限制必须不为 nullAssertFalse限制必须为 falseAssertTrue限制必须为 trueDecimalMax(value)限制必须为一个不大于指定值的数字DecimalMin(value)限制必须为一个不小于指定值的数字Digits(integer,fraction)限制必须为一个小数,且整数部分的位数不能超过 integer,小数部分的位数不能超过 fractionFuture限制必须是一个将来的日期Max(va
41、lue)限制必须为一个不大于指定值的数字Min(value)限制必须为一个不小于指定值的数字Past限制必须是一个过去的日期Pattern(value)限制必须符合指定的正则表达式Size(max,min)限制字符长度必须在 min 到max 之间Past验证注解的元素值(日期类型)比当前时间早NotEmpty验证注解的元素值不为 null 且不为空(字符串长度不为 0、集合大小不为 0)NotBlank验证注解的元素值不为空(不为 null、去除首位空格后长度为 0),不同于NotEmpty,NotBlank 只应用于字符串且在比较时会去除字符串的空格return user;桃李科技 htt
42、pUser.java 对要验证的属性进行注解新增数据时加入验证AOP 处理面向切面编程思想添加jar 包Aspect 的类第 23 页 共 37 页Aspect Componentpublic class HttpAspect /在器执行前被掉。UserController 的所有方法,如要指定方法,将* 号换成对应方法名Before("execution(public * cn.lub.UserController.*(.)")<dependency><groupId>org.springframework.boot</groupId>
43、<artifactId>spring-boot-starter-aop</artifactId></dependency>/* 添加用户* return*/ PostMapping(value="/users")public User userAdd(Valid User user, BindingResult bindingResult) if(bindingResult.hasErrors()System.out.println(bindingResult.getFieldError().getDefaultMessage(); re
44、turn null;user.setAge(user.getAge(); user.setUsername(user.getUsername(); userRepository.save(user);return user;Min(value=18,message = "18 岁未成年少年入内") private Integer age;限制说明验证注解的元素值是,也可以通过正则表达式和 flag 指定自定义的格式桃李科技 http上面的Before 和After 里的execution 都是一样的,我们应该避免重复的代码定义切面,并且使用 logger第 24 页 共 3
45、7 页Aspect Componentpublic class HttpAspect /使用日志功能:spring 自带的 sl4jprivate final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);/在器执行前被掉。UserController 的所有方法,如要指定方法,将* 号换成对应方法名Pointcut("execution(public * cn.lub.UserController.*(.)") public void log()Before("log()"
46、;) public void doBefore()/System.out.println("被了-前"); ("被了-前");After("log()") public void doAfter()/System.out.println("被了-后"); ("被了-后");public void doBefore() System.out.println("被了");After("execution(public * cn
47、.lub.UserController.*(.)") public void doAfter()System.out.println("被了");桃李科技 http切面获取参数第 25 页 共 37 页Aspect Componentpublic class HttpAspect /使用日志功能:spring 自带的 sl4jprivate final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);/在器执行前被掉。UserController 的所有方法,如要指定号换成对应方Poi
48、ntcut("execu public void log()Before("log()")public void doBefore(JoinPoint joinPoi/System.out.println("被("被ServletRequestAttributes=(ServletRequestAttributes)ReqHttpServletRequest request = attributes.getRequest();/("url=",request.getReque
49、stURL();/("method=",request.getMethod();/("ip=",request.getRemoteAddr();/类-方法 需要参数 JoinP("class-method",joinPoint.getSignature().getDeclaringTypeName()+"-"+joinPoint.getS ignature().getName();/参数("ar
50、gs=",joinPoint.getArgs();After("log()") public void doAfter()/System.out.println("被了-后"); ("被了-后");/返回器执行后返回的内容AfterReturning(pointcut = "log()",returning = "o")桃李科技 http结果:统一异常处理统一异常处理,可以放便我们的代码维护。提高编码效率。下图是优化后的一个整体结构。第 26 页 共 37 页pu
51、blic void doAfterReturning(Object o) ("response=",o);桃李科技 http统一封装返回值结果Result.java 封装了返回给前台的固定格式。这样无论是否有错,前台接受到的数据都是统一的数据格式。方便前端开发编码。第 27 页 共 37 页public class Result<T> private Integer code; private String msg; private T data;public Integer getCode() return code;public voi
52、d setCode(Integer code) 桃李科技 http在 UserService 里模拟抛出不同值的异常UserController 调用 UserService 的代码UserService 中封装的UserException 类。由于 Exception 只能传递错误消息一个参数类型。所以,封装了的异常类,扩展了 code 字段。注意:继承的是 RuntimeException,只有继承了这个类,抛异常后才会回滚。第 28 页 共 37 页GetMapping(value = "users/getAge/id")public void getAge(Path
53、Variable("id") Integer id) throws Exception userService.getAge(id);public void getAge(Integer id)User user=userRepository.findOne(id); Integer age = user.getAge(); if(age<10)/返回你还在上小学吧throw new UserException(UserResultEnum.PRIMARY_SCHOOL);else if(age<18)/返回你可能还在上初中throw new UserExcep
54、tion(UserResultEnum.MIDDLE_SCHOOL);/如果大于 18.this.code = code;public String getMsg() return msg;public void setMsg(String msg) this.msg = msg;public T getData() return data;public void setData(T data) this.data = data;桃李科技 http这里面还是用了一个 UserResultEnum 的枚举,统一了不同错误下的状态码和错误消息最后是捕获异常的类 ExceptionHandle,注意
55、注解关键字第 29 页 共 37 页public enum UserResultEnum UNKNOWN_ERROR(-1,"未知错误"), SUCESS(0,""),PRIMARY_SCHOOL(100,"你可能还在上小学"), MIDDLE_SCHOOL(101,"你可能还在上初中"),;private Integer code; private String msg;UserResultEnum(Integer code, String msg) this.code = code;this.msg = msg
56、;public Integer getCode() return code;public String getMsg() return msg;public class UserException extends RuntimeException private Integer code;public UserException(UserResultEnum userResultEnum) super(userResultEnum.getMsg();this.code = userResultEnum.getCode();public Integer getCode() return code
57、;public void setCode(Integer code) this.code = code;桃李科技 http单元测试测试Service右击 Service 中的某个方法,Go To -> Test ,创建新的 Test,选择要测试的方法。该加的注解不能少。第 30 页 共 37 页RunWith(SpringRunner.class)/表示要在测试环境下运行,底层用的是jUnit SpringBootTest/表示将启动整个 spring boot 工程public class UserServiceTest Autowiredprivate UserService userService; Testpublic void findOne() throws Exception Integer id=1;User user=userService.findOne(id); System.out.println(user);Assert.assertEquals(new Integer(12),user.getAge();Control
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 婴幼儿生长迟缓的早期识别与早期干预
- 成人雾化吸入护理团体标准考核试题
- 南通理工学院《肿瘤生物学导论》2023-2024学年第二学期期末试卷
- 吉林省松原市2024-2025学年第二学期高三第一次网上综合模拟测试物理试题试卷含解析
- 山东英才学院《石油工程专业文献检索及论文写作》2023-2024学年第一学期期末试卷
- 江西建设职业技术学院《道路与桥梁工程专业软件应用》2023-2024学年第一学期期末试卷
- 江苏省无锡市丁蜀学区2025届初三一轮复习质量检测试题化学试题含解析
- 山西工学院《检体诊断学》2023-2024学年第二学期期末试卷
- 溧阳市2024-2025学年数学四年级第二学期期末质量检测模拟试题含解析
- 吉林水利电力职业学院《行书技法》2023-2024学年第二学期期末试卷
- 江苏省泰州市姜堰区2023-2024学年二年级下学期期中数学试卷
- 国测省测四年级劳动质量检测试卷
- 新生儿腹泻病护理查房
- 再回首合唱简谱
- 二手车交易平台商业计划书
- 作文集封面模板A4高清全套
- 家长会示范课件培养孩子养成独立自主的习惯
- 2024老人智能手机培训ppt大全
- 2024年大学生心理健康教育考试题库及答案(含各题型)
- 比亚迪销售模式分析报告
- 2024年鱼子酱项目营销策划方案
评论
0/150
提交评论