整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          基于Java Web的陜西旅游網(wǎng)站的設計與實現(xiàn)-計算機畢業(yè)設計源碼

          、研究的背景和意義

          研究背景:本文主要是基于旅游業(yè)是我國現(xiàn)階段發(fā)展的重要產(chǎn)業(yè),旅游可以推動經(jīng)濟上的發(fā)展,通過深入的對當前旅游行業(yè)的研究,也隨著網(wǎng)絡技術的發(fā)展,傳統(tǒng)的旅游方式游客已經(jīng)無法滿足,游客不再滿足于單一路線的線路,無法進行更多的選擇,每天日常的行程安排喪失了一定的自由選擇,這就導致降低了游客的期望,也減少了消費的欲望。所以旅游網(wǎng)站的建設就顯得尤為重要,游客可以通過網(wǎng)站來提前感受到各地的景色,為自己制定出一個貼合自己的路線,多元化的去選擇。帶給游客一種全新的體驗。

          研究意義:旅游業(yè)是現(xiàn)代服務業(yè)的重要組成部分,國家為了促進旅游業(yè)的改革發(fā)展,也相繼出臺了相關政策。促進旅游業(yè)的發(fā)展,對于擴就業(yè)、增收入,推動一些中西部的貧困地區(qū)的發(fā)展有著重要的作用,也可以促進國家經(jīng)濟的平穩(wěn)增加。旅游業(yè)的發(fā)展也是為了能夠滿足人們?nèi)找嬖鲩L的物質(zhì)和文化上的需要,在如今這個互聯(lián)網(wǎng)發(fā)展飛速的時代,現(xiàn)階段越來越多的人想要走出家門去欣賞外面的風景,通過旅游讓自己精神和身體上的放松。人們可以通過上網(wǎng)來了解更多特色的地方,人們也對于旅游文化的要求越來越高,因此很多具有特色的和歷史悠久的地方成為了人們的選擇對象。而且隨著網(wǎng)絡的發(fā)展,更多的偏遠地區(qū)也有了一定的發(fā)展機會,一些不為人知的地方反而會成為熱門,每個地方憑借著自己的特色來引起人們的關注,所以人們需要一個專業(yè)的平臺去了解自己喜歡的文化。云旅游是可以擴大景區(qū)的知名度,增進當?shù)孛袼孜幕陌l(fā)展,實現(xiàn)文化的對外輸出,另外云旅游這也是突破了時間與空間的限制,人們坐在家中就可以通過網(wǎng)絡來了解到其他地方的景色。走信息化的道路來推動旅游業(yè)的發(fā)展是一個很明智的選擇。相信隨著旅游網(wǎng)站系統(tǒng)功能的越來越成熟,結合著大數(shù)據(jù)技術的發(fā)展前景,為游客制定出更為舒適,更合理的旅游路線,讓游客更享受這段旅程。同時也隨著大眾們的旅游需求越來越高,我們的旅游網(wǎng)上市場也會發(fā)展的越來越快,旅游網(wǎng)站的建設也成為了一個重要的問題。

          二、研究的目的和內(nèi)容

          研究目的:基于Java Web開發(fā)的旅游網(wǎng)站,開發(fā)該系統(tǒng)的主要目的,為游客的出行旅游提供便利,吸引游客為游客制定一系列服務功能,包括路線的選擇,景點的信息,酒店預訂信息,論壇交互等。

          研究內(nèi)容:本文主要基于陜西旅游的網(wǎng)站一體化服務,所開發(fā)的面向于游客的旅游管理系統(tǒng)。描述了該旅游系統(tǒng)的開發(fā)背景,首先從旅游需求分析開始,之后進行系統(tǒng)的總體架構設計,詳細設計與所能實現(xiàn)的功能和測試環(huán)節(jié)。

          三、研究的方法和步驟

          研究方法:

          1. 數(shù)量研究法:通過網(wǎng)絡在線旅游時游客數(shù)量比較出主要線路趨勢,更全面的體現(xiàn)出游客對于旅游線路選擇的方向;

          2.個案研究法:研究省內(nèi)或省外游客,加以專門調(diào)查分析,全面了解省內(nèi)游客及省外游客對于出省旅游的心思,再加以總結,會更透徹認識到其中的關系;

          3.數(shù)據(jù)分析法:收集旅游游客對于旅游網(wǎng)站相關看法,進行數(shù)據(jù)分析,準確分析旅游網(wǎng)站發(fā)展前景。

          4.文獻研究法:研究目的或課題,調(diào)查旅游網(wǎng)站相關文獻來獲得資料,從而多方面面地、正確地了解所要掌握的信息。

          研究步驟:

          1.準備建設網(wǎng)站相關技術,例:spring MVC、Mybatis框架、html、css、jQuery、Ajax和BootStrap等前端技術;

          2.準備工作:收集相關旅游網(wǎng)站的資料,了解該模式運營的利害關系,明白旅游網(wǎng)站的發(fā)展趨勢;

          3.首頁頁面設計,然后根據(jù)需求分析現(xiàn)有系統(tǒng)所需功能,對功能板塊劃分;

          4.實現(xiàn)現(xiàn)有板塊前后臺功能;

          5.進行歸納測試總結:系統(tǒng)功能實現(xiàn)以后,再次對功能板塊進行測試,最后再對測試結果進行總結得出結論。

          四、擬解決的關鍵問題

          1.了解旅游系統(tǒng)游客的需求,按照需求制定相關的功能;

          2.對前后臺功能進行細致區(qū)分,讓管理員和游客分別管理或使用相應功能;

          3.根據(jù)數(shù)據(jù)分析游客更偏向的旅游景點,為游客制定出更加貼合個人的出行方案;

          4.對之前的板塊功能進行測試,之后對測試的結果進行總結之后得出結論。

          本系統(tǒng)在長時間服務于用戶的環(huán)境下會有大量的數(shù)據(jù)生成,至此怎樣管理這些數(shù)據(jù)也是一個不容小覷的問題,對數(shù)據(jù)信息管理得當會提升客戶的滿意度。在系統(tǒng)開始時,進行需求分析,根據(jù)需求分析和實際開發(fā)相結合,分析出相應所需數(shù)據(jù),接著設計出數(shù)據(jù)庫表,這些數(shù)據(jù)庫表要能體現(xiàn)出彼此之間的關系。在對本網(wǎng)站各個功能進行合理分析后,設計出合格的數(shù)據(jù)庫。

          景點表存儲陜西旅游網(wǎng)站的景點信息,包括主鍵編號,基本信息等字段,在數(shù)據(jù)庫系統(tǒng)中,景點表是自動創(chuàng)建和維護的,通過查詢景點信息表了解數(shù)據(jù)庫內(nèi)部的結構、統(tǒng)計信息、性能瓶頸等相關信息,景點信息表中的數(shù)據(jù)可以通過SQL語句進行查詢和修改,通過系統(tǒng)界面修或者刪除數(shù)據(jù)。

          用Springboot和Mybatis完成了一個列表頁面的制作。主要代碼如下:

          1、MyBatis映射文件

          <select id="findAll" resultType="com.gl.entity.User">
          SELECT * FROM user
          </select>


          2、接口

          @Repository
          //必須是接口
          public interface UserMapper {
          User Sel(int id);
          
          List<User> findAll();
          }


          3、Service

          @Service
          public class UserService {
          @Autowired
          UserMapper userMapper;
          
          public User Sel(int id) {
          return userMapper.Sel(id);
          }
          
          public List<User> findAll() {
          return userMapper.findAll();
          }
          }


          4、Controller

          @GetMapping("/users")
          public String list(Model model) {
          List<User> users = userService.findAll();
          model.addAttribute("users", users);
          return "userlist";
          }


          5、Html使用thymeleaf模板引擎

          合Mybatis是本項目中的一個難點。

          實現(xiàn)功能:

          1 動態(tài)綁定用戶輸入?yún)?shù)

          2 Mybatis的resultType動態(tài)綁定返回實體類。

          3 在spring中的接口注入

          4 xml版本的mapper注入。

          關于Mybatis的優(yōu)秀文章給大家推薦兩個:

          1、手寫簡化版mybatis

          https://my.oschina.net/liughDevelop/blog/1631006

          2、Mybatis源碼解讀-設計模式總結

          http://www.crazyant.net/2022.html

          手寫板大致思路如下:

          https://my.oschina.net/liughDevelop/blog/1631006

          這里的Myconfiguration和我的JDBCUtils類似。

          實現(xiàn)思路:

          首先用XmlBuilderMapper類讀取mapper.xml(我是在initBean中指定要讀取的配置文件,并沒有寫成在xml中配置動態(tài)的讀取xml。)文件,獲取MapperInfo對象保存信息。

          用戶用MysqlSession的getMapper方法,返回一個代理對象,用這個代理對象來執(zhí)行MySqlSession定義的selectOne方法來查詢,Mybaits中的SqlSession中定義了大量的方法,我這里簡化只有一個selectOne方法。

          然后這個方法調(diào)用executor執(zhí)行器來解析sql,傳入?yún)?shù),執(zhí)行數(shù)據(jù)庫操作。最后返回結果。將返回結果封裝成對象。

          動態(tài)代理一般有兩種,一種是jdk一種是cglib動態(tài)代理,本項目采用是jdk動態(tài)代理實現(xiàn)。

          XmlBuilderMapper.class

          package spring.mybatis;
          
          import lombok.extern.slf4j.Slf4j;
          import org.dom4j.Document;
          import org.dom4j.DocumentException;
          import org.dom4j.Element;
          import org.dom4j.io.SAXReader;
          import spring.constants.Constants;
          import java.io.File;
          import java.util.ArrayList;
          import java.util.List;
          /**
          * @ClassName XmlBuilder
          * @Description
          * @Data 2018/7/8
          * @Author xiao liang
          */
          @Slf4j
          public class XmlBuilderMapper {
           public List<MapperInfo> buildMapper(String xmlMapperPath){
           //實例化mapperInfo的鏈表,每一條sql對應一個MapperInfo對象
           List<MapperInfo> mapperInfoList = new ArrayList<>();
           MapperInfo mapperInfo = new MapperInfo();
           // 創(chuàng)建saxReader對象
           SAXReader reader = new SAXReader();
           // 通過read方法讀取一個文件 轉換成Document對象
           Document document = null;
          
           String pathName = Constants.PATH + xmlMapperPath;
           try {
           document = reader.read(new File(pathName));
           } catch (DocumentException e) {
           log.error("文件沒有找到,{}", pathName);
           }
           //獲取根節(jié)點元素
           Element node = document.getRootElement();
           mapperInfo.setInterfaceName(node.attributeValue("namespace"));
           //獲取所有的bean
           List<Element> elementsList = node.elements();
           for (Element element :
           elementsList) {
           if ("select".equals(element.getName())){
           mapperInfo.setMethodName(element.attributeValue("id"));
           mapperInfo.setResultClassName(element.attributeValue("resultType"));
           mapperInfo.setSqlContent(element.getText());
           }
           mapperInfoList.add(mapperInfo);
           }
           return mapperInfoList;
           }
          }

          然后介紹一下MapperInfo對象

          package spring.mybatis;
          
          import lombok.Data;
          /**
          * @ClassName MapperInfo
          * @Description 用來封裝讀取mapper.xml文件后的信息
          * @Data 2018/7/8
          * @Author xiao liang
          */
          @Data
          public class MapperInfo {
           //namespace命名空間
           private String interfaceName;
           //sql內(nèi)容
           private String sqlContent;
           //對應的方法名
           private String methodName;
           //返回值的class名
           private String resultClassName;
          }

          JDBCUtils工具類我在開篇就介紹了,也沒什么新內(nèi)容,不貼在這里了

          其實關鍵點就是動態(tài)代理和執(zhí)行器

          MySqlSession(動態(tài)代理部分)

          package spring.mybatis;
          
          import java.lang.reflect.Proxy;
          /**
          * @ClassName MySqlSession
          * @Description
          * @Data 2018/7/8
          * @Author xiao liang
          */
          public class MySqlSession {
           public <T> T selectOne(MapperInfo mapperInfo ,Object[] paremeters){
           MyExecutor myexecutor = new MyExecutor();
           return myexecutor.query(mapperInfo,paremeters);
           }
           
           public <T> T getMapper(Class<?> aClass,String mybatisXmlName){
           return (T) Proxy.newProxyInstance(aClass.getClassLoader(),new Class[]{aClass},new MyMapperProxy(this,mybatisXmlName));
           }
          }

          MyMapperProxy(jdk動態(tài)代理的實現(xiàn)) 代理之后執(zhí)行的還是sqlSession中的方法

          package spring.mybatis;
          
          import java.lang.reflect.InvocationHandler;
          import java.lang.reflect.Method;
          import java.util.List;
          /**
          * @ClassName MyMapperProxy
          * @Description
          * @Data 2018/7/8
          * @Author xiao liang
          */
          public class MyMapperProxy implements InvocationHandler {
           private MySqlSession mySqlSession;
           private String mybatisXmlName;
           //mybatisXmlName傳入的要讀取的xml文件名
           public MyMapperProxy(MySqlSession mySqlSession , String mybatisXmlName){
           this.mySqlSession = mySqlSession;
           this.mybatisXmlName = mybatisXmlName;
           }
           @Override
           public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
           XmlBuilderMapper xmlBuilderMapper = new XmlBuilderMapper();
           List<MapperInfo> mapperInfoList = xmlBuilderMapper.buildMapper(mybatisXmlName);
           //如果存在sql,開始執(zhí)行方法
           if (mapperInfoList != null && mapperInfoList.size() != 0){
           for (MapperInfo mapperInfo :
           mapperInfoList) {
           if (!method.getDeclaringClass().getName().equals(mapperInfo.getInterfaceName())){
           return null;
           }
           if (method.getName().equals(mapperInfo.getMethodName())){
           //其實最后執(zhí)行的mySqlSession中的方法,args是用戶傳遞的參數(shù)數(shù)組
           return mySqlSession.selectOne(mapperInfo,args);
           }
           }
           }
           return null;
           }
          }

          返回到MySqlSession后,就輪到執(zhí)行器MyExcutor出場了。

          MyExcutor:也是一個難點,先說一下程序的邏輯。讀取到mapperinfo對象,獲得定義的sql,返回類的名稱等信息。

          用正則解析sql,根據(jù)#{},判斷sql中有幾處?,然后將用戶傳遞的參數(shù)按照順序依次寫入到sql的?中。

          最后讀取結果集,用set方法注入到返回的對象中,這樣就實現(xiàn)了返回時候的實體類綁定了。


          主站蜘蛛池模板: 日韩一区在线视频| 日本一区午夜爱爱| 久久一区二区三区精华液使用方法 | 亚洲夜夜欢A∨一区二区三区| 国产激情精品一区二区三区| 国产一区二区三区小说| 久草新视频一区二区三区| 亚洲国模精品一区| 日本高清一区二区三区| 中文字幕一区二区精品区| 国精品无码一区二区三区在线蜜臀| 久久久国产精品无码一区二区三区 | 高清在线一区二区| 无码视频一区二区三区| 伊人久久一区二区三区无码 | 中文字幕av一区| 久久精品午夜一区二区福利| 中文字幕在线精品视频入口一区 | 毛片无码一区二区三区a片视频| 一区二区视频在线观看| 国产成人一区二区三区在线| 国产午夜精品一区二区三区不卡| www.亚洲一区| 精品国产日韩亚洲一区| 国产在线观看一区二区三区精品| 久久精品人妻一区二区三区| 中文字幕一区二区三区日韩精品| 视频在线一区二区| 国产韩国精品一区二区三区| 中文字幕一区视频一线| 亚洲不卡av不卡一区二区| 日韩精品中文字幕无码一区 | 久久毛片一区二区| 亚洲爆乳精品无码一区二区| 国模极品一区二区三区| 日韩精品无码人妻一区二区三区| 亚洲国产高清在线一区二区三区| 国产91一区二区在线播放不卡| 人妻少妇AV无码一区二区| 亚洲高清日韩精品第一区| 色综合视频一区二区三区44|