掌握移动端套餐列表页动态展示实现过程
掌握移动端套餐详情页
掌握Freemarker页面静态化技术
能够使用Freemarker生成html静态页面
能够搭建移动端开发环境
开发需求
环境搭建
预约流程如下:
1、访问移动端首页
2、点击体检预约进入体检套餐列表页面
3、在体检套餐列表页面点击具体套餐进入套餐详情页面
4、在套餐详情页面点击立即预约进入预约页面
效果如下图:
体检预约-->套餐列表-->套餐详情-->立即预约(发送手机验证码+Redis)
移动端工程搭建
创建healthmobile_web工程,导入坐标(依赖health_interface)
导入页面
配置web.xml(springmvc的核心控制器+post请求乱码过滤器)
创建springmvc.xml(配置dubbo,驱动注解)
导入通用组件
在health_parent工程的pom.xml文件中导入阿里短信发送的maven坐标
1:pom.xml
2:静态资源(CSS、html、img等)
3:web.xml
4:springmvc.xml
5:spring-jedis.xml
6:redis.properties
7:log4j.properties
1:ValidateCodeUtils工具类:(产生验证码)
2:SMSUtils工具类:(短信服务,用于发送短消息服务(SMS))
3:RedisMessageConstant常量类:
【讲解】
在health_common工程中导入如下通用组件
packagecom.itheima.health.utils;importjava.util.Random;/***随机生成验证码工具类*/publicclassValidateCodeUtils{/***随机生成验证码*@paramlength长度为4位或者6位*@return*/publicstaticIntegergenerateValidateCode(intlength){Integercode=null;if(length4){code=newRandom().nextInt(9999);//生成随机数,最大为9999if(code<1000){code=code+1000;//保证随机数为4位数字}}elseif(length6){code=newRandom().nextInt(999999);//生成随机数,最大为999999if(code<100000){code=code+100000;//保证随机数为6位数字}}else{thrownewRuntimeException("只能生成4位或6位数字验证码");}returncode;}/***随机生成指定长度字符串验证码*@paramlength长度*@return*/publicstaticStringgenerateValidateCode4String(intlength){Randomrdm=newRandom();Stringhash1=Integer.toHexString(rdm.nextInt());Stringcapstr=hash1.substring(0,length);returncapstr;}}
-->创建工程-->导入坐标-->页面-->配置文件(web.xml、springmvc.xml、spring-jedis.xml)
-->导入通用组件(生成验证码、发送短信工具类、Redis存储常量类)
实现套餐列表功能
点击“体检预约”,跳转到“套餐列表”页面
1:前台代码编写
在/pages/setmeal.html,在mounted()钩子函数里面
完成需求:1.使用axios请求服务器,获得数据进行模型绑定2.数据遍历(v-for)2:后台代码编写
1.创建类SetmealMobileController.java
2.创建类SetmealService.java
3.创建类SetmealServiceImpl.java
4.创建类SetmealDao.java
5.创建配置文件SetmealDao.xml
完成需求:1:查询所有的套餐【讲解-需求】移动端首页为/pages/index.html,效果如下:
(1)在web.xml中配置:
(3)点击体检预约直接跳转到体检套餐列表页面(/pages/setmeal.html)
(1)setmeal.html,遍历v-for="setmealinsetmealList"
mounted钩子和created钩子
mounted钩子:页面被初始化后执行
created钩子:vue模型被初始化后执行
mounted钩子是在created钩子后面执行的。
在healthmobile_web工程中创建SetmealMobileController并提供getSetmeal方法,在此方法中通过Dubbo远程调用套餐服务获取套餐列表数据
packagecom.itheima.health.controller;importcom.alibaba.dubbo.config.annotation.Reference;importcom.itheima.health.constant.MessageConstant;importcom.itheima.health.entity.Result;importcom.itheima.health.pojo.Setmeal;importcom.itheima.health.service.SetmealService;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.List;@RestController@RequestMapping("/setmeal")publicclassSetmealMobileController{@Reference//(check=false)privateSetmealServicesetmealService;//获取所有套餐信息@RequestMapping("/getSetmeal")publicResultgetSetmeal(){try{List
在SetmealService服务接口中扩展findAll方法
List
在SetmealServiceImpl服务实现类中实现findAll方法
publicList
在SetmealDao接口中扩展findAll方法
在SetmealDao.xml映射文件中扩展SQL语句
套餐列表功能需要展示发布的所有套餐,用于体检人选择指定套餐。
套餐详情页面动态展示
在套餐详情页面需要展示当前套餐的信息(包括图片、套餐名称、套餐介绍、适用性别、适用年龄)、此套餐包含的检查组信息、检查组包含的检查项信息等。
前台代码编写
在/pages/setmeal_detail.html
完成需求:1.获取请求参数中套餐id的值2.获取套餐详细信息3.展示套餐信息(套餐信息、检查组集合、检查项集合)后台代码编写
1.类SetmealMobileController.java
2.类SetmealService.java
3.类SetmealServiceImpl.java
4.类SetmealDao.java
类CheckGroupDao
类CheckItemDao
5.配置文件SetmealDao.xml
配置文件CheckGroupDao.xml
配置文件CheckItemDao.xml
完成需求:1:根据套餐id查询对应的套餐信息2:查询每个套餐对应的检查组集合3:查询每个检查组对应的检查项集合【讲解-需求】前面我们已经完成了体检套餐列表页面动态展示,点击其中任意一个套餐则跳转到对应的套餐详情页面(/pages/setmeal_detail.html),并且会携带此套餐的id作为参数提交。
(1)在页面中已经引入了healthmobile.js文件,此文件中已经封装了getUrlParam方法可以根据URL请求路径中的参数名获取对应的值
(2)在setmeal_detail.html中调用上面定义的方法获取套餐id的值
1:{{setmeal.name}}:套餐信息
2:v-for="checkgroupinsetmeal.checkGroups:检查组信息
3:v-for="checkitemincheckgroup.checkItems":检查项信息
在SetmealMobileController中提供findById方法
//根据id查询套餐信息@RequestMapping("/findById")publicResultfindById(intid){try{Setmealsetmeal=setmealService.findById(id);returnnewResult(true,MessageConstant.QUERY_SETMEAL_SUCCESS,setmeal);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.QUERY_SETMEAL_FAIL);}}
在SetmealService服务接口中提供findById方法
SetmealfindById(intid);3.2.3.服务实现类在SetmealServiceImpl服务实现类中实现findById方法
publicSetmealfindById(intid){returnsetmealDao.findById(id);}
1:在SetmealDao接口中提供findById方法
SetmealfindById(intid);2:在CheckGroupDao接口中提供findCheckGroupListById方法
List
List
此处会使用mybatis提供的关联查询,在根据id查询套餐时,同时将此套餐包含的检查组都查询出来,并且将检查组包含的检查项都查询出来。
1:SetmealDao.xml文件:
或者使用联合查询的sql语句
SELECTc.*FROMt_checkgroupc,t_setmeal_checkgroupscWHEREc.id=sc.checkgroup_idANDsc.setmeal_id=#{id}3:CheckItemDao.xml文件:
SELECTci.*FROMt_checkitemci,t_checkgroup_checkitemcgciWHEREci.id=cgci.checkitem_idANDcheckgroup_id=#{id}测试效果:
1:掌握sql语句的联合查询(sql语句的嵌套查询),应用在多对多场景2:掌握使用
也可以使用Java代码编写业务封装逻辑操作
1:SetMealDao.java
SetmealfindById(Integerid);2:CheckGroupDao.java
List
List
第一步:在SetmealServiceImpl.java中
@AutowiredCheckGroupDaocheckGroupDao;@AutowiredCheckItemDaocheckItemDao;@OverridepublicSetmealfindById(Integerid){Setmealsetmeal=setmealDao.findById(id);List
CheckGroupDao.xml
CheckItemDao.xml
2:什么是Freemarker
3:Freemarker的操作入门
1:什么是页面静态化技术(作用:用于减少查询数据库的频率)
2:什么是Freemarker(作用:可生成html静态资源文件,从而达到减少查询数据库的频率)
3:Freemarker入门案例
(1)搭建环境
(2)创建模板文件
(3)使用模板文件,生成静态文件
(1)assign指令
(2)include指令
(3)if指令
(4)list指令
本章课程中我们已经实现了移动端套餐列表页面和套餐详情页面的动态展示。但是我们需要思考一个问题,就是对于这两个页面来说,每次用户访问这两个页面都需要查询数据库获取动态数据进行展示,而且这两个页面的访问量是比较大的,这就对数据库造成了很大的访问压力,并且数据库中的数据变化频率并不高。那我们需要通过什么方法为数据库减压并提高系统运行性能呢?答案就是页面静态化。
页面静态化其实就是将原来的动态网页(例如通过ajax请求动态获取数据库中的数据并展示的网页)改为通过静态化技术生成的静态网页,这样用户在访问网页时,服务器直接给用户响应静态html页面,没有了动态查询数据库的过程。
那么这些静态HTML页面还需要我们自己去编写吗?其实并不需要,我们可以通过专门的页面静态化技术帮我们生成所需的静态HTML页面,例如:Freemarker、thymeleaf等。
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java等。
创建maven工程并导入Freemarker的maven坐标
1、文本,直接输出的部分2、注释,即<#--...-->格式不会输出3、插值(Interpolation):即${..}部分,将使用数据模型中的部分替代输出4、FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出
Freemarker的模板文件后缀可以任意,一般建议为ftl。
在D盘创建ftl目录,在ftl目录中创建名称为test.ftl的模板文件,内容如下:
第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker的版本号。
第二步:设置模板文件所在的路径。
第三步:设置模板文件使用的字符集。一般就是utf-8。
第四步:加载一个模板,创建一个模板对象。
第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
第六步:创建一个Writer对象,一般创建FileWriter对象,指定生成的文件名。
第七步:调用模板对象的process方法输出文件。
第八步:关闭流。
publicstaticvoidmain(String[]args)throwsException{//1.创建配置类Configurationconfiguration=newConfiguration(Configuration.getVersion());//2.设置模板所在的目录configuration.setDirectoryForTemplateLoading(newFile("D:\\ftl"));//3.设置字符集configuration.setDefaultEncoding("utf-8");//4.加载模板Templatetemplate=configuration.getTemplate("test.ftl");//5.创建数据模型Mapmap=newHashMap();map.put("name","张三");map.put("message","欢迎来到传智播客!");//6.创建Writer对象Writerout=newFileWriter(newFile("d:\\test.html"));//7.输出template.process(map,out);//8.关闭Writer对象out.close();}上面的入门案例中Configuration配置对象是自己创建的,字符集和模板文件所在目录也是在Java代码中指定的。在项目中应用时可以将Configuration对象的创建交由Spring框架来完成,并通过依赖注入方式将字符集和模板所在目录注入进去。
assign指令用于在页面上定义一个变量
(1)定义简单类型
<#assignlinkman="周先生">联系人:${linkman}(2)定义对象类型
(1)创建模板文件head.ftl
黑马程序员
(2)修改入门案例中的test.ftl,在test.ftl模板文件中使用include指令引入上面的模板文件<#include"head.ftl"/>4.4.3.if指令if指令用于判断
(1)在模板文件中使用if指令进行判断
<#ifsuccess=true>你已通过实名认证<#else>你未通过实名认证#if>(2)在java代码中为success变量赋值
map.put("success",true);在freemarker的判断中,可以使用=也可以使用
if指令可以配合assignsuccess=true使用
<#assignsuccess1=true><#ifsuccess1=true>你已通过实名认证1<#else>你未通过实名认证1#if>
list指令用于遍历
(1)在模板文件中使用list指令进行遍历
<#listgoodsListasgoods>商品名称:${goods.name}价格:${goods.price}
#list>(2)在java代码中为goodsList赋值
ListgoodsList=newArrayList();Mapgoods1=newHashMap();goods1.put("name","苹果");goods1.put("price",5.8);Mapgoods2=newHashMap();goods2.put("name","香蕉");goods2.put("price",2.5);Mapgoods3=newHashMap();goods3.put("name","橘子");goods3.put("price",3.2);goodsList.add(goods1);goodsList.add(goods2);goodsList.add(goods3);map.put("goodsList",goodsList);【小结】1:什么是页面静态化技术(作用:用于减少查询数据库的频率)
(3)if指令(常用)
(4)list指令(常用)
前面我们已经学习了Freemarker的基本使用方法,下面我们就可以将Freemarker应用到项目中,帮我们生成移动端套餐列表静态页面和套餐详情静态页面。接下来我们需要思考几个问题:
(1)什么时候生成静态页面比较合适呢?
(2)将静态页面生成到什么位置呢?
(3)应该生成几个静态页面呢?
对于第一个问题,应该是当套餐数据发生改变时,需要生成静态页面,即我们通过后台系统修改套餐数据(包括新增、删除、编辑)时。
对于第二个问题,如果是在开发阶段可以将文件生成到项目工程中,如果上线后可以将文件生成到移动端系统运行的tomcat中。
对于第三个问题,套餐列表只需要一个页面就可以了,在这个页面中展示所有的套餐列表数据即可。套餐详情页面需要有多个,即一个套餐应该对应一个静态页面。
1:在传智健康前端系统中使用页面静态化Freemarker技术
2:套餐列表使用Freemarker
3:套餐详情使用Freemarker
1:环境搭建
2:创建模板文件
(1)mobile_setmeal.ftl
(2)mobile_setmeal_detail.ftl
3:spring整合Freemarker
(1)freemarker.properties
(2)applicationContext-freemarker.xml
4:生成静态页面
生成静态页面的时机,在新增套餐的时候生成静态页面(套餐列表及套餐详情)
在health_parent工程的pom文件中导入Freemarker的maven坐标
注意2:改变七牛云的地址。
注意3:上面模板文件中每个套餐对应的超链接如下:
如果套餐的id为1,则对应的超链接地址为setmeal_detail_1.html;
如果套餐的id为5,则对应的超链接地址为setmeal_detail_5.html。
所以我们需要为每个套餐生成一个套餐详情静态页面。
(1)在health_service工程中创建属性文件freemarker.properties
out_put_path=D:/ideaProjects/health_parent/health_mobile/src/main/webapp/pages通过上面的配置可以指定将静态HTML页面生成的目录位置
(2)在health_service工程的Spring配置文件中配置,创建applicationContext-freemarker.xml