springboot完整项目开发,04《Spring Boot 入门教程》使用模板引擎开发 Web 项目
springboot完整项目开发,04《Spring Boot 入门教程》使用模板引擎开发 Web 项目详细介绍
本文目录一览: Spring Boot从入门到精通-项目搭建
Spring Boot极大的简化了java项目的开发,在之前如果想要开发一个java项目,需要安装tomcat或者其他容器插件。但是Spring Boot内部已经集成了tomcat,因此项目的启动异常的方便。而且Spring Boot的开发中有很多默认的配置,帮助我们省去了相当多的时间。
在idea中,File-->New-->Project...
选择Spring Initializr
填写你的maven项目的groupId和artifact等项目基本信息之后,在依赖中选择Web-->Web之后finish。
目录结构如下:
直接运行DemoApplication.java就可以运行项目了。
你也可以使用官方模板快速开始Spring Boot项目
接下来我们分析一下pom.xml中的依赖。
Spring Boot中还有一个很重要的文件:application.properties/yml/yaml文件。
项目中的配置不再是以前的xml形式,而是写在这个文件中。Spring Boot已经为我们提供了很多默认的配置。
以上我们搭建了一个完全没有进行任何操作的Spring Boot框架,下一节我们将继续为我们的项目添砖加瓦一步步深入了解Spring Boot。Spring Boot从入门到精通-初识注解、接口
intellijidea创建springboot项目详细步骤
IntelliJIDEA提供了丰富的功能和工具,用于开发SpringBoot应用程序。本文将介绍在IntelliJIDEA中创建SpringBoot项目的步骤,帮助您开始构建基于SpringBoot的应用程序。intellijidea创建springboot项目详细步骤1、首先打开idea编辑器创建项目,选择File-New-Project2、选择SpringInitializr,输入自己的项目配置,点击Next3、选择相应的依赖,也可以自己导入,选中springweb、mybatis、mysql驱动、Lombok4、配置我们的数据库5.、启动我们新建的项目
Spring Boot 开发工具的使用
Spring Boot 提供了一套额外的工具,可以提升应用程序开发的体验,只用在项目中包含 spring-boot-devtools 模块就行。该模块会在开发模式下设置一些默认的属性,例如:禁用缓存、设置日志等级;还会监听 classpath 的变化,自动的重启应用。 spring-boot-devtools 给开发带来了很多的便利,这篇文章总结可它的一些用法。
要使用 devtools,需要先添加模块依赖,Maven 和 Gradle 的配置如下:
Maven:
Gradle:
运行完整打包的应用时,开发工具会被禁用。当使用 java -jar 或者特殊的类加载器运行时,会被认为是生产环境。在 Maven 中使用
true
标记该依赖时可选的,或者在 Gradle 中使用自定义的 developmentOnly 配置可以防止开发工具应用到项目的其他模块。
Spring Boot 中的一些库会通过缓存来提升性能。比如:模块引擎缓存已编译的模板,已避免重复解析模板文件;Spring MVC 在响应静态资源时设置 HTTP 缓存头。 启用缓存在开发环境中非常有用,但是在生产环境下却适得其反。因此 spring-boot-devtools 默认会为我们禁用掉缓存,而不用再去手动禁用了。 同时,开发工具还会将 Web 日志的等级设置为 DEBUG ,这样就可以看到更加详细的请求和响应信息。如果要记录所有请求详细信息(包括可能的敏感信息),可以启用 spring.http.log-request-details 。 如果不想使用默认的配置,可以设置 spring.devtools.add-properties 为 false 。
当 classpath 上的文件发生修改时,使用了 spring-boot-devtools 的应用会自动重启。在开发过程中,会是一个有用的功能,因为可以快速地看到修改导致的变化。 由于 DevTools 监视 classpath 资源,因此触发重新启动的唯一方法是更新 classpath。在 Eclipse 中,默认在修改文件并保存时会自动编译,从而触发 classpath 更新,而 IntelliJ 中需要手动构建项目( Build -> Build Project )才行。当然,IntelliJ 中也可以 设置自动编译 ,但我觉得没有必要。
Devtools 通过两个类加载器来完成重启,对于第三方库等不会发生修改的类,使用 base 类加载器,用户编辑的类则使用 restart 类加载器。当应用重启时, restart 类加载器会被丢弃然后创建一个新的,这样会加快重启的速度。如果觉得重启不够快,可以考虑使用 JRebel ,它通过重新载入类来实现热更新。
默认情况下,每次应用程序重新启动时,都会输出条件评估增量的报告。该报告显示了修改应用程序时自动配置的变化,例如:添加或删除 Bean 以及配置属性。
添加下面的配置可以关闭该日志:
某些资源在更改时不需要触发重启。默认情况下, /META-INF/maven 、 /META-INF/resources 、 /resources , /static 、 /public 或 /templates 中的资源发生修改时不会触发重启(但是会触发 live reload,见下文)。 如果想要自定义需要排除的目录,可以通过 spring.devtools.restart.exclude 属性配置(逗号分隔多个)。如果想要维持默认的配置额外的排除其他目录,可以通过 spring.devtools.restart.additional-exclude 属性配置。
通过 spring.devtools.restart.additional-paths 可以配置额外的路径以监听变化。
如果不想使用重启功能,可以通过 spring.devtools.restart.enabled 属性设置。大多数情况下,直接在 application.properties 中设置即可。如果想要完全禁用重启,需要在调用 SpringApplication.run(…) 之前设置 spring.devtools.restart.enabled System 属性为 false :
如果使用不断编译已更改文件的 IDE,可能更喜欢仅在特定时间触发重新启动。我们可以使用“触发器文件”,这是一个特殊文件,当想要实际触发重新启动检查时必须修改该文件。更改文件只会触发检查,只有在 Devtools 检测到必须执行某些操作时才会重新启动。触发器文件可以手动更新,也可以使用 IDE 插件更新。 将 spring.devtools.restart.trigger-file 属性设为触发文件路径。
spring-boot-devtools 模块包含一个嵌入式 LiveReload 服务器,可用于在资源更改时触发浏览器刷新。浏览器需要安装 LiveReload 插件 。
如果不想启用 LiveReload 服务器,设置 spring.devtools.livereload.enabled 属性为 false 。
一次只能运行一个 LiveReload 服务器。如果从 IDE 启动多个应用程序,则只有第一个具有 LiveReload 功能。
在 $HOME 目录下创建一个 .spring-boot-devtools.properties 文件,在里面添加全局的 devtools 设置。添加到此文件的任何属性都会应用到本机所有使用 devtools 的 Spring Boot 应用程序中。
从零开始新建Springboot项目之项目启动(一)
一般都是使用搭建好的框架进行业务逻辑开发,一直不清楚整个项目是如何从零到一构建出来的。所以开一个帖子,记录一下一个springboot项目是如何构建的。
使用的工具为idea
选择maven或者spring initializr都可以。spring initializr会在pom中自动添加一些springboot用到的jar包,此处选择maven。起好名字后,一路next即可
从实际开发角度,构建Module不是必选项。但学习嘛,还是要知道是怎么创建的
右键项目名称 -> New -> Module
依然选择maven,起名字即可。一般命名为:XXXX-Controller,XXXX-Service等等
建好后,pom中会多出以下内容
(放弃多模块配置)
可在此处搜索 mvnrepository
首先添加parent,作为父级依赖。位置在
的下一级,与
org.example 同级,
在
同级新建
标签,引入web项目需要的依赖
如果是多模块的项目,需要在每一个模块的pom文件中,添加其依赖的其他模块。例如controller依赖service,则需要在controller的pom文件中添加以下依赖信息。如果不是多模块项目,可以忽略
在java路径下新建顶级路径 com.tardis ,在此路径下新建文件 CustomerApplication (名字随意)。新建 controller , service 的 package 。在 CustomerApplication 添加如下方法
文件的层级关系如图
在 resource 目录下,新建 application.yml , application.dev.yml , application.prod.yml 文件,作为总体,开发环境,生产环境的配置文件。配置文件格式为 properties , yml 均可,此处使用 yml ,看起来比较简洁清晰
层级关系如图
为了更好地演示效果,可以先写一个简单的Controller进行测试,在controller文件夹中新建class,名字随意。文件层级如图。放一个最简单的接口。
使用postman调用,返回结果如下
如何构建spring boot
SpringMVC是非常伟大的框架,开源,发展迅速。优秀的设计必然会划分、解耦。所以,spring有很多子项目,比如core、context、bean、mvc等。这对知根底的人来说很简单明了,然而springmvc就是为了傻瓜式的操作而发明的。对于初学springmvc的人来说,想要入手就开发需要拷贝一连串的dependency而不知道这个是干嘛,不知道是不是少了依赖。像我刚接触springmvc的时候到处百度教程而发现各有不同,于是复制了一个又一个代码却不能自己设置,根本原因是不了解各个依赖的包。
Spring-Boot 正是为了解决繁复的代码配置而产生的。Spring-Boot 也是基于java-base 开发的代码,及不用xml文件配置,所有代码都由java来完成。还可以加入Groovy的动态语言执行。
Spring Boot充分利用了JavaConfig的配置模式以及逗约定优于配置地的理念,能够极大的简化基于Spring
MVC的Web应用和REST服务开发。
Spring
4倡导微服务的架构,针对这一理念,近来在微博上也有一些有价值的讨论,如这里和这里。微服务架构倡导将功能拆分到离散的服务中,独立地进行部署,Spring
Boot能够很方便地将应用打包成独立可运行的JAR包,因此在开发模式上很契合这一理念。目前,Spring
Boot依然是0.5.0的里程碑版本,因此相关的文档尚不完善,本文将会以一个简单的样例来介绍基于这个项目的开发过程。
要Spring
Boot进行功能开发,需要使用Gradle或者Maven作为构建工具。在本例中,我们会使用Eclipse和Maven插件进行开发。要使用Spring
Boot,首先创建一个Maven工程,并修改Maven主要的配置文件pom.xml,如下所示:
org.springframework.boot
spring-boot-starter-parent
0.5.0.M7
org.springframework.boot
spring-boot-starter-web
org.thymeleaf
thymeleaf-spring3
com.levin.Application
org.springframework.boot
spring-boot-maven-plugin
spring-milestone
false
spring-milestone
false
在上面的配置中,需要将工程的parent设置为spring-boot-starter-parent,并添加对spring-boot-starter-web的依赖,这样我们就无需设置各个依赖项及其版本信息了。并且在构建中要声明使用spring-boot-maven-plugin这个插件,它会对Maven打包形成的JAR进行二次修改,最终产生符合我们要求的内容结构。
在我们的应用中将要发布一个REST服务,显示一个基本的用户信息,首先定义一个简单的模型类:
package com.levin;
public class Person {
private String name;
private String email;
public Person(String name, String email) {
this.name = name;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
接下来,我们需要声明一个Spring MVC的Controller,响应对实体的请求:
@Controller
public class ShowPersonController {
@RequestMapping("/showPerson")
public @ResponseBody Person showPerson() {
return new Person("levinzhang","levinzhang1981@gmail.com");
}
}
这个类与我们在使用Spring MVC定义Controller时并无任何差别。接下来,我们需要声明一个主类启动这个应用程序:
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这个类的main方法中使用了SpringApplication帮助类,并以Application这个类作为配置来启动Spring的应用上下文。在这个类中使用了ComponentScan以及EnableAutoConfiguration注解,其中ComponentScan注解会告知Spring扫描指定的包来初始化Spring
Bean,这能够确保我们声明的Bean能够被发现。EnableAutoConfiguration将会启动自动配置模式,在我们的配置中会将对Tomcat的依赖级联进来,因此在应用启动时将会自动启动一个嵌入式的Tomcat,因为在样例中使用了Spring
MVC,所以也会自动注册所需的DispatcherServlet,这都不需要类似web.xml这样的配置。
在Eclipse中要运行这个应用的话,可以直接以Java
Application的形式来运行这个main函数,此时会启动应用,我们在浏览器中可以看到如下的运行效果,这就是我们想要的REST服务:
在开发调试完成之后,可以将应用打成JAR包的形式,在Eclipse中可以直接使用Maven插件的package命令,最终会形成一个可运行的JAR包。我们使用java
–jar命令就可以运行这个JAR包了。所呈现出的效果与在调试期是一样的。现在看一下这个JAR包解压后的目录结构:
这个JAR包与传统JAR包的不同之处在于里面有一个名为lib的目录,在这个目录中包含了这个简单应用所依赖的其他JAR包,其中也包含内置的嵌入式Tomcat,正是使用它,才能发布服务和访问Web资源。除了我们编写的源码所编译形成的CLASS以外,在org目录下还有许多Spring所提供的CLASS,正是依赖这些CLASS,才能够加载位于lib目录下JAR中的类。这样的加载机制与在OSGi
bundle中声明Bundle-Classpath很类似,不过在OSGi中会由容器来负责加载指定路径下的类。这大致阐述了这样一个JAR包能够发布服务的原因。
如果我们想要使用HTML、JSP等Web资源的话,在Controller中直接返回对应的视图就可以了。
如果我们想要将这个JAR包转换成可以在Servlet容器中部署的WAR的话,就不能依赖于Application的main函数了,而是要以类似于web.xml文件配置的方式来启动Spring应用上下文,此时我们需要声明这样一个类:
public class HelloWebXml extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
这个类的作用与在web.xml中配置负责初始化Spring应用上下文的监听器作用类似,只不过在这里不需要编写额外的XML文件了。
如果要将最终的打包形式改为WAR的话,还需要对pom.xml文件进行修改,除了需要将packaging的值修改为war以外,还需要对依赖进行适当的配置(这一部分在Spring
Boot的样例和文档中均未提及,提醒大家注意):
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
在这里需要移除对嵌入式Tomcat的依赖,这样打出的WAR包中,在lib目录下才不会包含Tomcat相关的JAR包,否则将会出现启动错误。另外,在移除对Tomcat的依赖后,为了保证编译正确,还需要添加对servlet-api的依赖,因此添加如下的配置:
org.apache.tomcat
tomcat-servlet-api
7.0.42
provided
在这里将scope属性设置为provided,这样在最终形成的WAR中不会包含这个JAR包,因为Tomcat或Jetty等服务器在运行时将会提供相关的API类。此时,执行mvn
package命令就会得到一个WAR文件,我们可以直接将其放到Tomcat下运行(需要7.0.42版本以上)。
以上介绍了基于Spring Boot开发应用的过程,目前它的文档尚不完善,但是在GitHub上有不少的样例,包括与Spring
Data集成访问数据库(关系型以及非关系型)、安全、WebSocket等,读者感兴趣可以下载运行,需要注意的是有些样例中使用的是0.5.0.M6版本,这个版本有问题,运行时会出错,建议手动修改为0.5.0.M7或快照版本。
基于以上的介绍,希望读者能够对Spring
Boot这个新项目有所了解。它简化了JAR包管理和相关基础设施环境的配置,能够帮助我们快速开发Web应用或构建REST服务,希望它能够尽快完善成熟,更多地用于实践,提升开发效率。
SpringBoot项目开发技巧一:自动装配
SpringBoot自动装配是springboot重要的功能点。Boot系列、其它框架与Boot的整合很多是基于自动装配的。 我们在写SpringBoot项目时,Maven的pom依赖能看到很多的starter 都是基于自动装配的
自动装配的原理 网上已经有很多的讲解了,这里不再冗余了。
ProviderConfigration
@Configuration注解在类上表示此类为自动装配类。@Bean通常与@Configuration 一起使用,将方法的返回值注入到spring的bean容器中
@Bean 注解的方法是将方法名做为beanName。上面ProviderProperties这个Bean 在spring容器中的beanName为providerHpProperties(作者工作中踩过这个坑)
@ConditionalOnProperty 不讲解。SpringBoot有很多的@ConditionalXXX 实现条件式注入bean。感兴趣的可以下去了解一下
@ConfigurationProperties 将配置文件的符合规则的key 对应的映射到文件中。
prefix :前缀
ignoreInvalidFields :配置true时不能被正常解析的属性会忽略,spring正常启动。默认为false,解析失败时报错。简单来说就是类型不匹配。
ignoreUnknownFields:配置true时属性未找到时会忽略,spring正常启动。默认为false,未找到时报错。简单来说就是没找到。
对应的配置文件
此时我们已经通过自动装配的方式向Spring的bean容器中注册了两个bean,分别为:ProviderProperties、ProviderSwitch
使用和其它bean一样,@Autowired即可。
如果你写的自动装配类是用于本项目的。那么需要注意@Configuration注解的类需要在scanBasePackages扫包的路径内,否则spring无法加载到自动装配类。更别谈自动装配了(如果在spring.factories文件中配了,可以不用扫包操作。见下文)。
很多时候我们需要编写像SDK这样供外界系统使用的包。我们又想最小程度上减轻引入方的配置(不想让三方去添加扫包操作),那么此时自动装配就起到了关键性的作用(SpringBoot很多的starter都是这样)。下面来说一下具体的流程
在resources目录下创建META-INF/spring.factories文件。
文件结构key,value的形式。key为EnableAutoConfiguration(因为我们这章将的是自动装配),value为我们编写的Configration类全路径
SPI文件有很多的扩展点(很多的配置项key),不在一一叙述。可以在idea中直接搜索spring.factories,可以看到有很多。
SpringBoot在启动中会找到Path下面的所有spring.factories文件,并使用SpringFactoriesLoader将文件加载解析为K,V的形式。
在按照key分发至对应的扩展点,将配置的value(就是class全路径)加载解析到Spring中,实现SPI。
在我们完成了以上几步后,我们的sdk包中的自动装配就完成啦。三方引入时也不用扫包啦。
偷偷告诉大家:@Configuration 可以和 @ComponentScan一起使用,如下:
这样com.hp.config包及子目录 也会被spring扫描到。作为一个SDK 既不用三方去扫包,又可以自己扫描一些特定包,岂不是美哉!
在引入了以下依赖后
直接mvn package 命令后,在target目录下可以找到以下文件
将spring-configuration-metadata.json 拷贝到resources的META-INF目录下。
之后在编写配置文件的时候就会有提示,如下
作为一个sdk包,三方在使用的时候一定会对你竖起大拇指的。心想:这个人真强!
好的以上就是分享的内容啦。希望大家看了后会有收获,对编码上会有帮助!
11点了,该睡觉了。
对了,今天三妹说我有点小帅(我老婆,我是二哥她是三妹)!哈哈哈!今晚睡觉怕是要笑出声了 QAQ
「开源」springboot快速开发框架推荐,接私活利器
本期为大家精选了 码云 上优秀的 Spring Boot 语言开源项目,涵盖了企业级系统框架、文件文档系统、秒杀系统、微服务化系统、后台管理系统等,希望能够给大家带来一点帮助:)
1、项目名称: 分布式敏捷开发系统架构
项目简介: 基于 Spring + SpringMVC + Mybatis 分布式敏捷开发系统架构,提供整套公共微服务服务模块:集中权限管理(单点登录)、内容管理、支付中心、用户管理(支持第三方登录)、微信平台、存储系统、配置中心、日志分析、任务和通知等,支持服务治理、监控和追踪,努力为中小型企业打造全方位J2EE企业级开发解决方案。
项目地址:https://gitee.com/shuzheng/zheng2、
2、项目名称: 模块化开发系统
项目简介: 以 SpringBoot 为中心,模块化开发系统,用户可以随意删减除权限框架外 任意的系统模块。复用,组装性强主要应用技术:
项目地址: https://gitee.com/YYDeament/88ybg
3、项目名称: JAVA 分布式快速开发平台
项目简介: JAVA 分布式快速开发平台:SpringBoot,SpringMVC,Mybatis,mybatis-plus,motan/dubbo分布式,Redis 缓存,Shiro 权限管理,Spring-Session 单点登录,Quartz 分布式集群调度,Restful 服务,QQ/微信登录,App token 登录,微信/支付宝支付;日期转换、数据类型转换、序列化、汉字转拼音、身份证号码验证、数字转人民币、发送短信、发送邮件、加密解密、图片处理、excel 导入导出、FTP/SFTP/fastDFS 上传下载、二维码、XML 读写、高精度计算、系统配置工具类等。
项目地址:https://gitee.com/iBase4J/iBase4J
4、项目名称: 快速开发框架 ThinkGem
项目地址: https://gitee.com/thinkgem/jeesite
5、项目名称: Java 快速开发平台 MCMS
项目简介: 完整开源,Java 快速开发平台。基于 Spring、SpringMVC、Mybatis 架构,MStore 提供更多好用的插件与模板(文章、商城、微信、论坛、会员、评论、支付、积分、工作流、任务调度等,同时提供上百套免费模板任意选择),价值源自分享!铭飞系统不仅一套简单好用的开源系统、更是一整套优质的开源生态内容体系。
项目地址: https://gitee.com/mingSoft/MCMS
6、项目名称: 分布式秒杀系统
项目简介: 可能秒杀架构原理大家都懂,网上也有不少实现方式,但大多都是文字的描述,告诉你如何如何,什么加锁、缓存、队列之类。但很少全面有的案例告诉你如何去做,既然是从0到1,希望以下代码案例可以帮助到你。当然最终落实到生产,还有很长的路要走,要根据自己的业务进行编码,实施并部署。你将会在代码案例中学到以下知识:
项目地址: https://gitee.com/52itstyle/spring-boot-seckill
7、项目名称: Spring Boot 快速开发平台
项目简介: renren-fast 是一个轻量级的 Spring Boot 快速开发平台,其设计目标是开发迅速、学习简单、轻量级、易扩展;使用 Spring Boot、Shiro、MyBatis、Redis、Bootstrap、Vue2.x 等框架,包含:管理员列表、角色管理、菜单管理、定时任务、参数管理、代码生成器、日志管理、云存储、API 模块(APP 接口开发利器)、前后端分离等。
项目地址: https://gitee.com/babaio/renren-fast
8、项目名称: 企业级快速开发脚手架
项目简介: 本项目是 spring boot 搭建的一个企业级快速开发脚手架。其技术栈如下所示:
项目地址: https://gitee.com/jamen/slife
9、项目名称: 文件文档在线预览
项目简介: 此项目为使用 spring boot 打造文件文档在线预览项目解决方案,对标业内付费产品有【永中office】【office365】【idocv】等,在取得公司高层同意后以Apache协议开源出来反哺社区,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如 doc、docx、Excel、pdf、txt、zip、rar、图片等等。
项目地址: https://gitee.com/kekingcn/file-online-preview
10、项目名称: 微服务化开发平台
项目简介: Cloud-Admin 是国内首个基于 Spring Cloud 微服务化开发平台,核心技术采用 Spring Boot2 以及 Spring Cloud Gateway 相关核心组件,前端采用 vue-element-admin 组件。具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关 API 管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。
项目地址: https://gitee.com/minull/ace-security
11、项目名称: 后台管理系统 Guns
项目简介: Guns 基于 SpringBoot,致力于做更简洁的后台管理系统,完美整合 springmvc + shiro + mybatis-plus + beetl。Guns 项目代码简洁,注释丰富,上手容易,同时 Guns 包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块),可以直接作为一个后台管理系统的脚手架。Guns v3.0 新增 rest api 服务,提供对接服务端接口的支持,并利用 jwt token 鉴权机制给予客户端的访问权限,传输数据进行 md5 签名保证传输过程数据的安全性!
项目地址: https://gitee.com/naan1993/guns
04《Spring Boot 入门教程》使用模板引擎开发 Web 项目
模板引擎这个词,咋听起来,有点高大上的意味。
实际上,模板引擎是非常平易近人的技术。譬如大家可能都比较熟悉的 JSP ,就是一种比较典型的模板引擎。
当浏览器将请求抛给控制器,控制器处理好数据后,就跳转 JSP 等模板引擎页面。注意在跳转的同时,还会将数据组装好,也交给模板引擎处理。
模板引擎会根据数据,和模板引擎的规则,动态生成 HTML 页面,最后返回给浏览器显示。
我们使用 Spring Boot 开发 Web 项目,大体上有两种方式。
第一种方式,是后端服务化的方式,也是当前的主流方式。前端是静态的 HTML 页面,通过 Ajax 请求 Spring Boot 的后端接口。 Spring Boot 返回数据一般采用 JSON 格式,前端接收后将数据显示。
第二种方式,是采取模板引擎的方式。前端的请求,到达 Spring Boot 的控制器后,控制器处理请求,然后将返回数据交给模板引擎。模板引擎负责根据数据生成 HTML 页面,最后将 HTML 返回给浏览器。
我个人比较推荐第一种方式,说一下该方式的几个优点:
本篇是讲模板引擎,也得说说模板引擎的优点,王婆卖瓜不能光夸草莓啊。模板引擎开发的页面,对搜索引擎 SEO 比较友好;还有就是简单的页面,如果用模板引擎开发速度比较快,毕竟模板化的方法,目的就是减少重复提高效率。
Spring Boot 支持的模板引擎种类很多,常见的有 FreeMarker 、 Thymeleaf 、 JSP 。
因为这些模板引擎使用的用户都不少,所以我们逐一介绍下其实现过程。
至于孰优孰劣,请各位看官自行评价。正所谓:尺有所短,寸有所长,各取所爱,万物生长!
本篇我们开发一个商品浏览项目实例。
此处说一个我个人的经验:在做一个项目或一个模块的时候,不要一开始就动手写代码,最好是谋定而后动。
我们作为程序员,实际上是整个程序世界的总指挥。应该先整体规划,再实现局部。这种总分型的开发方法便于我们理顺思路,提高编码效率!
好的,我们来思考下,实现商品浏览项目实例的整体流程:
整体流程
可以看到,我们是先建立了控制器方法和页面,再去实现其中的具体细节。这样可以让我们的思维保持连贯性和整体性,在做一些页面和方法较多的项目时,会感觉更加顺畅。
我们按整体流程,使用 FreeMarker 模板引擎,来实现商品浏览功能。
使用 Spring Initializr 创建项目,Spring Boot 版本选择 2.2.5 , Group 为 com.imooc , Artifact 为 spring-boot-freemarker ,生成项目后导入 Eclipse 开发环境。
引入 Web 项目及 FreeMarker 模板相关的依赖项,代码如下:
实例:
创建控制器类,由于是商品相关的控制器,所以命名为 GoodsController ,代码如下:
实例:
我们具体解释下该类的作用。
我们 resource/templates 目录下新建商品页面 goods.ftl ,先不必实现具体功能,代码如下:
实例:
此时我们启动项目,然后访问 http://127.0.0.1:8080/goods ,即可显示对应页面内容。
定义商品类 GoodsDo 用来描述商品信息,注意 Do 表示数据模型对象(Data Object),代码如下:
实例:
然后我们编写服务类 GoodsService ,提供获取商品列表的方法。注意此处仅仅是演示模板引擎,并不需要访问数据库,直接返回一个指定内容的商品列表。
实例:
此时,我们的控制器就可以注入 GoodsService 类型的组件,然后调用其方法了。
实例:
注意 model.addAttribute("goodsList", goodsService.getGoodsList()); ,我们将商品列表相关的数据交给模板引擎去处理。
此时我们可以根据 FreeMarker 模板引擎,按模板规则显示商品信息了。
实例:
注意我们通过 FreeMarker 的模板语法,输出了商品列表信息。关于 FreeMarker 模板引擎更多的语法规则,感兴趣的同学可以后续查阅更多资料。
启动项目,打开浏览器访问 http://127.0.0.1:8080/goods ,即可查看输出结果。
Thymeleaf 和 FreeMarker ,都是模板引擎,使用方法基本类似。此处我们仅仅是给出一个范例,不再做过多的解释。
使用 Spring Initializr 创建项目, Spring Boot 版本选择 2.2.5 , Group 为 com.imooc , Artifact 为 spring-boot-thymeleaf ,生成项目后导入 Eclipse 开发环境。
引入 Web 项目及 Thymeleaf 模板相关的依赖项。
实例:
创建控制器类, GoodsController , Thymeleaf 直接使用 HTML 作为模板页面,故代码如下:
实例:
我们在 resource/templates 目录下新建商品页面 goods.html ,先不必实现具体功能,代码如下:
实例:
此时我们启动项目,然后访问 http://127.0.0.1:8080/goods ,即可显示对应页面内容。
商品类 GoodsDo ,服务类 GoodsService ,这两个类与上面没有区别直接放出代码。
实例:
实例:
好的,此时我们的控制器就可以注入 GoodsService 类型的组件,然后调用其方法了。
实例:
此时我们可以根据 Thymeleaf 模板引擎,按模板规则显示商品信息了。
实例:
注意我们通过 Thymeleaf 的模板语法,输出了商品列表信息。关于 Thymeleaf 模板引擎更多的语法规则,感兴趣的同学可以后续查阅更多资料。
启动项目,打开浏览器访问 http://127.0.0.1:8080/goods ,即可查看输出结果。
到此,大家基本上也能发现,这两种方式除了模板页面文件内容不同,其他地方基本都是一模一样的。
也就是说,模板引擎主要负责通过一些模板标签,将控制器返回的数据解析为网页。
注意 Spring Boot 官方已经不推荐使用 JSP 了,确实操作起来也比较麻烦。但是由于 JSP 用户体量还是比较大的,所以此处还是简单演示下,开发步骤与 FreeMarker / Thymeleaf 基本一致。
使用 Spring Initializr 创建项目, Spring Boot 版本选择 2.2.5 , Group 为 com.imooc , Artifact 为 spring-boot-jsp ,生成项目后导入 Eclipse 开发环境。
引入 Web 项目及 JSP 模板相关的依赖项。
实例:
创建控制器类, GoodsController ,代码如下:
实例:
手工添加 src/main/webapp 及子目录如下,同时目录下放一个 goods.jsp 用于测试。注意该目录是一个 Source Folder 源代码目录,不是普通文件夹目录。
spring-boot-jsp 项目结构
实例:
注意,我们还需要添加一个视图解析器,实现 JSP 页面往指定目录跳转。
实例:
此时我们启动项目,然后访问 http://127.0.0.1:8080/goods ,即可显示对应页面内容。
商品类 GoodsDo ,服务类 GoodsService ,这两个类与上面没有区别直接放出代码。
实例:
实例:
好的,此时我们的控制器就可以注入 GoodsService 类型的组件,然后调用其方法了。
实例:
此时我们可以根据 JSP 模板引擎,按模板规则显示商品信息了。
实例:
注意我们通过 JSP 的模板语法,输出了商品列表信息。关于 JSP 模板引擎更多的语法规则,感兴趣的同学可以后续查阅更多资料。
启动项目,打开浏览器访问 http://127.0.0.1:8080/goods ,即可查看输出结果。
最后大家应该也发现了, FreeMarker 和 Thymeleaf 的用法几乎是一模一样的,而 JSP 还需要手工添加一些目录和配置。
三种方式各有优劣, FreeMarker 模板语法比较简洁, Thymeleaf 可以直接使用 HTML 作为模板文件, JSP 用户群体广泛。
但是三种方式,都是一种模板引擎而已,将控制器返回数据转化为 HTML 页面显示,本质上没啥区别,大家对模板引擎有一个了解即可。
SpringBoot的启动过程及部分注解
相比于以前繁琐的基于 Spring 的 Web 应用,SpringBoot 通过默认配置很多框架的方式,极大的简化了项目的搭建以及开发流程。 一个简单的 SpringBoot 应用只需要三步: 1.在 pom.xml 中引入所需要的依赖 2.在 application.yml 配置所需的数据源 3.在启动类中加入 @SpringBootApplication 注解 以及 run 方法
启动流程
1.SpringApplication.run()启动 2.新建 SpringApplication 实例,主要是初始化一些成员变量,参数列表等
prepareContext():
refreshContext() 中 refresh():
核心注解(部分) @SpringBootAppliction 启动类 @Configuration + @EnableAutoConfiguration + @ComponentScan
@Configuration 允许在应用上下文中注册其它的 bean,可用 @Component代替 @Configuration 会为 bean 创建一个代理类,这个类会拦截所有被 @Bean 修饰的方法,从容器中返回所需要的单例对象;@Component 不会创建代理类,会直接执行方法,每次返回一个新的对象
@EnableAutoConfiguration 启用 springboot 自动装配,该参数位于 spring.factories 中 org.springframework.boot.autoconfigure.EnableAutoConfiguration
@ComponentScan 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类
@Autowired 自动导入对象到类中,被注入进的类被 Spring 容器管理 Service->Controller
@Component 通用的注解,可标注任意类为 Spring 组件 @Repository 持久层 @Service 服务层 @Controller 控制层
@Bean 用于告诉方法产生一个 Bean 对象,然后这个对象交给 IOC 容器管理。产生这个Bean对象的方法Spring只会调用一次,然后将这个Bean对象放在 IOC 容器中
SpringBoot + ES基本项目搭建实例
之前一直没有写ES相关的博文,现在开始补课,预计5-6篇博文将es的使用姿势展示给各位小伙伴;本文将作为es结合springboot的第一篇博文,基本项目环境搭建
本项目借助 SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA 进行开发
开一个web服务用于测试
配置文件application.yml,注意下面的配置信息,下面采用的是由我们自己来解析配置的方式
说明
上面配置介绍的是一种偏基础的es文档操作姿势,相比较于封装得更好的 spring-boot-starter-data-elasticsearch ,使用更加灵活
接下来我们基于 RestHighLevelClient 来操作es,首先第一步就是需要初始化这实例
注意上面的实现,用户名 + 密码并没有使用,当es设置了用户名、密码之后,是通过每次请求时,在请求头基于Basic Auth方式进行身份验证的;后面会介绍到
我们在本机搭建了一个es用于模拟测试,在上面的配置完之后,就可以直接与es进行交互了
下面是一个简单的使用姿势
注意上面的实现,有下面几个重要知识点
身份验证
采用Basic Auth方式进行身份校验,简单来说就是在请求头中添加一个
? key = Authorization
? value = "Basic " + base64(user + ":" + pwd)
访问姿势
上面是一个根据 id 查询文档的实例,简单可以理解为三步
?创建: XxRequest
?添加请求头: RequestOptions.Builder.addHeader
?执行: client.get(xxRequest, RequestOptions)
?工程:https://github.com/liuyueyi/spring-boot-demo
?源码:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/142-search-es
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
?一灰灰Blog个人博客 https://blog.hhui.top
?一灰灰Blog-Spring专题博客 http://spring.hhui.top
[1] 200605-Centos 安装ElasticSearch - 一灰灰Blog: https://blog.hhui.top/hexblog/2020/06/05/200605-Centos-%E5%AE%89%E8%A3%85ElasticSearch/ [2] 210329-Elastic & Kibana安装与基本使用 - 一灰灰Blog: https://blog.hhui.top/hexblog/2021/03/29/210329-Elastic-Kibana%E5%AE%89%E8%A3%85%E4%B8%8E%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/