本項目基於JSP+Servlet+Redis實現的旅游網系統
本項目基於用戶登錄,注冊,退出,旅游線路查詢,旅游線路展示,展示我的收藏來,展開項目總體分為Dao層,Service層,Servlet層,util層,domain層和前端頁面,項目采用前后端分離技術,利用Ajax進行前后端數據交互
1 技術選型
1.1 Web層
a) Servlet:前端控制器
b) html:視圖
c) Filter:過濾器
d) BeanUtils:數據封裝
e) Jackson:json序列化工具
1.2 Service層
f) Javamail:java發送郵件工具
g) Redis:nosql內存數據庫
h) Jedis:java的redis客戶端
1.3 Dao層
i) Mysql:數據庫
j) Druid:數據庫連接池
k) JdbcTemplate:jdbc的工具
下面分別介紹各個階段的實現
2.用戶注冊
2.1用戶注冊涉及賬號激活,激活用郵箱激活
3.用戶登錄
4.用戶退出
什么叫做登錄了?session中有user對象。 那么退出就是將session中的user對象刪除掉 實現步驟: 1.訪問servlet,將session銷毀 2.跳轉到登錄頁面 代碼實現: Header.html Servlet: //1.銷毀session request.getSession().invalidate(); //2.跳轉登錄頁面 response.sendRedirect(request.getContextPath()+"/login.html");
5.主頁面展示用戶姓名
header.html代碼 $(function () { //直接發送一個異步get提交 $.get("user/findUser",{},function (data) { //接收服務器響應過來的User的姓名{uid:xx,username:xx,password:xx,name:'渣渣超'} var msg = "歡迎回來,"+data.name ; $("#span_id").html(msg) ; }) ; }) ; Servlet代碼 //從session中獲取登錄用戶 Object user = request.getSession().getAttribute("user"); //將user寫回客戶端 ObjectMapper mapper = new ObjectMapper(); response.setContentType("application/json;charset=utf-8"); mapper.writeValue(response.getOutputStream(),user);
6.旅游線路分類
7.旅游線路分類展示
8.旅游線路查詢
8.1查詢參數的傳遞 在header.html中 $("#search-button").click(function () { //線路名稱 var rname = $("#search_input").val(); var cid = getParameter("cid"); // 跳轉路徑 http://localhost/travel/route_list.html?cid=5,拼接上rname=xxx location.href="http://localhost/travel/route_list.html?cid="+cid+"&rname="+rname; }); 在route_list.html var cid = getParameter("cid"); //獲取rname的參數值 var rname = getParameter("rname"); //判斷rname如果不為null或者"" if(rname){ //url解碼 rname = window.decodeURIComponent(rname); } 8.2修改后台代碼(修改代碼用紅體標注) Servlet public void rec(HttpServletRequest request, HttpServletResponse response) throws IOException { //1.從前台獲取數據 String cidStr = request.getParameter("cid"); String currentPageStr = request.getParameter("currentPage"); String pageSizeStr = request.getParameter("pageSize"); String rname = request.getParameter("rname"); rname = new String(rname.getBytes("ISO-8859-1"),"utf-8"); //2.如果第一次訪問,當前頁碼支點默認值/cid/pageSize int cid = 0; if(cidStr != null && cidStr.length()>0 && !"null".equals(cidStr)){ //cid存在 cid = Integer.parseInt(cidStr); } int currentPage = 0; if(currentPageStr != null && currentPageStr.length()>0){ //cid存在 currentPage = Integer.parseInt(currentPageStr); }else{ currentPage = 1; } int pageSize = 0; if(pageSizeStr != null && pageSizeStr.length()>0){ pageSize = Integer.parseInt(pageSizeStr); }else{ //默認等於5 pageSize = 5; } //3.從數據庫中獲取數據 PageBean<Route> pb = routeService.pageQuery(cid,currentPage,pageSize,rname); //4.將pageBean對象直接返回給前台頁面,發送json對象 writeValue(pb,response); } Service public PageBean<Route> pageQuery(int cid, int currentPage, int pageSize,String rname) { PageBean<Route> pb = new PageBean<>(); //設置當前頁碼 pb.setCurrentPage(currentPage); //設置總記錄數(查數據庫) int totalCount = routeDao.findTotalPage(cid,rname); System.out.println("totalCount = "+totalCount); pb.setTotalCount(totalCount); //設置頁數 pb.setPageSize(pageSize); //封裝列表集合(查數據庫) //起始條數 = (當前頁碼 - 1) * 每頁顯示條數 int start = (currentPage - 1) * pageSize; List<Route> list = routeDao.findByPage(cid,start,pageSize,rname); pb.setList(list); //計算總頁數 int totalPage = totalCount%pageSize == 0 ? totalCount/pageSize:(totalCount/pageSize)+1; pb.setTotalPage(totalPage); return pb; } Dao(全部進行修改) public int findTotalPage(int cid,String rname) { String sql = "select count(*) from tab_route where 1 = 1"; StringBuilder sb = new StringBuilder(sql); List list = new ArrayList(); if(cid != 0){ sb.append(" and cid = ?"); list.add(cid); } if(rname != null && rname.length()>0){ sb.append(" and rname like ?"); list.add("%"+rname+"%"); } sql = sb.toString(); //查詢並返回 return template.queryForObject(sql,Integer.class,list.toArray()); } @Override public List<Route> findByPage(int cid, int start, int pageSize,String rname) { //sql語句 String sql = "select * from tab_route where 1 = 1 "; StringBuilder sb = new StringBuilder(sql); List list = new ArrayList(); if(cid != 0){ sb.append(" and cid = ?"); list.add(cid); } if(rname != null && rname.length()>0){ sb.append(" and rname like ?"); list.add("%"+rname+"%"); } sb.append(" limit ?, ? "); sql = sb.toString(); list.add(start); list.add(pageSize); //查詢並返回 return template.query(sql,new BeanPropertyRowMapper<Route>(Route.class),list.toArray()); } 8.3修改前台代碼 $(function () { //獲取cid var cid = getParameter("cid"); //獲取rname var rname = getParameter("rname"); //如果rname不為空, if(rname){ rname = window.decodeURIComponent(rname); } load(cid,null,rname); }); function load(cid ,currentPage,rname){ //發送ajax請求,請求route/pageQuery,傳遞cid $.get("route/rec",{cid:cid,currentPage:currentPage,rname:rname},function (data) { //解析pagebean數據,展示到頁面上 //獲取記錄數和頁數 $("#totalPage").html(data.totalPage); $("#totalCount").html(data.totalCount); var lis = ""; if(data.currentPage != 1){ //首頁 var firstPage = '<li onclick="javascript:load('+cid+',1,\''+rname+'\')"><a href="javascript:void(0)">首頁</a></li>'; //計算上一頁,當前頁碼減一 var cur = data.currentPage>1? data.currentPage-1:1; var beforePage = '<li class="threeword" onclick="javascript:load('+cid+','+cur+',\''+rname+'\')"><a href="javascript:void(0)">上一頁</a></li>'; lis += firstPage; lis += beforePage; } /* * 1.一共展示10個頁碼,能夠達到前5后4 * 2.如果前面不足5個,后面補齊10個 * 3.如果后面不夠4個,前面補齊10個 */ //定義開始位置begin,結束位置end var begin; var end; //1.判斷總頁數是否大於10, if(data.totalPage < 10){ begin = 1; end = data.totalPage; } begin = data.currentPage - 5; end = data.currentPage + 4; if(begin<1){ begin = 1; end = begin + 9; } if(end>data.totalPage){ end = data.totalPage; begin = end - 9>0?end-9:1; } for (var i = begin;i<=end;i++){ var li; if(i == data.currentPage){ li = '<li class="curPage" onclick="javascript:load('+cid+','+i+',\''+rname+'\')"><a href="javascript:void(0)">'+i+'</a></li>'; }else{ li = '<li onclick="javascript:load('+cid+','+i+',\''+rname+'\')"><a href="javascript:void(0)">'+i+'</a></li>'; } lis += li; } if(data.currentPage != data.totalPage){ //下一頁 var next = data.currentPage == data.totalPage? data.currentPage:data.currentPage+1; var nextPage = '<li class="threeword" onclick="javascript:load('+cid+','+next+',\''+rname+'\')" ><a href="javascript:;">下一頁</a></li>'; //末頁 var lastPage = '<li class="threeword" onclick="javascript:load('+cid+','+data.totalPage+',\''+rname+'\')"><a href="javascript:;">末頁</a></li>'; lis += nextPage; lis += lastPage; } $("#pageNum").html(lis); //列表數據的顯示 var list_lis = ""; //遍歷后台傳遞過來的pageBean中的列表數據集合 for(var i = 0;i<data.list.length;i++){ var route = data.list[i]; var li = '<li>\n' + '<div class="img"><img width="299px" src="'+route.rimage+'" alt=""></div>\n' + ' <div class="text1">\n' + ' <p>'+route.rname+'</p>\n' + ' <br/>\n' + ' <p>'+route.routeIntroduce+'</p>\n' + ' </div>\n' + '<div class="price">\n' + ' <p class="price_num">\n' + ' <span>¥</span>\n' + ' <span>'+route.price+'</span>\n' + ' <span>起</span>\n' + ' </p>\n' + ' <p><a href="route_detail.html">查看詳情</a></p>\n' + '</div>\n' + '</li>'; list_lis += li; } $("#list_page").html(list_lis); window.scroll(0,0); }); }
9.旅游線路詳情展示
10.旅游線路收藏
11.旅游線路收藏展示
以上就是該項目的分析;詳情請看源碼:https://github.com/dukaichao/project