版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
模塊八用戶端-體檢預約《JavaEE企業(yè)級應用開發(fā)項目教程(SSM)》知識目標/Target了解FreeMarker,能夠簡述FreeMarker的作用和生成文件的原理熟悉FreeMarker的常用指令,能夠在FTL標簽中正確使用assign指令、include指令、if指令和list指令技能目標/Target掌握顯示套餐詳情功能的實現(xiàn)掌握體檢預約功能的實現(xiàn)掌握靜態(tài)頁面的實現(xiàn)方式,能夠使用FreeMarker技術實現(xiàn)套餐列表與套餐詳情頁面的靜態(tài)化掌握顯示套餐列表功能的實現(xiàn)章節(jié)概述/
Summary體檢是了解自身健康狀況、及時發(fā)現(xiàn)身體異常,以及預防疾病的重要手段之一。為了給廣大體檢用戶提供便利,傳智健康用戶端設立了線上體檢預約服務,用戶可以隨時隨地進行體檢預約。傳智健康的用戶端可以展示套餐列表、套餐詳情和進行體檢預約。接下來,本模塊將對用戶端的體檢預約進行詳細講解。目錄/Contents01020304套餐列表套餐詳情體檢預約頁面靜態(tài)化套餐列表8-1任務描述在瀏覽器中訪問用戶端首頁index.html。體檢套餐是傳智健康面向體檢用戶銷售的產品,為了讓用戶全方位地了解體檢套餐的種類,傳智健康用戶端提供套餐列表頁面供用戶瀏覽。任務描述在用戶端首頁單擊“體檢預約”超鏈接后會跳轉到套餐列表頁面setmeal.html,該頁面以列表的形式展示所有的體檢套餐。任務分析訪問套餐列表頁面setmeal.html時,提交查詢所有套餐的請求。(3)查詢套餐SetmealServiceImpl類中重寫SetmealService接口的findAll()方法查詢所有的套餐。(2)接收和處理查詢所有套餐的請求控制器類SetmealController的getSetmeal()方法接收頁面提交的請求。(4)查詢結果展示setmeal.html頁面根據(jù)返回結果展示查詢到的所有的套餐。(1)提交查詢所有套餐的請求任務分析套餐列表的實現(xiàn)過程任務實現(xiàn)要實現(xiàn)在訪問setmeal.html頁面時展示所有的套餐,可以將查詢的操作定義在鉤子函數(shù)created()中,在created()函數(shù)中使用Axios發(fā)送異步請求的方式獲取所有的套餐數(shù)據(jù)。<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文件數(shù)據(jù)雙向綁定(1)提交查詢所有套餐的請求任務實現(xiàn)在health_mobile模塊的com.itheima.controller包下創(chuàng)建控制器類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)實現(xiàn)查詢套餐控制器任務實現(xiàn)在health_interface子模塊的SetmealService接口中定義findAll()方法,用于查詢套餐列表。//查詢套餐列表publicList<Setmeal>findAll();(3)創(chuàng)建查詢套餐服務任務實現(xiàn)在health_service_provider子模塊的SetmealServiceImpl類中重寫接口的findAll()方法,用于查詢套餐列表。@OverridepublicList<Setmeal>findAll(){
returnsetmealDao.findAll();//調用持久層接口查詢套餐}(4)實現(xiàn)查詢套餐服務任務實現(xiàn)在health_service_provider子模塊的SetmealDao接口中定義findAll()方法,用于查詢所有套餐。//查詢所有套餐publicList<Setmeal>findAll();(5)實現(xiàn)持久層查詢套餐在health_service_provider子模塊的SetmealDao.xml映射文件中使用<select>元素映射查詢語句,查詢所有的套餐數(shù)據(jù)。<!--獲取所有套餐信息--><selectid="findAll"resultType="com.itheima.pojo.Setmeal">SELECT*FROMt_setmeal</select>任務實現(xiàn)啟動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頁面根據(jù)返回結果展示查詢的套餐詳細信息。(1)提交查詢套餐詳細信息的請求任務分析套餐詳情的實現(xiàn)過程任務實現(xiàn)將查詢的操作定義在鉤子函數(shù)created()中,在created()函數(shù)中通過使用Axios發(fā)送異步請求的方式查詢套餐詳細信息。<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>數(shù)據(jù)雙向綁定(1)提交查詢套餐詳細信息的請求任務實現(xiàn)在health_mobile模塊的SetmealController類中定義findById()方法,用于接收和處理查詢套餐詳細信息的請求。//根據(jù)套餐id查詢套餐詳情,包含(套餐基本信息、套餐關聯(lián)的檢查組、檢查組關聯(lián)的檢查項)@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)實現(xiàn)查詢套餐詳細信息控制器任務實現(xiàn)在health_interface子模塊的SetmealService接口中定義findSetmealById()方法,用于根據(jù)套餐id查詢套餐詳細信息。//查詢套餐詳情publicSetmealfindSetmealById(Integerid);(3)創(chuàng)建查詢套餐詳細信息服務任務實現(xiàn)在health_service_provider子模塊的SetmealServiceImpl類中重寫SetmealService接口的findSetmealById()方法,用于根據(jù)套餐id查詢套餐詳細信息。@OverridepublicSetmealfindSetmealById(Integerid){
returnsetmealDao.findById4Detail();//調用持久層查詢套餐詳情}(4)實現(xiàn)查詢套餐詳細信息服務任務實現(xiàn)在health_service_provider子模塊的SetmealDao接口中定義findById4Detail()方法,用于根據(jù)套餐id查詢套餐詳細信息。//查詢套餐列表publicSetmealfindById4Detail(Integerid);(5)實現(xiàn)持久層查詢套餐詳細信息任務實現(xiàn)在health_service_provider子模塊的SetmealDao.xml映射文件中使用<select>元素映射查詢語句,根據(jù)套餐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><!--根據(jù)套餐id查詢套餐詳情(包含基本信息、關聯(lián)的檢查組、檢查項信息)--><selectid="findById4Detail"parameterType="int"resultMap="findByIdResultMap">SELECT*FROMt_setmealWHEREid=#{id}</select>(5)實現(xiàn)持久層查詢套餐詳細信息任務實現(xiàn)在health_service_provider子模塊的CheckGroupDao.xml映射文件中使用<select>元素映射查詢語句,根據(jù)套餐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><!--根據(jù)套餐id查詢關聯(lián)的檢查組集合--><selectid="selectCheckGroupsBySetmealId"parameterType="int"resultMap="findByIdResultMap">SELECT*FROMt_checkgroupWHEREidIN
(SELECTcheckgroup_idFROMt_setmeal_checkgroupWHEREsetmeal_id=#{setmealId})</select>(5)實現(xiàn)持久層查詢套餐詳細信息任務實現(xiàn)在health_service_provider子模塊的CheckItemDao.xml映射文件中使用<select>元素映射查詢語句,根據(jù)檢查組id查詢檢查組對檢查項的引用。<!--根據(jù)檢查組id查詢關聯(lián)的檢查項--><selectid="findCheckItemsByCheckGroupId"parameterType="int"
resultType="com.itheima.pojo.CheckItem">SELECT*FROMt_checkitemWHEREidIN
(SELECTcheckitem_idFROMt_checkgroup_checkitem
WHEREcheckgroup_id=#{checkgroup_id})</select>(5)實現(xiàn)持久層查詢套餐詳細信息任務實現(xiàn)啟動Zookeeper服務,在IDEA依次啟動health_service_provider和health_mobile。在瀏覽器中訪問http://localhost/pages/setmeal.html。單擊名稱為肝腎檢查的套餐,跳轉到套餐詳情頁面。(6)測試套餐詳情功能體檢預約8-3任務描述用戶選擇好體檢套餐后,單擊套餐詳情頁面的“立即預約”進入對應的體檢預約頁面orderInfo.html。任務描述在體檢預約頁面中,輸入體檢人信息后,單擊“提交預約”按鈕,如果預約失敗,在orderInfo.html頁面會提示失敗原因;如果預約成功,跳轉到預約成功頁面orderSuccess.html。體檢預約可以分解成4個功能,分別是跳轉到體檢預約頁面后顯示套餐、發(fā)送短信驗證碼、預約體檢、跳轉到預約成功頁面。任務分析任務分析(1)跳轉到體檢預約頁面為setmeal_detail.html頁面的“立即預約”綁定單擊事件,在單擊事件觸發(fā)后提交跳轉到體檢預約頁面的請求。(2)提交查詢套餐的請求跳轉到orderInfo.html頁面的同時,提交查詢套餐的請求。(3)接收和處理查詢套餐的請求SetmealController類的findById()方法接收頁面提交的請求。(5)查詢結果展示orderInfo.html頁面根據(jù)返回結果展示查詢的套餐信息。(4)查詢套餐信息SetmealServiceImpl類中重寫SetmealService接口的findSetmealById()方法。1.跳轉體檢預約頁面后顯示套餐任務分析跳轉體檢預約頁面后顯示套餐的實現(xiàn)過程任務分析2.發(fā)送短信驗證碼為orderInfo.html頁面的“發(fā)送驗證碼”綁定單擊事件,在單擊事件觸發(fā)后提交填寫的手機號。由ValidateCodeController類的send4Order()方法接收頁面提交的手機號,并調用短信服務SMSUtils發(fā)送短信驗證碼。發(fā)送短信驗證碼的實現(xiàn)過程任務分析為orderInfo.html頁面的“提交預約”按鈕綁定單擊事件,在單擊事件觸發(fā)后提交預約體檢的請求。(3)保存新增預約數(shù)據(jù)首先判斷當前預約日期是否允許預約,如果允許,判斷用戶是不是會員,如果是會員,判斷是否重復預約;如果不是會員,則將該用戶自動注冊為會員,然后提交預約并更新已預約人數(shù)。(2)接收和處理預約體檢的請求由控制器類OrderController中的submitOrder()方法接收頁面提交的請求。(4)展示預約體檢結果orderInfo.html頁面根據(jù)返回結果展示預約體檢結果。(1)提交預約體檢的請求3.預約體檢任務分析預約體檢的實現(xiàn)過程任務分析訪問orderSuccess.html頁面時,提交查詢預約信息的請求。(3)查詢預約信息在OrderServiceImpl類中重寫OrderService接口的findById()方法。(2)接收和處理查詢預約信息的請求由控制器類OrderController的findById()方法接收頁面提交的請求。(4)展示查詢結果orderSuccess.html頁面根據(jù)返回結果展示查詢到的預約信息。(1)提交查詢預約信息的請求4.跳轉到預約成功頁面任務分析跳轉預約成功頁面的實現(xiàn)過程任務實現(xiàn)為“立即預約”綁定單擊事件,并設置單擊時要調用的方法,在方法中提交跳轉頁面的請求。<divclass="box-button"><aclass="order-btn"@click="toOrderInfo()">立即預約</a></div>1.跳轉到體檢預約頁面后顯示套餐(1)提交跳轉到體檢預約頁面的請求任務實現(xiàn)在setmeal_detail.html頁面中定義toOrderInfo()方法,用于提交跳轉頁面的請求。<script>varvue=newVue({
methods:{toOrderInfo(){window.location.href="orderInfo.html?id="+id;}}});</script>1.跳轉到體檢預約頁面后顯示套餐(1)提交跳轉到體檢預約頁面的請求任務實現(xiàn)要實現(xiàn)訪問orderInfo.html頁面時展示套餐信息,可以將查詢套餐的操作定義在鉤子函數(shù)created()中。<scriptsrc="../plugins/vue/axios-0.18.0.js"></script><script>created(){//發(fā)送axios請求,根據(jù)套餐id查詢套餐信息,用于頁面展示
axios.post("/setmeal/findById.do?id="+id).then((response)=>{if(response.data.flag){
this.setmeal=response.data.data;}});},</script>1.跳轉體檢預約頁面后顯示套餐(2)提交查詢套餐的請求1.跳轉到體檢預約頁面后顯示套餐任務實現(xiàn)接下來應該實現(xiàn)查詢套餐信息的后臺邏輯代碼,但由于查詢套餐信息的findById()方法在套餐詳情中已經實現(xiàn),所以這里不再重復展示,稍后直接進行功能測試即可。1.跳轉體檢預約頁面后顯示套餐(3)實現(xiàn)查詢套餐信息1.跳轉到體檢預約頁面后顯示套餐任務實現(xiàn)啟動ZooKeeper服務、Redis服務,在IDEA中依次啟動health_service_provider和health_mobile。在瀏覽器中訪問http://localhost/pages/setmeal_detail.html?id=6進入肝腎檢查的套餐詳情頁面,單擊“立即預約”跳轉到對應的體檢預約頁面。1.跳轉體檢預約頁面后顯示套餐(4)測試跳轉到體檢預約頁面后顯示套餐1.跳轉到體檢預約頁面后顯示套餐任務實現(xiàn)要實現(xiàn)單擊“發(fā)送驗證碼”按鈕后接收短信驗證碼,可以為“發(fā)送驗證碼”按鈕綁定單擊事件,并設置單擊時要調用的方法,在該方法中提交發(fā)送驗證碼的請求。<inputstyle="font-size:x-small;"id="validateCodeButton"
@click="sendValidateCode()"type="button"value="發(fā)送驗證碼">2.發(fā)送短信驗證碼(1)提交發(fā)送短信驗證碼的請求任務實現(xiàn)orderInfo.html頁面中定義sendValidateCode()方法,用于發(fā)送短信驗證碼sendValidateCode(){vartelephone=this.orderInfo.telephone;//獲取用戶輸入的手機號if(!checkTelephone(telephone)){this.$message.error("手機號輸入錯誤,請檢查后重新輸入!");returnfalse;}validateCodeButton=$("#validateCodeButton")[0];//鎖定按鈕clock=window.setInterval(doLoop,1000);//使用定時器方法每隔1秒執(zhí)行一次
axios.post("/validatecode/send4Order.do?telephone="+telephone).then((res)=>{if(!res.data.flag){this.$message.error(res.data.message);}});}2.發(fā)送短信驗證碼(1)提交發(fā)送短信驗證碼的請求任務實現(xiàn)在health_mobile模塊的ValidateCodeController類中定義send4Order()方法,用于接收和處理發(fā)送短信驗證碼的請求。@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位數(shù)驗證碼發(fā)送短信2.發(fā)送短信驗證碼(2)實現(xiàn)發(fā)送短信驗證碼控制器任務實現(xiàn)依次啟動ZooKeeper服務、Redis服務、health_service_provider和health_mobile。在瀏覽器中訪問http://localhost/pages/orderInfo.html?id=8。填寫手機號后,單擊“發(fā)送驗證碼”,通過手機接收短信驗證碼后將驗證碼填寫到輸入框中。2.發(fā)送短信驗證碼(3)測試發(fā)送短信驗證碼任務實現(xiàn)要實現(xiàn)單擊“提交預約”按鈕時提交預約請求,可以為該按鈕綁定單擊事件,并設置單擊時要調用的方法,在該方法中提交預約請求。<buttontype="button"class="btnorder-btn"
@click="submitOrder()">提交預約</button>3.預約體檢(1)提交預約請求任務實現(xiàn)在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)提交預約請求任務實現(xiàn)在health_common子模塊的com.itheima.pojo包下創(chuàng)建Order類,在類中聲明預約的屬性,定義各屬性的getter/setter方法,并定義構造方法。3.預約體檢(2)創(chuàng)建預約類3.預約體檢(3)導入公共資源在health_common子模塊的com.itheima.utils包中導入DateUtils類,用于日期格式化操作。由于代碼過長,此處不進行展示,讀者可以從本書提供的資源中獲取。任務實現(xiàn)在health_mobile模塊的com.itheima.controller包下創(chuàng)建控制器類OrderController,在類中定義submitOrder()方法,用于接收和處理預約體檢的請求。(1)獲取用戶輸入的驗證碼與存儲在Redis中的驗證碼進行比對,判斷是否正確;(2)驗證碼比對通過后,調用OrderService接口的order()方法實現(xiàn)預約體檢。3.預約體檢(4)實現(xiàn)預約體檢控制器任務實現(xiàn)在health_interface子模塊的com.itheima.service包下創(chuàng)建接口OrderService,在接口中定義order()方法,用于預約體檢。publicinterfaceOrderService{publicResultorder(Mapmap)throwsException;//體檢預約}3.預約體檢(5)創(chuàng)建預約體檢服務任務實現(xiàn)在health_service_provider子模塊的com.itheima.service.impl包下創(chuàng)建OrderService接口的實現(xiàn)類OrderServiceImpl,在類中重寫order()方法,用于預約體檢。(1)查詢用戶是否在某日期進行過體驗預約并判斷該日期是否已經約滿。(2)查詢當前用戶是否為會員,如果是會員,查詢該會員是否重復預約,若是重復預約則無法繼續(xù)預約;如果不是會員,則將該用戶自動注冊為會員。(3)新增預約,更新已預約人數(shù)。3.預約體檢(6)實現(xiàn)預約體檢服務任務實現(xiàn)在health_service_provider子模塊的com.itheima.dao包下創(chuàng)建持久層接口OrderDao,用于處理與體檢預約相關的操作。publicinterfaceOrderDao{publicList<Order>findByCondition(Orderorder);//查詢預約信息publicvoidadd(Orderorder);//新增預約}3.預約體檢(7)實現(xiàn)持久層預約體檢任務實現(xiàn)在health_service_provider子模塊的resources文件夾的com.itheima.dao目錄下創(chuàng)建與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)實現(xiàn)持久層預約體檢任務實現(xiàn)<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)實現(xiàn)持久層預約體檢任務實現(xiàn)在health_service_provider子模塊的OrderSettingDao接口中定義findByOrderDate()方法和editReservationsByOrderDate()方法。//根據(jù)日期查詢預約設置信息publicOrderSettingfindByOrderDate(Datedate);//更新已預約人數(shù)publicvoideditReservationsByOrderDate(OrderSettingorderSetting);3.預約體檢(7)實現(xiàn)持久層預約體檢任務實現(xiàn)在health_service_provider子模塊的OrderSettingDao.xml映射文件中使用<select>元素映射查詢語句,使用<update>元素映射更新語句。<!--根據(jù)日期查詢預約設置信息--><selectid="findByOrderDate"parameterType="date"resultType="com.itheima.pojo.OrderSetting">select*fromt_ordersettingwhereorderDate=#{orderDate}</select><!--更新已預約人數(shù)--><updateid="editReservationsByOrderDate"
parameterType="com.itheima.pojo.OrderSetting">UPDATEt_ordersettingSETreservations=#{reservations}WHEREorderDate=#{orderDate}</update>3.預約體檢(7)實現(xiàn)持久層預約體檢任務實現(xiàn)通過查詢體檢預約信息表t_order中的數(shù)據(jù)驗證新增預約的結果。3.預約體檢(8)查詢體檢預約信息表t_order任務實現(xiàn)要實現(xiàn)跳轉到orderSuccess.html頁面之后展示預約信息,可以將查詢預約信息的操作定義在Vue提供的鉤子函數(shù)created()中,created()函數(shù)在Vue對象初始化完成后自動執(zhí)行。<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)提交跳轉到預約成功頁面的請求任務實現(xiàn)在health_mobile模塊的OrderController類中定義findById()方法,用于接收和處理根據(jù)預約id查詢預約信息的請求。//根據(jù)預約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)實現(xiàn)查詢預約控制器4.跳轉到預約成功頁面任務實現(xiàn)在health_interface子模塊的OrderService接口中定義findById()方法,用于根據(jù)預約id查詢預約信息。//根據(jù)預約id查詢預約信息publicMapfindById(Integerid);(3)創(chuàng)建查詢預約服務4.跳轉到預約成功頁面任務實現(xiàn)在health_service_provider子模塊的OrderServiceImpl類中重寫OrderService接口的findById()方法,用于根據(jù)預約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)實現(xiàn)查詢預約服務4.跳轉到預約成功頁面任務實現(xiàn)在health_service_provider子模塊的OrderDao接口中定義findById4Detail()方法,用于根據(jù)預約id查詢預約信息。//根據(jù)預約id查詢預約信息publicMapfindById4Detail(Integerid);4.跳轉預約成功頁面(5)實現(xiàn)持久層查詢預約信息4.跳轉到預約成功頁面任務實現(xiàn)在health_service_provider子模塊的OrderDao.xml映射文件中使用<select>元素映射查詢語句,查詢預約信息,包括體檢人信息和套餐信息。<!--根據(jù)預約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)實現(xiàn)持久層查詢預約信息4.跳轉到預約成功頁面任務實現(xiàn)依次啟動ZooKeeper服務、health_service_provider和health_mobile,在瀏覽器中訪問http://localhost/pages/orderSuccess.html?orderId=22。(6)測試跳轉到預約成功頁面4.跳轉到預約成功頁面頁面靜態(tài)化8-4任務描述用戶登錄用戶端進行體檢預約時,需要訪問套餐列表頁面和套餐詳情頁面,此時訪問這兩個頁面,頁面展示的所有信息都需要從數(shù)據(jù)庫中查詢,如果訪問量大,會造成數(shù)據(jù)庫的訪問壓力大、頁面刷新緩慢等問題。從套餐包含的信息可以看出,套餐包含基本信息、對檢查組的引用信息。一般情況下套餐內容變化頻率不高,所以我們可以將套餐列表頁面和套餐詳情頁面動態(tài)查詢的結果分別轉化成固定的靜態(tài)頁面進行展示,從而為數(shù)據(jù)庫減壓并提高系統(tǒng)運行性能。頁面靜態(tài)化就是將原來的動態(tài)網(wǎng)頁使用靜態(tài)化技術生成靜態(tài)網(wǎng)頁,這樣用戶在訪問網(wǎng)頁時,服務器直接響應靜態(tài)頁面,不需要反復查詢數(shù)據(jù)庫,從而有效降低數(shù)據(jù)庫的訪問壓力。與數(shù)據(jù)庫中數(shù)據(jù)保持一致的靜態(tài)頁面才是有效可用的。當管理端執(zhí)行套餐新增、編輯或刪除的操作后,會改變套餐的信息,這時需要重新生成靜態(tài)頁面。任務分析任務分析(1)生成靜態(tài)頁面頁面靜態(tài)化generateMobileStaticHtml()方法生成最新的套餐列表、套餐詳情靜態(tài)頁面。套餐的add()方法、edit()方法和delete()方法改變套餐的內容后調用generateMobileStaticHtml()方法。(2)展示靜態(tài)頁面生成套餐列表、套餐詳情靜態(tài)頁面后,訪問用戶端的體檢預約模塊,通過靜態(tài)頁面展示套餐列表和套餐詳情。知識進階FreeMarker是一款用Java語言編寫的模板引擎,是一種基于模板和要改變的數(shù)據(jù)生成輸出文本的通用工具。例如,生成HTML頁面、配置文件、源代碼等。它不是面向最終用戶的,而是一個Java類庫,是一款可以嵌入其他產品的組件。1.FreeMarker概述知識進階Template指的是模板;Javaobjects指的是準備數(shù)據(jù);Output指的是最終的文件。通過FreeMarker將數(shù)據(jù)填充到模板中,然后通過Output進行輸出,最終生成靜態(tài)文件。1.FreeMarker概述知識進階FreeMarker模板的開發(fā)語言是FreeMarkerTemplateLanguage(FreeMarker模板語言,下文簡稱FTL),F(xiàn)TL的基本語法由文本、插值、FTL標簽和注釋組成,具體如下。文本:文本會按原樣輸出。插值:這部分的輸出會被計算的值替換。插值由${and}(或者#{and})分隔。FTL標簽:FTL標簽與HTML標簽相似,用于給FreeMarker指示,不會在輸出內容中顯示。注釋:其注釋與HTML的注釋也很相似,是由<#--和-->來分隔的。其注釋會被FreeMarker直接忽略,不會在輸出內容中顯示。1.FreeMarker概述知識進階FreeMarker指令通過FTL標簽調用,F(xiàn)reeMarker標簽的語法與HTML、XML標簽的語法類似,為了對FreeMarker標簽和HTML、XML標簽予以區(qū)分,F(xiàn)reeMarker標簽以#開頭。接下來講解FreeMarker中4種常用的指令。2.FreeMarker指令知識進階assign指令用于在頁面上定義一個變量,可以定義簡單類型和對象類型。定義簡單類型<#assignlinkman="周先生">聯(lián)系人:${linkman}上述代碼中,指令都是以“<#”開始,以“>”結束的。其中,assign是指令名稱,linkman是定義的變量名,不是固定寫法,可以任意指定。通過${變量名}的方式獲取變量值。定義對象類型<#assigninfo={"mobile":,'address':'北京市昌平區(qū)'}>電話:${info.mobile}地址:${info.address}上述代碼中,定義對象info,對象中包含兩個變量mobile和address。2.FreeMarker指令(1)assign指令知識進階include指令用于文件的嵌套。例如創(chuàng)建文件head.ftl,文件內容如下所示。
<h1>黑馬程序員</h1>創(chuàng)建文件test.ftl,在test.ftl文件中使用include指令引入文件head.ftl。<html><#include"head.ftl"/><body>
<#assigninfo={"mobile":,'address':'北京市昌平區(qū)'}>
電話:${info.mobile}地址:${info.address}</body></html>上述代碼中,使用include指令引入文件head.ftl。head.ftl文件的內容會在include指令出現(xiàn)的位置插入。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表示循環(huán)變量的名稱,每次迭代時,循環(huán)變量會存儲當前項的值。2.FreeMarker指令(4)list指令任務實現(xiàn)在health_service_provider子模塊的WEB-INF目錄下創(chuàng)建ftl目錄,在ftl目錄中創(chuàng)建模板文件mobile_setmeal.ftl和mobile_setmeal_detail.ftl,使用FreeMarker技術生成套餐列表靜態(tài)頁面和套餐詳情靜態(tài)頁面。(1)提供靜態(tài)頁面模板任務實現(xiàn)要想在Java程序中使用FreeMarker服務,需要引入FreeMarker的依賴。在health_common子模塊的pom.xml文件中引入FreeMarker的依賴。<dependencies>
<!--靜態(tài)化頁面-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency></dependencies>(2)引入FreeMarker的依賴任務實現(xiàn)在health_service_provider子模塊的src/main/resources目錄下創(chuàng)建屬性文件perties,指定了生成的靜態(tài)頁面的存放位置。out_put_path=D:/a-czjk/\ health_parent/health_mobile/src/main/webapp/pages在配置文件中如果文件內容需要換行顯示,需要在換行的位置添加“\”,否則會報錯;在指定靜態(tài)頁面存放的目錄位置時,目錄中不能有中文字符,否則會報錯。(3)創(chuàng)建FreeMarker配置文件任務實現(xiàn)在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整合任務實現(xiàn)由于套餐新增、編輯和刪除的執(zhí)行過程是在SetmealServiceImpl類中完成的,為了方便代碼調用,我們可以在health_service_provider子模塊的SetmealServiceImpl類中增加生成靜態(tài)頁面的代碼。@AutowiredprivateFreeMarkerConfigurerfreeMarkerConfigurer;@Value("${out_put_path}")privateStringoutPutPath;//從屬性文件中讀取要生成的html對應的目錄//生成當前方法所需的靜態(tài)頁面publicvoidgenerateMobileStaticHtml(){//在生成靜態(tài)頁面之前需要查詢數(shù)據(jù)List<Setmeal>list=setmealDao.findAll();//查詢套餐列表數(shù)據(jù)
generateMobileSetmealListHtml(list);//生成套餐列表靜態(tài)頁面
generateMobileSetmealDetailHtml(list);
//生成套餐詳情靜態(tài)頁面}(5)生成靜態(tài)頁面任務實現(xiàn)//生成套餐列表靜態(tài)頁面publicvoidgenerateMobileSetmealListHtml(List<Setmeal>list){Mapmap=newHashMap();map.put("setmealList",list);//為模板提供數(shù)據(jù),用于生成靜態(tài)頁面
generteHtml("mobile_setmeal.ftl","m_setmeal.html",map);}套餐列表靜態(tài)頁面模板列表數(shù)據(jù)生成的套餐列表靜態(tài)頁面名稱調用生成靜態(tài)頁面的方法(5
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度個人店面租賃合同租賃費用調整辦法
- 二零二五年度高層建筑消防改造勞務分包合同范本2篇
- 二零二五年度內部承包合作協(xié)議范本12篇
- 《特種設備安全法》解析-浙江
- 酒店管理工作中的客戶服務
- 科技應用在小班教育中的探索計劃
- 二零二五年度個人租賃山地別墅及園林使用權合同4篇
- 二零二五年度寵物領養(yǎng)合同范本3篇
- 二零二五年度企業(yè)收入證明修訂協(xié)議3篇
- 二零二五年度離婚方式適用條件及技巧解析合同3篇
- 四年級數(shù)學豎式計算100道文檔
- “新零售”模式下生鮮電商的營銷策略研究-以盒馬鮮生為例
- 項痹病辨證施護
- 職業(yè)安全健康工作總結(2篇)
- 懷化市數(shù)字經濟產業(yè)發(fā)展概況及未來投資可行性研究報告
- 07FD02 防空地下室電氣設備安裝
- 教師高中化學大單元教學培訓心得體會
- 高中語文日積月累23
- 彈簧分離問題經典題目
- 金屬材料與熱處理全套ppt課件完整版教程
- 部編版高中歷史中外歷史綱要(下)世界史導言課課件
評論
0/150
提交評論