基於JSP+Servlet+Redis實現旅游網系統


本項目基於JSP+Servlet+Redis實現的旅游網系統

本項目基於用戶登錄,注冊,退出,旅游線路查詢,旅游線路展示,展示我的收藏來,展開項目總體分為Dao層,Service層,Servlet層,util層,domain層和前端頁面,項目采用前后端分離技術,利用Ajax進行前后端數據交互

1 技術選型

1.1 Web

a) Servlet:前端控制器

b) html:視圖

c) Filter:過濾器

d) BeanUtils:數據封裝

e) Jacksonjson序列化工具

1.2 Service

f) Javamailjava發送郵件工具

g) Redisnosql內存數據庫

h) Jedisjavaredis客戶端

1.3 Dao

i) Mysql:數據庫

j) Druid:數據庫連接池

k) JdbcTemplatejdbc的工具

下面分別介紹各個階段的實現

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>&yen;</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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM