版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
模块八用户端-体检预约《JavaEE企业级应用开发项目教程(SSM)》知识目标/Target了解FreeMarker,能够简述FreeMarker的作用和生成文件的原理熟悉FreeMarker的常用指令,能够在FTL标签中正确使用assign指令、include指令、if指令和list指令技能目标/Target掌握显示套餐详情功能的实现掌握体检预约功能的实现掌握静态页面的实现方式,能够使用FreeMarker技术实现套餐列表与套餐详情页面的静态化掌握显示套餐列表功能的实现章节概述/
Summary体检是了解自身健康状况、及时发现身体异常,以及预防疾病的重要手段之一。为了给广大体检用户提供便利,传智健康用户端设立了线上体检预约服务,用户可以随时随地进行体检预约。传智健康的用户端可以展示套餐列表、套餐详情和进行体检预约。接下来,本模块将对用户端的体检预约进行详细讲解。目录/Contents01020304套餐列表套餐详情体检预约页面静态化套餐列表8-1任务描述在浏览器中访问用户端首页index.html。体检套餐是传智健康面向体检用户销售的产品,为了让用户全方位地了解体检套餐的种类,传智健康用户端提供套餐列表页面供用户浏览。任务描述在用户端首页单击“体检预约”超链接后会跳转到套餐列表页面setmeal.html,该页面以列表的形式展示所有的体检套餐。任务分析访问套餐列表页面setmeal.html时,提交查询所有套餐的请求。(3)查询套餐SetmealServiceImpl类中重写SetmealService接口的findAll()方法查询所有的套餐。(2)接收和处理查询所有套餐的请求控制器类SetmealController的getSetmeal()方法接收页面提交的请求。(4)查询结果展示setmeal.html页面根据返回结果展示查询到的所有的套餐。(1)提交查询所有套餐的请求任务分析套餐列表的实现过程任务实现要实现在访问setmeal.html页面时展示所有的套餐,可以将查询的操作定义在钩子函数created()中,在created()函数中使用Axios发送异步请求的方式获取所有的套餐数据。<scriptsrc="../plugins/vue/axios-0.18.0.js"></script><script>varvue=newVue({
created(){
axios.post("/setmeal/getSetmeal.do").then((response)=>{if(response.data.flag){this.setmealList=response.data.data;}});}});</script>引入js文件数据双向绑定(1)提交查询所有套餐的请求任务实现在health_mobile模块的com.itheima.controller包下创建控制器类SetmealController,在类中定义getSetmeal()方法,用于接收和处理查询所有套餐的请求。@RestController@RequestMapping("/setmeal")publicclassSetmealController{@ReferenceprivateSetmealServicesetmealService;@RequestMapping("/getSetmeal")publicResultgetSetmeal(){try{List<Setmeal>list=setmealService.findAll();returnnewResult(true,MessageConstant.QUERY_SETMEAL_SUCCESS,list);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.QUERY_SETMEAL_FAIL);}}}(2)实现查询套餐控制器任务实现在health_interface子模块的SetmealService接口中定义findAll()方法,用于查询套餐列表。//查询套餐列表publicList<Setmeal>findAll();(3)创建查询套餐服务任务实现在health_service_provider子模块的SetmealServiceImpl类中重写接口的findAll()方法,用于查询套餐列表。@OverridepublicList<Setmeal>findAll(){
returnsetmealDao.findAll();//调用持久层接口查询套餐}(4)实现查询套餐服务任务实现在health_service_provider子模块的SetmealDao接口中定义findAll()方法,用于查询所有套餐。//查询所有套餐publicList<Setmeal>findAll();(5)实现持久层查询套餐在health_service_provider子模块的SetmealDao.xml映射文件中使用<select>元素映射查询语句,查询所有的套餐数据。<!--获取所有套餐信息--><selectid="findAll"resultType="com.itheima.pojo.Setmeal">SELECT*FROMt_setmeal</select>任务实现启动Zookeeper服务,在IDEA依次启动health_service_provider和health_mobile,在浏览器中访http://localhost/pages/setmeal.html。(6)测试套餐列表功能套餐详情8-2任务描述用户想要了解套餐的所有检查组和检查项,可以访问套餐详情页面setmeal_detail.html,在页面上查看套餐的详细信息。任务分析访问setmeal_detail.html页面,提交查询套餐详细信息的请求。(3)查询套餐详细信息SetmealServiceImpl类中重写SetmealService接口的findSetmealById()方法查询套餐详细信息。(2)接收和处理查询套餐详细信息的请求SetmealController类的findById()方法接收页面提交的请求。(4)查询结果展示setmeal_detail.html页面根据返回结果展示查询的套餐详细信息。(1)提交查询套餐详细信息的请求任务分析套餐详情的实现过程任务实现将查询的操作定义在钩子函数created()中,在created()函数中通过使用Axios发送异步请求的方式查询套餐详细信息。<scriptsrc="../plugins/vue/axios-0.18.0.js"></script><script>varvue=newVue({
created(){
axios.post("/setmeal/findById.do?id="+id).then((response)=>{if(response.data.flag){this.setmeal=response.data.data;this.imgUrl='/'+this.setmeal.img;}});}});</script>数据双向绑定(1)提交查询套餐详细信息的请求任务实现在health_mobile模块的SetmealController类中定义findById()方法,用于接收和处理查询套餐详细信息的请求。//根据套餐id查询套餐详情,包含(套餐基本信息、套餐关联的检查组、检查组关联的检查项)@RequestMapping("/findById")publicResultfindById(Integerid){try{
Setmealsetmeal=setmealService.findById(id);returnnewResult(true,MessageConstant.QUERY_SETMEAL_SUCCESS,setmeal);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.QUERY_SETMEAL_FAIL);}}(2)实现查询套餐详细信息控制器任务实现在health_interface子模块的SetmealService接口中定义findSetmealById()方法,用于根据套餐id查询套餐详细信息。//查询套餐详情publicSetmealfindSetmealById(Integerid);(3)创建查询套餐详细信息服务任务实现在health_service_provider子模块的SetmealServiceImpl类中重写SetmealService接口的findSetmealById()方法,用于根据套餐id查询套餐详细信息。@OverridepublicSetmealfindSetmealById(Integerid){
returnsetmealDao.findById4Detail();//调用持久层查询套餐详情}(4)实现查询套餐详细信息服务任务实现在health_service_provider子模块的SetmealDao接口中定义findById4Detail()方法,用于根据套餐id查询套餐详细信息。//查询套餐列表publicSetmealfindById4Detail(Integerid);(5)实现持久层查询套餐详细信息任务实现在health_service_provider子模块的SetmealDao.xml映射文件中使用<select>元素映射查询语句,根据套餐id查询套餐详细信息。<resultMapid="baseResultMap"type="com.itheima.pojo.Setmeal"><idcolumn="id"property="id"/><resultcolumn="name"property="name"/>
</resultMap><!--配置多对多映射关系--><resultMapid="findByIdResultMap"extends="baseResultMap"type="com.itheima.pojo.Setmeal"><!--column用于指定将哪个字段的值传递给第二条sql--><collectionproperty="checkGroups"ofType="com.itheima.pojo.CheckGroup"column="id"select="com.itheima.dao.CheckGroupDao.selectCheckGroupsBySetmealId"></collection></resultMap><!--根据套餐id查询套餐详情(包含基本信息、关联的检查组、检查项信息)--><selectid="findById4Detail"parameterType="int"resultMap="findByIdResultMap">SELECT*FROMt_setmealWHEREid=#{id}</select>(5)实现持久层查询套餐详细信息任务实现在health_service_provider子模块的CheckGroupDao.xml映射文件中使用<select>元素映射查询语句,根据套餐id查询套餐对检查组的引用。<resultMapid="baseResultMap"type="com.itheima.pojo.CheckGroup"><idcolumn="id"property="id"/><resultcolumn="name"property="name"/>
</resultMap><!--配置多对多映射关系--><resultMapid="findByIdResultMap"extends="baseResultMap"type="com.itheima.pojo.CheckGroup"><collectionproperty="checkItems"ofType="com.itheima.pojo.CheckItem"column="id"select="com.itheima.dao.CheckItemDao.findCheckItemsByCheckGroupId"></collection></resultMap><!--根据套餐id查询关联的检查组集合--><selectid="selectCheckGroupsBySetmealId"parameterType="int"resultMap="findByIdResultMap">SELECT*FROMt_checkgroupWHEREidIN
(SELECTcheckgroup_idFROMt_setmeal_checkgroupWHEREsetmeal_id=#{setmealId})</select>(5)实现持久层查询套餐详细信息任务实现在health_service_provider子模块的CheckItemDao.xml映射文件中使用<select>元素映射查询语句,根据检查组id查询检查组对检查项的引用。<!--根据检查组id查询关联的检查项--><selectid="findCheckItemsByCheckGroupId"parameterType="int"
resultType="com.itheima.pojo.CheckItem">SELECT*FROMt_checkitemWHEREidIN
(SELECTcheckitem_idFROMt_checkgroup_checkitem
WHEREcheckgroup_id=#{checkgroup_id})</select>(5)实现持久层查询套餐详细信息任务实现启动Zookeeper服务,在IDEA依次启动health_service_provider和health_mobile。在浏览器中访问http://localhost/pages/setmeal.html。单击名称为肝肾检查的套餐,跳转到套餐详情页面。(6)测试套餐详情功能体检预约8-3任务描述用户选择好体检套餐后,单击套餐详情页面的“立即预约”进入对应的体检预约页面orderInfo.html。任务描述在体检预约页面中,输入体检人信息后,单击“提交预约”按钮,如果预约失败,在orderInfo.html页面会提示失败原因;如果预约成功,跳转到预约成功页面orderSuccess.html。体检预约可以分解成4个功能,分别是跳转到体检预约页面后显示套餐、发送短信验证码、预约体检、跳转到预约成功页面。任务分析任务分析(1)跳转到体检预约页面为setmeal_detail.html页面的“立即预约”绑定单击事件,在单击事件触发后提交跳转到体检预约页面的请求。(2)提交查询套餐的请求跳转到orderInfo.html页面的同时,提交查询套餐的请求。(3)接收和处理查询套餐的请求SetmealController类的findById()方法接收页面提交的请求。(5)查询结果展示orderInfo.html页面根据返回结果展示查询的套餐信息。(4)查询套餐信息SetmealServiceImpl类中重写SetmealService接口的findSetmealById()方法。1.跳转体检预约页面后显示套餐任务分析跳转体检预约页面后显示套餐的实现过程任务分析2.发送短信验证码为orderInfo.html页面的“发送验证码”绑定单击事件,在单击事件触发后提交填写的手机号。由ValidateCodeController类的send4Order()方法接收页面提交的手机号,并调用短信服务SMSUtils发送短信验证码。发送短信验证码的实现过程任务分析为orderInfo.html页面的“提交预约”按钮绑定单击事件,在单击事件触发后提交预约体检的请求。(3)保存新增预约数据首先判断当前预约日期是否允许预约,如果允许,判断用户是不是会员,如果是会员,判断是否重复预约;如果不是会员,则将该用户自动注册为会员,然后提交预约并更新已预约人数。(2)接收和处理预约体检的请求由控制器类OrderController中的submitOrder()方法接收页面提交的请求。(4)展示预约体检结果orderInfo.html页面根据返回结果展示预约体检结果。(1)提交预约体检的请求3.预约体检任务分析预约体检的实现过程任务分析访问orderSuccess.html页面时,提交查询预约信息的请求。(3)查询预约信息在OrderServiceImpl类中重写OrderService接口的findById()方法。(2)接收和处理查询预约信息的请求由控制器类OrderController的findById()方法接收页面提交的请求。(4)展示查询结果orderSuccess.html页面根据返回结果展示查询到的预约信息。(1)提交查询预约信息的请求4.跳转到预约成功页面任务分析跳转预约成功页面的实现过程任务实现为“立即预约”绑定单击事件,并设置单击时要调用的方法,在方法中提交跳转页面的请求。<divclass="box-button"><aclass="order-btn"@click="toOrderInfo()">立即预约</a></div>1.跳转到体检预约页面后显示套餐(1)提交跳转到体检预约页面的请求任务实现在setmeal_detail.html页面中定义toOrderInfo()方法,用于提交跳转页面的请求。<script>varvue=newVue({
methods:{toOrderInfo(){window.location.href="orderInfo.html?id="+id;}}});</script>1.跳转到体检预约页面后显示套餐(1)提交跳转到体检预约页面的请求任务实现要实现访问orderInfo.html页面时展示套餐信息,可以将查询套餐的操作定义在钩子函数created()中。<scriptsrc="../plugins/vue/axios-0.18.0.js"></script><script>created(){//发送axios请求,根据套餐id查询套餐信息,用于页面展示
axios.post("/setmeal/findById.do?id="+id).then((response)=>{if(response.data.flag){
this.setmeal=response.data.data;}});},</script>1.跳转体检预约页面后显示套餐(2)提交查询套餐的请求1.跳转到体检预约页面后显示套餐任务实现接下来应该实现查询套餐信息的后台逻辑代码,但由于查询套餐信息的findById()方法在套餐详情中已经实现,所以这里不再重复展示,稍后直接进行功能测试即可。1.跳转体检预约页面后显示套餐(3)实现查询套餐信息1.跳转到体检预约页面后显示套餐任务实现启动ZooKeeper服务、Redis服务,在IDEA中依次启动health_service_provider和health_mobile。在浏览器中访问http://localhost/pages/setmeal_detail.html?id=6进入肝肾检查的套餐详情页面,单击“立即预约”跳转到对应的体检预约页面。1.跳转体检预约页面后显示套餐(4)测试跳转到体检预约页面后显示套餐1.跳转到体检预约页面后显示套餐任务实现要实现单击“发送验证码”按钮后接收短信验证码,可以为“发送验证码”按钮绑定单击事件,并设置单击时要调用的方法,在该方法中提交发送验证码的请求。<inputstyle="font-size:x-small;"id="validateCodeButton"
@click="sendValidateCode()"type="button"value="发送验证码">2.发送短信验证码(1)提交发送短信验证码的请求任务实现orderInfo.html页面中定义sendValidateCode()方法,用于发送短信验证码sendValidateCode(){vartelephone=this.orderInfo.telephone;//获取用户输入的手机号if(!checkTelephone(telephone)){this.$message.error("手机号输入错误,请检查后重新输入!");returnfalse;}validateCodeButton=$("#validateCodeButton")[0];//锁定按钮clock=window.setInterval(doLoop,1000);//使用定时器方法每隔1秒执行一次
axios.post("/validatecode/send4Order.do?telephone="+telephone).then((res)=>{if(!res.data.flag){this.$message.error(res.data.message);}});}2.发送短信验证码(1)提交发送短信验证码的请求任务实现在health_mobile模块的ValidateCodeController类中定义send4Order()方法,用于接收和处理发送短信验证码的请求。@RequestMapping("/send4Order")publicResultsend4Order(Stringtelephone){Stringcode=ValidateCodeUtils.generateValidateCode(4).toString();try{
SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,code);//将验证码保存到redis,只保存5分钟
jedisPool.getResource().setex(telephone+RedisMessageConstant.SENDTYPE_ORDER,300,code);returnnewResult(true,MessageConstant.SEND_VALIDATECODE_SUCCESS);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.SEND_VALIDATECODE_FAIL);}}获取4位数验证码发送短信2.发送短信验证码(2)实现发送短信验证码控制器任务实现依次启动ZooKeeper服务、Redis服务、health_service_provider和health_mobile。在浏览器中访问http://localhost/pages/orderInfo.html?id=8。填写手机号后,单击“发送验证码”,通过手机接收短信验证码后将验证码填写到输入框中。2.发送短信验证码(3)测试发送短信验证码任务实现要实现单击“提交预约”按钮时提交预约请求,可以为该按钮绑定单击事件,并设置单击时要调用的方法,在该方法中提交预约请求。<buttontype="button"class="btnorder-btn"
@click="submitOrder()">提交预约</button>3.预约体检(1)提交预约请求任务实现在orderInfo.html页面定义submitOrder()方法,用于提交预约请求。submitOrder(){varidCard=this.orderInfo.idCard;//身份证进行校验if(!checkIdCard(idCard)){this.$message.error("身份证号输入错误,请检查后重新输入!");returnfalse;}
axios.post("/order/submitOrder.do",this.orderInfo).then((res)=>{if(res.data.flag){window.location.href="orderSuccess.html?orderId="+res.data.data;}else{this.$message.error(res.data.message);//预约失败,弹出提示}});}3.预约体检(1)提交预约请求任务实现在health_common子模块的com.itheima.pojo包下创建Order类,在类中声明预约的属性,定义各属性的getter/setter方法,并定义构造方法。3.预约体检(2)创建预约类3.预约体检(3)导入公共资源在health_common子模块的com.itheima.utils包中导入DateUtils类,用于日期格式化操作。由于代码过长,此处不进行展示,读者可以从本书提供的资源中获取。任务实现在health_mobile模块的com.itheima.controller包下创建控制器类OrderController,在类中定义submitOrder()方法,用于接收和处理预约体检的请求。(1)获取用户输入的验证码与存储在Redis中的验证码进行比对,判断是否正确;(2)验证码比对通过后,调用OrderService接口的order()方法实现预约体检。3.预约体检(4)实现预约体检控制器任务实现在health_interface子模块的com.itheima.service包下创建接口OrderService,在接口中定义order()方法,用于预约体检。publicinterfaceOrderService{publicResultorder(Mapmap)throwsException;//体检预约}3.预约体检(5)创建预约体检服务任务实现在health_service_provider子模块的com.itheima.service.impl包下创建OrderService接口的实现类OrderServiceImpl,在类中重写order()方法,用于预约体检。(1)查询用户是否在某日期进行过体验预约并判断该日期是否已经约满。(2)查询当前用户是否为会员,如果是会员,查询该会员是否重复预约,若是重复预约则无法继续预约;如果不是会员,则将该用户自动注册为会员。(3)新增预约,更新已预约人数。3.预约体检(6)实现预约体检服务任务实现在health_service_provider子模块的com.itheima.dao包下创建持久层接口OrderDao,用于处理与体检预约相关的操作。publicinterfaceOrderDao{publicList<Order>findByCondition(Orderorder);//查询预约信息publicvoidadd(Orderorder);//新增预约}3.预约体检(7)实现持久层预约体检任务实现在health_service_provider子模块的resources文件夹的com.itheima.dao目录下创建与OrderDao接口同名的映射文件OrderDao.xml。在文件中使用<insert>元素映射新增语句,使用<select>元素映射查询语句。<insertid="add"parameterType="com.itheima.pojo.Order"><selectKeyresultType="java.lang.Integer"order="AFTER"keyProperty="id">SELECTLAST_INSERT_ID()</selectKey>INSERTINTOt_order(member_id,orderDate,orderType,orderStatus,setmeal_id)
VALUES(#{memberId},#{orderDate},#{orderType},#{orderStatus},#{setmealId})</insert>新增预约信息3.预约体检(7)实现持久层预约体检任务实现<resultMapid="baseResultMap"type="com.itheima.pojo.Order"><idcolumn="id"property="id"/>
</resultMap><selectid="findByCondition"parameterType="com.itheima.pojo.Order"
resultMap="baseResultMap">select*fromt_order<where><iftest="id!=null">ANDid=#{id}</if>
</where></select>查询预约信息3.预约体检(7)实现持久层预约体检任务实现在health_service_provider子模块的OrderSettingDao接口中定义findByOrderDate()方法和editReservationsByOrderDate()方法。//根据日期查询预约设置信息publicOrderSettingfindByOrderDate(Datedate);//更新已预约人数publicvoideditReservationsByOrderDate(OrderSettingorderSetting);3.预约体检(7)实现持久层预约体检任务实现在health_service_provider子模块的OrderSettingDao.xml映射文件中使用<select>元素映射查询语句,使用<update>元素映射更新语句。<!--根据日期查询预约设置信息--><selectid="findByOrderDate"parameterType="date"resultType="com.itheima.pojo.OrderSetting">select*fromt_ordersettingwhereorderDate=#{orderDate}</select><!--更新已预约人数--><updateid="editReservationsByOrderDate"
parameterType="com.itheima.pojo.OrderSetting">UPDATEt_ordersettingSETreservations=#{reservations}WHEREorderDate=#{orderDate}</update>3.预约体检(7)实现持久层预约体检任务实现通过查询体检预约信息表t_order中的数据验证新增预约的结果。3.预约体检(8)查询体检预约信息表t_order任务实现要实现跳转到orderSuccess.html页面之后展示预约信息,可以将查询预约信息的操作定义在Vue提供的钩子函数created()中,created()函数在Vue对象初始化完成后自动执行。<scriptsrc="../plugins/vue/axios-0.18.0.js"></script><script>varvue=newVue({
created(){
axios.post("/order/findById.do?id="+id).then((response)=>{this.orderInfo=response.data.data;});}});</script>4.跳转到预约成功页面(1)提交跳转到预约成功页面的请求任务实现在health_mobile模块的OrderController类中定义findById()方法,用于接收和处理根据预约id查询预约信息的请求。//根据预约id查询预约信息@RequestMapping("/findById")publicResultfindById(Integerid){try{Mapmap=orderService.findById(id);returnnewResult(true,MessageConstant.QUERY_ORDER_SUCCESS,map);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.QUERY_ORDER_FAIL);}}(2)实现查询预约控制器4.跳转到预约成功页面任务实现在health_interface子模块的OrderService接口中定义findById()方法,用于根据预约id查询预约信息。//根据预约id查询预约信息publicMapfindById(Integerid);(3)创建查询预约服务4.跳转到预约成功页面任务实现在health_service_provider子模块的OrderServiceImpl类中重写OrderService接口的findById()方法,用于根据预约id查询预约信息。@OverridepublicMapfindById(Integerid){Mapmap=orderDao.findById4Detail(id);if(map!=null){//处理日期格式DateorderDate=(Date)map.get("orderDate");try{map.put("orderDate",DateUtils.parseDate2String(orderDate));}catch(Exceptione){e.printStackTrace();}}returnmap;}(4)实现查询预约服务4.跳转到预约成功页面任务实现在health_service_provider子模块的OrderDao接口中定义findById4Detail()方法,用于根据预约id查询预约信息。//根据预约id查询预约信息publicMapfindById4Detail(Integerid);4.跳转预约成功页面(5)实现持久层查询预约信息4.跳转到预约成功页面任务实现在health_service_provider子模块的OrderDao.xml映射文件中使用<select>元素映射查询语句,查询预约信息,包括体检人信息和套餐信息。<!--根据预约id查询预约信息,包括体检人信息、套餐信息--><selectid="findById4Detail"parameterType="int"resultType="map">SELECTASmember,ASsetmeal,o.orderDateASorderDate,o.orderTypeASorderTypeFROMt_ordero,t_memberm,t_setmealsWHEREo.member_id=m.idANDo.setmeal_id=s.idANDo.id=#{id}</select>(5)实现持久层查询预约信息4.跳转到预约成功页面任务实现依次启动ZooKeeper服务、health_service_provider和health_mobile,在浏览器中访问http://localhost/pages/orderSuccess.html?orderId=22。(6)测试跳转到预约成功页面4.跳转到预约成功页面页面静态化8-4任务描述用户登录用户端进行体检预约时,需要访问套餐列表页面和套餐详情页面,此时访问这两个页面,页面展示的所有信息都需要从数据库中查询,如果访问量大,会造成数据库的访问压力大、页面刷新缓慢等问题。从套餐包含的信息可以看出,套餐包含基本信息、对检查组的引用信息。一般情况下套餐内容变化频率不高,所以我们可以将套餐列表页面和套餐详情页面动态查询的结果分别转化成固定的静态页面进行展示,从而为数据库减压并提高系统运行性能。页面静态化就是将原来的动态网页使用静态化技术生成静态网页,这样用户在访问网页时,服务器直接响应静态页面,不需要反复查询数据库,从而有效降低数据库的访问压力。与数据库中数据保持一致的静态页面才是有效可用的。当管理端执行套餐新增、编辑或删除的操作后,会改变套餐的信息,这时需要重新生成静态页面。任务分析任务分析(1)生成静态页面页面静态化generateMobileStaticHtml()方法生成最新的套餐列表、套餐详情静态页面。套餐的add()方法、edit()方法和delete()方法改变套餐的内容后调用generateMobileStaticHtml()方法。(2)展示静态页面生成套餐列表、套餐详情静态页面后,访问用户端的体检预约模块,通过静态页面展示套餐列表和套餐详情。知识进阶FreeMarker是一款用Java语言编写的模板引擎,是一种基于模板和要改变的数据生成输出文本的通用工具。例如,生成HTML页面、配置文件、源代码等。它不是面向最终用户的,而是一个Java类库,是一款可以嵌入其他产品的组件。1.FreeMarker概述知识进阶Template指的是模板;Javaobjects指的是准备数据;Output指的是最终的文件。通过FreeMarker将数据填充到模板中,然后通过Output进行输出,最终生成静态文件。1.FreeMarker概述知识进阶FreeMarker模板的开发语言是FreeMarkerTemplateLanguage(FreeMarker模板语言,下文简称FTL),FTL的基本语法由文本、插值、FTL标签和注释组成,具体如下。文本:文本会按原样输出。插值:这部分的输出会被计算的值替换。插值由${and}(或者#{and})分隔。FTL标签:FTL标签与HTML标签相似,用于给FreeMarker指示,不会在输出内容中显示。注释:其注释与HTML的注释也很相似,是由<#--和-->来分隔的。其注释会被FreeMarker直接忽略,不会在输出内容中显示。1.FreeMarker概述知识进阶FreeMarker指令通过FTL标签调用,FreeMarker标签的语法与HTML、XML标签的语法类似,为了对FreeMarker标签和HTML、XML标签予以区分,FreeMarker标签以#开头。接下来讲解FreeMarker中4种常用的指令。2.FreeMarker指令知识进阶assign指令用于在页面上定义一个变量,可以定义简单类型和对象类型。定义简单类型<#assignlinkman="周先生">联系人:${linkman}上述代码中,指令都是以“<#”开始,以“>”结束的。其中,assign是指令名称,linkman是定义的变量名,不是固定写法,可以任意指定。通过${变量名}的方式获取变量值。定义对象类型<#assigninfo={"mobile":,'address':'北京市昌平区'}>电话:${info.mobile}地址:${info.address}上述代码中,定义对象info,对象中包含两个变量mobile和address。2.FreeMarker指令(1)assign指令知识进阶include指令用于文件的嵌套。例如创建文件head.ftl,文件内容如下所示。
<h1>黑马程序员</h1>创建文件test.ftl,在test.ftl文件中使用include指令引入文件head.ftl。<html><#include"head.ftl"/><body>
<#assigninfo={"mobile":,'address':'北京市昌平区'}>
电话:${info.mobile}地址:${info.address}</body></html>上述代码中,使用include指令引入文件head.ftl。head.ftl文件的内容会在include指令出现的位置插入。2.FreeMarker指令(2)include指令知识进阶if指令用于判断,与Java中的if用法类似。<#ifx==1> xis1<#elseifx==2> xis2<#elseifx=3> xis4<#else> xisone
</#if>在FreeMarker的判断中,可以使用“=”,也可以使用“==”,二者含义相同。2.FreeMarker指令(3)if指令知识进阶list指令用于遍历。<#listgoodsListasgoods>商品名称:${}价格:${goods.price}<br></#list>上述代码中,goodsList表示想要被迭代的项,可以是集合或序列;goods表示循环变量的名称,每次迭代时,循环变量会存储当前项的值。2.FreeMarker指令(4)list指令任务实现在health_service_provider子模块的WEB-INF目录下创建ftl目录,在ftl目录中创建模板文件mobile_setmeal.ftl和mobile_setmeal_detail.ftl,使用FreeMarker技术生成套餐列表静态页面和套餐详情静态页面。(1)提供静态页面模板任务实现要想在Java程序中使用FreeMarker服务,需要引入FreeMarker的依赖。在health_common子模块的pom.xml文件中引入FreeMarker的依赖。<dependencies>
<!--静态化页面-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency></dependencies>(2)引入FreeMarker的依赖任务实现在health_service_provider子模块的src/main/resources目录下创建属性文件perties,指定了生成的静态页面的存放位置。out_put_path=D:/a-czjk/\ health_parent/health_mobile/src/main/webapp/pages在配置文件中如果文件内容需要换行显示,需要在换行的位置添加“\”,否则会报错;在指定静态页面存放的目录位置时,目录中不能有中文字符,否则会报错。(3)创建FreeMarker配置文件任务实现在health_service_provider子模块的spring-service.xml配置文件中,添加FreeMarker相关配置对Spring与FreeMarker进行整合。<beanid="freemarkerConfig"class=
"org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"><!--指定模板文件所在目录--><propertyname="templateLoaderPath"value="/WEB-INF/ftl/"/><!--指定字符集--><propertyname="defaultEncoding"value="UTF-8"/></bean><!--加载属性文件,后期在java代码中会使用到属性文件中定义的key和value--><context:property-placeholderlocation="classpath:perties"/>(4)Spring与FreeMarker整合任务实现由于套餐新增、编辑和删除的执行过程是在SetmealServiceImpl类中完成的,为了方便代码调用,我们可以在health_service_provider子模块的SetmealServiceImpl类中增加生成静态页面的代码。@AutowiredprivateFreeMarkerConfigurerfreeMarkerConfigurer;@Value("${out_put_path}")privateStringoutPutPath;//从属性文件中读取要生成的html对应的目录//生成当前方法所需的静态页面publicvoidgenerateMobileStaticHtml(){//在生成静态页面之前需要查询数据List<Setmeal>list=setmealDao.findAll();//查询套餐列表数据
generateMobileSetmealListHtml(list);//生成套餐列表静态页面
generateMobileSetmealDetailHtml(list);
//生成套餐详情静态页面}(5)生成静态页面任务实现//生成套餐列表静态页面publicvoidgenerateMobileSetmealListHtml(List<Setmeal>list){Mapmap=newHashMap();map.put("setmealList",list);//为模板提供数据,用于生成静态页面
generteHtml("mobile_setmeal.ftl","m_setmeal.html",map);}套餐列表静态页面模板列表数据生成的套餐列表静态页面名称调用生成静态页面的方法(5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度智能化厂房内墙抹灰及防水处理劳务分包合同4篇
- 2024苏州租房合同模板:苏州工业园区租赁市场规范化合同9篇
- 专业货车驾驶员劳动协议格式版B版
- 2024装饰合同补充协议范本
- 2025年厂房租赁与产业协同发展合同4篇
- 2025年度茶叶包装设计及印刷合同书范本4篇
- 二零二五年度城市综合体BIM施工协调与监控合同3篇
- 专业工地食堂供应承包条款及合同(2024版)版B版
- 2025年度教育用品寄卖代理合同范本3篇
- 2025年度现代农业科技示范场承包合作协议4篇
- 台资企业A股上市相关资料
- 电 梯 工 程 预 算 书
- 罗盘超高清图
- 参会嘉宾签到表
- 机械车间员工绩效考核表
- 形式发票格式2 INVOICE
- 2.48低危胸痛患者后继治疗评估流程图
- 人力资源管理之绩效考核 一、什么是绩效 所谓绩效简单的讲就是对
- 山东省医院目录
- 云南地方本科高校部分基础研究
- 废品管理流程图
评论
0/150
提交评论