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

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 页面显示,本质上没啥区别,大家对模板引擎有一个了解即可。

界读丨量子芯片的主要障碍有哪些?欧界报道长期以来,在量子领域的发展中存在着这样一个主要障碍如何可靠地控制量子计算机芯片中的数百万个量子位。近期,悉尼某大学的量子工程师提出了一个全新的方法解答,经过测试,能够有效克首次超越人类!读图会意这件事,AI比你眼睛更毒辣达摩院金磊发自凹非寺量子位报道公众号QbitAI在超越人类这件事上,AI又拿下一分。就在最近,国际权威机器视觉问答榜单VQALeaderboard,更新了一项数据AI在读图会意任务中,准梦幻与浪漫的结合,大概就是vivoS10Pro的样子放眼目前的手机市场,手机的配色与后盖设计可谓五花八门,而最近却有一款手机吸引了众多颜控的注意,那就是vivoS系列的最新款vivoS10系列。有关注vivoS系列的伙伴就知道,这个麒麟710,纯纯国产ampampquot芯ampampquot美国封锁华为芯片行业导致台积电不能给华为代工,华为继麒麟9000e后就没推出全新的芯片,华为面对打压没有低头推出了新入门级处理器麒麟710,中芯国际作为中国最先进的半导体企业代工了新款诺基亚7210曝光,这颜值真有高端那味儿了每次看到诺基亚的新概念机真的都为之震撼,but,从来没有见过这些概念机的庐山真面目。每次都只是短暂的概念了一下,然后就匆匆的从我们的视线之中消失,所以每次总觉得这些爆料的真实性也不当你忽视这些主板参数越买就越亏身为核心硬件之一的主板经常被用户忽视,者有很大一部分原因是因为主板的结构太过复杂,购买时需要注意东西太多,萌新不容易看懂,接下来笔者就整理一下主板中需要重视的参数,让大家购买时少走iPhone6爆改,原来可以像玩车一样iPhone6刚出来的时候,很多果粉购买的是16GB配置的,因为在那时候16GB的储存空间是可以满足大部分用户的,哪怕存储空间不太够也只能省着用,毕竟苹果公司对不同配置存储空间的同中国突破氢能源汽车瓶颈,氢气固态存储及安全运输技术别具一格中国突破氢能源汽车瓶颈!氢气固态储存技术被女博士搞定。氢气是世界公认的清洁能源,标准的0排放。氢燃料电池汽车是以氢为主要能量作为移动的汽车,氢燃料电池和电动机成为汽车的引擎。氢燃料确保企业向加速向云端迁移的路线图事实表明,采用应对云计算服务中潜在危险的安全程序可以帮助企业保护敏感信息,并降低威胁风险。随着技术的突飞猛进,基于云计算的服务为走上数字化转型之旅的企业提供了新的视野。根据调研机构时代开拓者!三星折叠屏新机GalaxyZFold35G评测伴随着8月的到来,三星全新的折叠屏产品GalaxyZFold35G如约而至,它带来了更成熟的交互和更实用的体验。三星盖乐世社区抢先拿到了这款产品,下面,我就带大家一起看下这款产品有网件路由器RAX50(NetgearNighthawkRAX50)路由器评测RAX50的参数具体参数可以看下面信息产品型号RAX50天线数量4组无线传输速率2。4GHz2x2MUMIMO,支持2040MHz频宽,理论最高速度可达600Mbps。5GHz4x
正反馈效应的典范同轴圈铁个性化降噪耳机声阔小金腔我们这代人,小时候总会有个学雷锋的活动,如我这种平凡小学生,限于当时有限的能耐和想象力,大家会组团扶老奶奶过马路,导致这一天里很多老奶奶明明不想过马路,恨不得都被架着在马路上跑六个来啊,来跟我们发烧友玩枪斗术啊!海贝FC5正经评测让子弹拐弯是有原理的,就是射手在子弹出膛的一刹那,手腕极速抖动,这种抖动给了子弹一个水平的加速度,从而形成了一个弧线,这就是枪斗术。说实话,我一直不是很喜欢发烧友这三个字,因为这仨我有个朋友告诉我说,威泽HE03Al是条超越预期的三单元圈铁这世界上,一年买好些副耳机的音频器材爱好者,毕竟是极少数,我认识的更多数是这样的人上学和刚工作那会儿,兴趣比较多精力比较足,会挺舍得给兴趣花钱。游戏机数码相机便携CD耳机这些大男孩属于年轻人的OPPOEncoAir,均衡无短板的入门级TWS真无线这个品类的耳机,它是属于年轻人的。我问过一些朋友,他们给长辈推荐真无线的努力,很多都是以失败而告终的老人家的思维很淳朴,他们大多觉得这东西又分三个零件看着就会容易丢容易坏,又家居好物分享,我的宝藏小吉食品冰箱Hello姐妹们好啊,前段时间正好是新年假期,我们家囤了不少的食物,把整个冰箱都塞满了,之后买零食或者是水果都没有地方放了,还挺苦恼的,我就买了一个小巧一点的迷你冰箱。我买的是小吉小米新机销量突破!性价比绝了!居然还有优惠华为手机的芯片供应链被斩断已是众所周知的了,但在近期,华为准备新出的华为Mate50系列上,却意外爆出了将搭载5G技术的消息,这一点让很多支持华为的朋友们很是高兴,但我不由有些忧虑qdcDmagicsolo单单元微动圈耳机,拼命内卷依旧学不来葛优瘫点击此处添加图片说明文字在我们生活中,或多或少都会遇到这种情况你走在大街上,或者坐在火车大巴的时候,一个年轻人笔挺挺的路过,你扫了一眼,心里跟自己说嗯,应该是个军人。中国的军人,哪好音响的四要音质音色,音场音像声拓电子音爵士好音响的四要音质音色,音场音像声拓电子音爵士想法1好的机器和音响音乐,一放就可马上知道大概,静下心来听,如刚开始放的geogewinston的钢琴就是可听到音质音色(就是声音就像演最美逆行者丨暴雨中的河南这几天河南经历了百年一遇的特大降水,据统计,河南的一个小时降水量相当于150西湖的水在一个小时内全部倒进河南。其中,郑州市是降雨的中心。大水淹没了城市,仿佛上天已经放弃了郑州。但是有哪些劣迹斑斑,最后洗白了的明星?说真的,我稍微深入了解了一下娱乐圈,我就受不了了,那么多恶心人的明星现在能出现,我真的佩服。只能说,以后追星,要睁大眼睛,先去了解一下,别看人家好看就无脑追了,有些明星真的劣迹斑斑你和LOL大神只差一步!学会它,让你秒变大神英雄联盟这款游戏我想大家都非常熟悉,相信不少小伙伴都是钻石大师段位的高手。我们经常会在短视频平台刷到各种大神的操作视频,而有时我们打出了操作却不会剪辑,使得我们不能分享出来。别着急