范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

04SpringBoot入门教程使用模板引擎开发Web项目

  1. 前言
  模板引擎这个词,咋听起来,有点高大上的意味。
  实际上,模板引擎是非常平易近人的技术。譬如大家可能都比较熟悉的 JSP ,就是一种比较典型的模板引擎。
  当浏览器将请求抛给控制器,控制器处理好数据后,就跳转 JSP 等模板引擎页面。注意在跳转的同时,还会将数据组装好,也交给模板引擎处理。
  模板引擎会根据数据,和模板引擎的规则,动态生成 HTML 页面,最后返回给浏览器显示。 2. 模板引擎使用场景
  我们使用 Spring Boot 开发 Web 项目,大体上有两种方式。
  第一种方式,是后端服务化的方式,也是当前的主流方式。前端是静态的 HTML 页面,通过 Ajax 请求 Spring Boot 的后端接口。 Spring Boot 返回数据一般采用 JSON 格式,前端接收后将数据显示。
  第二种方式,是采取模板引擎的方式。前端的请求,到达 Spring Boot 的控制器后,控制器处理请求,然后将返回数据交给模板引擎。模板引擎负责根据数据生成 HTML 页面,最后将 HTML 返回给浏览器。
  我个人比较推荐第一种方式,说一下该方式的几个优点: 便于分工协作 :后端可以按自己的进度开发接口,前端可以开发页面,需要的时候直接调用后端 API ; 便于项目拓展 :比如前期是做的网站,后续要加一个 APP ,后端接口可以直接复用; 降低服务端压力 :后端只提供数据,一部分业务逻辑在前端处理了。服务端要做的事情少了,自然压力就小。
  本篇是讲模板引擎,也得说说模板引擎的优点,王婆卖瓜不能光夸草莓啊。模板引擎开发的页面,对搜索引擎 SEO 比较友好;还有就是简单的页面,如果用模板引擎开发速度比较快,毕竟模板化的方法,目的就是减少重复提高效率。 3. Spring Boot 中常用的模板引擎
  Spring Boot 支持的模板引擎种类很多,常见的有 FreeMarker 、 Thymeleaf 、 JSP 。
  因为这些模板引擎使用的用户都不少,所以我们逐一介绍下其实现过程。
  至于孰优孰劣,请各位看官自行评价。正所谓:尺有所短,寸有所长,各取所爱,万物生长! 4. 整体流程说明
  本篇我们开发一个商品浏览项目实例。
  此处说一个我个人的经验:在做一个项目或一个模块的时候,不要一开始就动手写代码,最好是谋定而后动。
  我们作为程序员,实际上是整个程序世界的总指挥。应该先整体规划,再实现局部。这种总分型的开发方法便于我们理顺思路,提高编码效率!
  编码如行军,先了解地形,设定整体作战计划,再派兵执行任务(图片来源于网络,版权归原作者所有)
  好的,我们来思考下,实现商品浏览项目实例的整体流程:
  整体流程
  可以看到,我们是先建立了控制器方法和页面,再去实现其中的具体细节。这样可以让我们的思维保持连贯性和整体性,在做一些页面和方法较多的项目时,会感觉更加顺畅。 5. 使用 FreeMarker
  我们按整体流程,使用 FreeMarker 模板引擎,来实现商品浏览功能。 5.1 创建 Spring Boot 项目并导入开发环境
  使用 Spring Initializr 创建项目,Spring Boot 版本选择 2.2.5 , Group 为  com.imooc   , Artifact 为  spring-boot-freemarker   ,生成项目后导入 Eclipse 开发环境。 5.2 在 pom.xml 中引入相关依赖
  引入 Web 项目及 FreeMarker 模板相关的依赖项,代码如下:
  实例:                               org.springframework.boot             spring-boot-starter-web                                        org.springframework.boot             spring-boot-starter-freemarker          5.3 创建控制器方法,指向商品页面
  创建控制器类,由于是商品相关的控制器,所以命名为 GoodsController ,代码如下:
  实例: /**  * 商品控制器  */ @Controller // 标注为控制器 public class GoodsController {     /**      * 获取商品列表      */     @RequestMapping("/goods") // 请求路径     public String goods() {         return "goods";// 跳转到goods.ftl页面     } } 代码块12345678910111213
  我们具体解释下该类的作用。 @Controller 注解标注在 GoodsController 类上,会为该类注册一个控制器组件,放入 Spring 容器中。该组件具备处理请求的能力,其中的方法可以响应 HTTP 请求; @RequestMapping ("/goods") 注解标注在方法 goods () 上,所以请求路径如果匹配  /goods   ,则由该方法进行处理; 返回值是字符串  "goods"   ,由于我们已经引入 FreeMarker 依赖,所以该返回值会跳转到 goods.ftl 页面。
  Tips:  注意需要在 application.properties 文件中设置模板文件的后缀,即:  spring.freemarker.suffix=.ftl   。如果不添加该配置,直接  return "goods.ftl";   会报错。 5.4 创建商品页面
  我们  resource/templates   目录下新建商品页面  goods.ftl   ,先不必实现具体功能,代码如下:
  实例:             商品列表   商品列表  
  此时我们启动项目,然后访问  http://127.0.0.1:8080/goods   ,即可显示对应页面内容。 5.5 在控制器方法中,调用服务方法获取商品信息,并将信息交给模板引擎处理
  定义商品类 GoodsDo 用来描述商品信息,注意 Do 表示数据模型对象(Data Object),代码如下:
  实例: /**  * 商品数据对象  */ public class GoodsDo {     /**      * 商品名称      */     private String name;     /**      * 商品价格      */     private String price;     /**      * 商品图片      */     private String pic;   // 省略get set方法 }
  然后我们编写服务类 GoodsService ,提供获取商品列表的方法。注意此处仅仅是演示模板引擎,并不需要访问数据库,直接返回一个指定内容的商品列表。
  实例: /**  * 商品服务  */ @Service // 为GoodsService注册一个组件 public class GoodsService {     public List getGoodsList() {         List list = new ArrayList();         GoodsDo goods = new GoodsDo();         goods.setName("苹果");         goods.setPic("apple.jpg");         goods.setPrice("3.5");         list.add(goods);         return list;     } }
  此时,我们的控制器就可以注入 GoodsService 类型的组件,然后调用其方法了。
  实例: @Controller public class GoodsController {     @Autowired     private GoodsService goodsService;// 自动装配      @RequestMapping("/goods") // 请求路径     public String goods(Model model) {         model.addAttribute("goodsList", goodsService.getGoodsList());// 交给模板引擎处理的数据         return "goods";// 跳转到goods.ftl页面     } }
  注意  model.addAttribute("goodsList", goodsService.getGoodsList());   ,我们将商品列表相关的数据交给模板引擎去处理。 5.6 在商品页面通过模板引擎规则显示商品信息
  此时我们可以根据 FreeMarker 模板引擎,按模板规则显示商品信息了。
  实例:             商品列表   商品列表: <#list goodsList as item> ${item.name}--${item.price}--${item.pic}   
  注意我们通过 FreeMarker 的模板语法,输出了商品列表信息。关于 FreeMarker 模板引擎更多的语法规则,感兴趣的同学可以后续查阅更多资料。 5.7 测试
  启动项目,打开浏览器访问  http://127.0.0.1:8080/goods   ,即可查看输出结果。 6. 使用 Thymeleaf
  Thymeleaf 和 FreeMarker ,都是模板引擎,使用方法基本类似。此处我们仅仅是给出一个范例,不再做过多的解释。 6.1 创建 Spring Boot 项目并导入开发环境
  使用 Spring Initializr 创建项目, Spring Boot 版本选择 2.2.5 , Group 为  com.imooc   , Artifact 为  spring-boot-thymeleaf   ,生成项目后导入 Eclipse 开发环境。 6.2 在 pom.xml 中引入相关依赖
  引入 Web 项目及 Thymeleaf 模板相关的依赖项。
  实例:                               org.springframework.boot             spring-boot-starter-web                                        org.springframework.boot             spring-boot-starter-thymeleaf          6.3 创建控制器方法,指向商品页面
  创建控制器类, GoodsController , Thymeleaf 直接使用 HTML 作为模板页面,故代码如下:
  实例: /**  * 商品控制器  */ @Controller // 标注为控制器 public class GoodsController {     /**      * 获取商品列表      */     @RequestMapping("/goods") // 请求路径     public String goods() {         return "goods.html";// 跳转到goods.html页面     } } 6.4 创建商品页面
  我们在  resource/templates   目录下新建商品页面  goods.html   ,先不必实现具体功能,代码如下:
  实例:             商品列表   商品列表  
  此时我们启动项目,然后访问  http://127.0.0.1:8080/goods   ,即可显示对应页面内容。 6.5 在控制器方法中,调用服务方法获取商品信息,并将信息交给模板引擎处理
  商品类 GoodsDo ,服务类 GoodsService ,这两个类与上面没有区别直接放出代码。
  实例: /**  * 商品数据对象  */ public class GoodsDo {     /**      * 商品名称      */     private String name;     /**      * 商品价格      */     private String price;     /**      * 商品图片      */     private String pic;   // 省略get set方法 }
  实例: /**  * 商品服务  */ @Service // 为GoodsService注册一个组件 public class GoodsService {     public List getGoodsList() {         List list = new ArrayList();         GoodsDo goods = new GoodsDo();         goods.setName("苹果");         goods.setPic("apple.jpg");         goods.setPrice("3.5");         list.add(goods);         return list;     } }
  好的,此时我们的控制器就可以注入 GoodsService 类型的组件,然后调用其方法了。
  实例: @Controller public class GoodsController {     @Autowired     private GoodsService goodsService;// 自动装配      @RequestMapping("/goods") // 请求路径     public String goods(Model model) {         model.addAttribute("goodsList", goodsService.getGoodsList());// 交给模板引擎处理的数据         return "goods.html";// 跳转到goods.html页面     } } 6.6 在商品页面通过模板引擎规则显示商品信息
  此时我们可以根据 Thymeleaf 模板引擎,按模板规则显示商品信息了。
  实例:     商品列表       商品列表:                                        
  注意我们通过 Thymeleaf 的模板语法,输出了商品列表信息。关于 Thymeleaf 模板引擎更多的语法规则,感兴趣的同学可以后续查阅更多资料。 6.7 测试
  启动项目,打开浏览器访问  http://127.0.0.1:8080/goods   ,即可查看输出结果。
  到此,大家基本上也能发现,这两种方式除了模板页面文件内容不同,其他地方基本都是一模一样的。
  也就是说,模板引擎主要负责通过一些模板标签,将控制器返回的数据解析为网页。 7. 使用 JSP
  注意 Spring Boot 官方已经不推荐使用 JSP 了,确实操作起来也比较麻烦。但是由于 JSP 用户体量还是比较大的,所以此处还是简单演示下,开发步骤与 FreeMarker / Thymeleaf 基本一致。 7.1 创建 Spring Boot 项目并导入开发环境
  使用 Spring Initializr 创建项目, Spring Boot 版本选择 2.2.5 , Group 为  com.imooc   , Artifact 为  spring-boot-jsp   ,生成项目后导入 Eclipse 开发环境。 7.2 在 pom.xml 中引入相关依赖
  引入 Web 项目及 JSP 模板相关的依赖项。
  实例:                               org.springframework.boot             spring-boot-starter-web                                        org.apache.tomcat.embed             tomcat-embed-jasper             provided                                        javax.servlet             jstl          7.3 创建控制器方法,指向商品页面
  创建控制器类, GoodsController ,代码如下:
  实例: /**  * 商品控制器  */ @Controller // 标注为控制器 public class GoodsController {     /**      * 获取商品列表      */     @RequestMapping("/goods") // 请求路径     public String goods() {         return "goods";// 跳转到goods.jsp页面     } } 7.4 创建商品页面
  手工添加  src/main/webapp   及子目录如下,同时目录下放一个 goods.jsp 用于测试。注意该目录是一个 Source Folder 源代码目录,不是普通文件夹目录。
  spring-boot-jsp 项目结构
  实例: <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>     商品列表  商品列表  
  注意,我们还需要添加一个视图解析器,实现 JSP 页面往指定目录跳转。
  实例: @SpringBootApplication public class SpringBootJspApplication {     public static void main(String[] args) {         SpringApplication.run(SpringBootJspApplication.class, args);     }     @Bean // 注册视图解析器     public InternalResourceViewResolver setupViewResolver() {         InternalResourceViewResolver resolver = new InternalResourceViewResolver();         resolver.setPrefix("/WEB-INF/jsp/");// 自动添加前缀         resolver.setSuffix(".jsp");// 自动添加后缀         return resolver;     } }
  此时我们启动项目,然后访问  http://127.0.0.1:8080/goods   ,即可显示对应页面内容。 7.5 在控制器方法中,调用服务方法获取商品信息,并将信息交给模板引擎处理
  商品类 GoodsDo ,服务类 GoodsService ,这两个类与上面没有区别直接放出代码。
  实例: /**  * 商品数据对象  */ public class GoodsDo {     /**      * 商品名称      */     private String name;     /**      * 商品价格      */     private String price;     /**      * 商品图片      */     private String pic;   // 省略get set方法 }
  实例: /**  * 商品服务  */ @Service // 为GoodsService注册一个组件 public class GoodsService {     public List getGoodsList() {         List list = new ArrayList();         GoodsDo goods = new GoodsDo();         goods.setName("苹果");         goods.setPic("apple.jpg");         goods.setPrice("3.5");         list.add(goods);         return list;     } }
  好的,此时我们的控制器就可以注入 GoodsService 类型的组件,然后调用其方法了。
  实例: @Controller public class GoodsController {     @Autowired     private GoodsService goodsService;// 自动装配      @RequestMapping("/goods") // 请求路径     public String goods(Model model) {         model.addAttribute("goodsList", goodsService.getGoodsList());// 交给模板引擎处理的数据         return "goods";// 跳转到goods.jsp     } } 7.6 在商品页面通过模板引擎规则显示商品信息
  此时我们可以根据 JSP 模板引擎,按模板规则显示商品信息了。
  实例: <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>     商品列表       商品列表:               ${item.name}--${item.price}--${item.pic}       
  注意我们通过 JSP 的模板语法,输出了商品列表信息。关于 JSP 模板引擎更多的语法规则,感兴趣的同学可以后续查阅更多资料。 7.7 测试
  启动项目,打开浏览器访问  http://127.0.0.1:8080/goods   ,即可查看输出结果。 8. 小结
  最后大家应该也发现了, FreeMarker 和 Thymeleaf 的用法几乎是一模一样的,而 JSP 还需要手工添加一些目录和配置。
  三种方式各有优劣, FreeMarker 模板语法比较简洁, Thymeleaf 可以直接使用 HTML 作为模板文件, JSP 用户群体广泛。
  但是三种方式,都是一种模板引擎而已,将控制器返回数据转化为 HTML 页面显示,本质上没啥区别,大家对模板引擎有一个了解即可。

自研芯片有多快?小米12Pro成为手机充电速度天花板在这个手机不离手的时代,手机成为我们日常生活交流的必需品,也是我们维持安全感的必要品,一个有电的手机,对我们来说是相当重要的。没有电的手机,就如同一块儿板砖,所以在购机时,手机的充周杰伦霸榜AppleMusic中国,华语音乐没落?一则有关音乐的新闻报道,周杰伦的歌曲霸榜了AppleMusic中国。有人说华语音乐没落了,一看都是旧音乐。前十首就有九首是周杰伦的歌曲,另外一首还是英文歌曲。无可否认,周杰伦的歌曲苹果即将发布千元机?安卓阵营将流失一大波用户了很多人说,iPhoneSE自出现以来,就是在不停地复刻,比如说第一代iPhoneSE复刻了iPhone6s,iPhoneSE2复刻了iPhone8,这个复刻仅仅说是在大多数配置上的本土汽车芯片多路出击现在汽车正在朝着新能源电动汽车和自动驾驶这两大方向发展。这两大行业趋势催生了对汽车半导体种类的多种需求和对性能的高要求。在电动汽车的发展和自动驾驶辅助系统(ADAS)的引入的带动下索尼等日本电视机,在国内市场越老越小,小米海信时代变了继中国电视在印度开售,一分钟全被抢光之后,网上再次传出两位美国人,为了争抢中国制造的一台液晶电视机,在超市扭打起来的消息。时代变了,这样中国制造盛况,让不少国人倍感自豪。不过,看外抛弃SIM实体卡?苹果或于2023年在iPhone15Pro强制推行eSIM苹果的iPhone向来都能引领手机厂商的发展方向,比如取消microSD存储卡的扩展,取消3。5mm有线耳机接口,许多安卓旗舰手机也都跟风这些设计,仅在中低端的机型上延续存储卡扩展互联网巨头内卷新战场房产中介钱钟书先生说过,婚姻是一座围城,城外的人想进去,城里的人想出来。地产圈又何尝不是。圈里的巨头辞官归故里。某头部房企宣布从房地产向新能源汽车转型的话音未落,又一千亿房企官宣告别房地产沃尔沃正在测试世界上第一台应用于林业的遥控轮式装载机记者李亦萌编辑沃尔沃集团(VolvoAB)旗下沃尔沃建筑设备公司表示,已在最具挑战性的应用场景中,对远程控制技术进行了测试。沃尔沃方面也由此成为全球第一家在林业环境中通过5G网络远国内巨头开始反扑,再获海外5G订单,任正非华为不会完的华为被打压的事情可以说即是给中企敲响了警钟,也是给了前车之鉴。想要走的长远核心技术肯定是最重要的,可一旦有些成效,就很有可能会跟华为一样,也被老美盯上,从而进行卡脖子。不过从目前的吉利集团将推出网约车聚合平台幸福千万家,主打合规运力IT之家12月2日消息,随着滴滴上市之后引发的一系列事件,各大厂商都好似嗅到血腥味的鲨鱼一般,不约而同地开发自己的平台。界面新闻援引接近吉利控股集团人士称,吉利集团将推出网约车聚合对标苹果!小米12的屏幕充电相机扬声器都比iPhone13好小米科技推出了一款小屏旗舰手机小米12,这也是小米对标苹果旗下iPhone13的一款产品那么,相比iPhone13,小米12的优势在哪里呢?首先是屏幕,小米12采用的是一块6。28
大家有没有什么靠谱一点的兼职,能推荐一下?靠谱点的兼职还是很多的,比如自己周围一些商店的临时工,外卖,快递,跑腿这些都可以,做个临时兼职也不是不可以,也可以利用自身一技之长入住平台,比如一下家装安装,装修等接单平台。也可以不太可靠证实正误方法之一证实自然学科理论证明正误的一个不太可靠方法为了证实一个自然学科理论的正误,常用的方法。就是用这个理论对某种实际过程产生的结果,做出一个预测。然后,人类设计出一种可测量方法。去测量这该来的还是来了,英国正式表态,拦不住了5G,是当下全球发展的主要潮流,5G,更是国货华为的王牌业务。大洋彼岸的美国,为了保住自己的伟大,费尽几年的光阴,却不是想着要怎样发展进步,而是一门心思想着要怎样给华为5G增加一点华为芯片电源(PSIP电源)华为有电源芯片卖吗?没有。目前华为的电源芯片主要是给自己用,没有外卖。但是华为有芯片电源在卖,内部叫PSIP芯片电源,总共有6款,电流分别是3A,3A,6A,6A,17A,20A。270个蓝莓星系和388个紫葡萄星系被发现中国科学院国家天文台等单位的研究人员新发现了1417个致密星系,其中包括739个绿豌豆星系270个蓝莓星系和388个紫葡萄星系。在图像上呈现蓝色的蓝莓星系和呈现紫色的紫葡萄星系是比活得凉爽寿命变长如何延缓衰老?衰老的秘密是什么?在这些问题上,科学家不遗余力地探索答案。有假说指出,限食条件下许多动物的代谢率降低,会显著延长动物寿命,暗示衰老和寿命可能与代谢率有关。然而,代谢率使用最新淘宝镜像及node常用命令笔记临时使用npmregistryhttpregistry。npmmirror。cominstallxxx永久使用npmconfigsetregistryhttpregistry。np学编程,年龄不是问题!世界上年龄最大的程序员,竟已87岁提起程序员,大家都会想到技术大佬高收入。不过,程序员虽然收入高,但退休年龄也早。据统计,世界上一些著名IT公司的程序员平均年龄只有35岁,比如,苹果公司的平均年龄是31岁,Face创维2021年实现营收509。28亿元显示器品牌成增长新路径3月23日,创维集团公布2021年度业绩。年内,创维集团实现营收人民币509。28亿元,同比增长27。0。其中,智能电视系统产品在中国大陆市场的营业额录得人民币129。49亿元,较显卡报价雪崩?实探深圳华强北降价明显,店家还会继续降!点蓝字关注,不迷路最近显卡降价了,但我还不打算买,有人说可以继续等。近期,由于各种因素叠加,显卡价格出现明显下跌,不过游戏爱好者小王并不急着购买,加上市面上RTX40系曝光的消息,鹿客3D人脸智能锁S50F3D人脸识别从2。0时代进化到3。0时代CSHIAResearch发布的2020中国智能家居生态发展白皮书数据显示,从智能家居爆款产品的使用频率来看,智能锁的使用频率为18。14位居第二,仅低于智能家电1。47个百分点,