、研究的背景和意義
研究背景:本文主要是基于旅游業(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)了返回時候的實體類綁定了。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。