Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
、研究的背景和意義
研究背景:本文主要是基于旅游業是我國現階段發展的重要產業,旅游可以推動經濟上的發展,通過深入的對當前旅游行業的研究,也隨著網絡技術的發展,傳統的旅游方式游客已經無法滿足,游客不再滿足于單一路線的線路,無法進行更多的選擇,每天日常的行程安排喪失了一定的自由選擇,這就導致降低了游客的期望,也減少了消費的欲望。所以旅游網站的建設就顯得尤為重要,游客可以通過網站來提前感受到各地的景色,為自己制定出一個貼合自己的路線,多元化的去選擇。帶給游客一種全新的體驗。
研究意義:旅游業是現代服務業的重要組成部分,國家為了促進旅游業的改革發展,也相繼出臺了相關政策。促進旅游業的發展,對于擴就業、增收入,推動一些中西部的貧困地區的發展有著重要的作用,也可以促進國家經濟的平穩增加。旅游業的發展也是為了能夠滿足人們日益增長的物質和文化上的需要,在如今這個互聯網發展飛速的時代,現階段越來越多的人想要走出家門去欣賞外面的風景,通過旅游讓自己精神和身體上的放松。人們可以通過上網來了解更多特色的地方,人們也對于旅游文化的要求越來越高,因此很多具有特色的和歷史悠久的地方成為了人們的選擇對象。而且隨著網絡的發展,更多的偏遠地區也有了一定的發展機會,一些不為人知的地方反而會成為熱門,每個地方憑借著自己的特色來引起人們的關注,所以人們需要一個專業的平臺去了解自己喜歡的文化。云旅游是可以擴大景區的知名度,增進當地民俗文化的發展,實現文化的對外輸出,另外云旅游這也是突破了時間與空間的限制,人們坐在家中就可以通過網絡來了解到其他地方的景色。走信息化的道路來推動旅游業的發展是一個很明智的選擇。相信隨著旅游網站系統功能的越來越成熟,結合著大數據技術的發展前景,為游客制定出更為舒適,更合理的旅游路線,讓游客更享受這段旅程。同時也隨著大眾們的旅游需求越來越高,我們的旅游網上市場也會發展的越來越快,旅游網站的建設也成為了一個重要的問題。
二、研究的目的和內容
研究目的:基于Java Web開發的旅游網站,開發該系統的主要目的,為游客的出行旅游提供便利,吸引游客為游客制定一系列服務功能,包括路線的選擇,景點的信息,酒店預訂信息,論壇交互等。
研究內容:本文主要基于陜西旅游的網站一體化服務,所開發的面向于游客的旅游管理系統。描述了該旅游系統的開發背景,首先從旅游需求分析開始,之后進行系統的總體架構設計,詳細設計與所能實現的功能和測試環節。
三、研究的方法和步驟
研究方法:
1. 數量研究法:通過網絡在線旅游時游客數量比較出主要線路趨勢,更全面的體現出游客對于旅游線路選擇的方向;
2.個案研究法:研究省內或省外游客,加以專門調查分析,全面了解省內游客及省外游客對于出省旅游的心思,再加以總結,會更透徹認識到其中的關系;
3.數據分析法:收集旅游游客對于旅游網站相關看法,進行數據分析,準確分析旅游網站發展前景。
4.文獻研究法:研究目的或課題,調查旅游網站相關文獻來獲得資料,從而多方面面地、正確地了解所要掌握的信息。
研究步驟:
1.準備建設網站相關技術,例:spring MVC、Mybatis框架、html、css、jQuery、Ajax和BootStrap等前端技術;
2.準備工作:收集相關旅游網站的資料,了解該模式運營的利害關系,明白旅游網站的發展趨勢;
3.首頁頁面設計,然后根據需求分析現有系統所需功能,對功能板塊劃分;
4.實現現有板塊前后臺功能;
5.進行歸納測試總結:系統功能實現以后,再次對功能板塊進行測試,最后再對測試結果進行總結得出結論。
四、擬解決的關鍵問題
1.了解旅游系統游客的需求,按照需求制定相關的功能;
2.對前后臺功能進行細致區分,讓管理員和游客分別管理或使用相應功能;
3.根據數據分析游客更偏向的旅游景點,為游客制定出更加貼合個人的出行方案;
4.對之前的板塊功能進行測試,之后對測試的結果進行總結之后得出結論。
本系統在長時間服務于用戶的環境下會有大量的數據生成,至此怎樣管理這些數據也是一個不容小覷的問題,對數據信息管理得當會提升客戶的滿意度。在系統開始時,進行需求分析,根據需求分析和實際開發相結合,分析出相應所需數據,接著設計出數據庫表,這些數據庫表要能體現出彼此之間的關系。在對本網站各個功能進行合理分析后,設計出合格的數據庫。
景點表存儲陜西旅游網站的景點信息,包括主鍵編號,基本信息等字段,在數據庫系統中,景點表是自動創建和維護的,通過查詢景點信息表了解數據庫內部的結構、統計信息、性能瓶頸等相關信息,景點信息表中的數據可以通過SQL語句進行查詢和修改,通過系統界面修或者刪除數據。
用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是本項目中的一個難點。
實現功能:
1 動態綁定用戶輸入參數
2 Mybatis的resultType動態綁定返回實體類。
3 在spring中的接口注入
4 xml版本的mapper注入。
關于Mybatis的優秀文章給大家推薦兩個:
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類似。
實現思路:
首先用XmlBuilderMapper類讀取mapper.xml(我是在initBean中指定要讀取的配置文件,并沒有寫成在xml中配置動態的讀取xml。)文件,獲取MapperInfo對象保存信息。
用戶用MysqlSession的getMapper方法,返回一個代理對象,用這個代理對象來執行MySqlSession定義的selectOne方法來查詢,Mybaits中的SqlSession中定義了大量的方法,我這里簡化只有一個selectOne方法。
然后這個方法調用executor執行器來解析sql,傳入參數,執行數據庫操作。最后返回結果。將返回結果封裝成對象。
動態代理一般有兩種,一種是jdk一種是cglib動態代理,本項目采用是jdk動態代理實現。
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(); // 創建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); } //獲取根節點元素 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內容 private String sqlContent; //對應的方法名 private String methodName; //返回值的class名 private String resultClassName; }
JDBCUtils工具類我在開篇就介紹了,也沒什么新內容,不貼在這里了
其實關鍵點就是動態代理和執行器
MySqlSession(動態代理部分)
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動態代理的實現) 代理之后執行的還是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,開始執行方法 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())){ //其實最后執行的mySqlSession中的方法,args是用戶傳遞的參數數組 return mySqlSession.selectOne(mapperInfo,args); } } } return null; } }
返回到MySqlSession后,就輪到執行器MyExcutor出場了。
MyExcutor:也是一個難點,先說一下程序的邏輯。讀取到mapperinfo對象,獲得定義的sql,返回類的名稱等信息。
用正則解析sql,根據#{},判斷sql中有幾處?,然后將用戶傳遞的參數按照順序依次寫入到sql的?中。
最后讀取結果集,用set方法注入到返回的對象中,這樣就實現了返回時候的實體類綁定了。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。