1. 程式人生 > 實用技巧 >JavaWeb - 旅遊網專案

JavaWeb - 旅遊網專案

1. 專案匯入與啟動

  可在EditConfiguration中編輯啟動命令

2. 技術選型

  1. Web層

    (1)Servlet :前端控制器

    (2)html :檢視

    (3)Filter : 過濾器

    (4)BeanUtils : 資料封裝

    (5)Jackson : json序列化工具

  2. Service層

    (1)Javamail :java傳送郵件的工具

    (2)Redis :nosql記憶體資料庫

    (3)Jedis :java的redis客戶端

  3. Dao層

    (1)Mysql :資料庫

    (2)Druid :資料庫連線池

    (3)JDBCTemplate :jdbc的工具

3. 建立資料庫

-- 建立資料庫
CREATE DATABASE travel;

-- 使用資料庫
USE travel;

4. 使用者註冊功能

  註冊功能分析:

5. 郵箱啟用

  為什麼要進行郵件啟用?

    * 為了保證使用者填寫的郵箱是正確的,將來可以推廣一些宣傳資訊到使用者郵箱中。

6. 使用者登入功能

7. 退出登入功能

  * 什麼叫做登入了?session中有user物件

  * 實現步驟:

    1. 訪問servlet,將session銷燬

    2. 跳轉到登入頁面

<a href="javascript:location.href='exitServlet';">退出</a>

         // 銷燬session
        request.getSession().invalidate();

        // 跳轉頁面
        response.sendRedirect(request.getContextPath()+"/login.html");    

8. 優化Servlet

  * 減少Servlet的數量,現在是一個功能一個Servlet,將其優化為一個模組一個Servlet

  * 相當於在資料庫中一張表對應一個servlet,在Servlet中提供不同的方法,完成使用者的請求

                         * 抽取BaseServlet

  service方法亂碼問題: maven runner中設定:-Dfile.encoding=gb2312

package cn.itcast.travel.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //System.out.println("baseservlet的方法執行了");

        // 完成方法的分發
        // 1. 獲取請求路徑
        String uri = req.getRequestURI(); // 返回如:/travel/user/add
        System.out.println(uri);
        // 2. 獲取方法名稱
        String methodName = uri.substring(uri.lastIndexOf("/") + 1);
        System.out.println(methodName);
        // 3. 獲取方法物件 this就是UserServlet物件 通過位元組碼檔案 反射獲取
        System.out.println(this); // this就是UserServlet物件
        try {
            // getDeclaredMethod會忽略方法訪問許可權修飾符 protected就能被訪問
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            // 4. 執行方法
            // 暴力反射
            //method.setAccessible(true);
            method.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }
}
BaseServlet

9. 分類資料展示功能

  分析:分析發現,分類的資料在每一次頁面載入後都會重新請求資料庫來載入 ,對資料庫的壓力比較大,而且分類的資料不會經常產生變化,所以可以使用redis來快取這個資料

package cn.itcast.travel.service.impl;

import cn.itcast.travel.dao.CategoryDao;
import cn.itcast.travel.dao.impl.CategoryDaoImpl;
import cn.itcast.travel.domain.Category;
import cn.itcast.travel.service.CategoryService;
import cn.itcast.travel.util.JedisUtil;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class CategoryServiceImpl implements CategoryService {
    private CategoryDao dao = new CategoryDaoImpl();
    @Override
    public List<Category> findAll() {
        // 1. 從redis中查詢
        // 1.1 獲取jedis客戶端
        Jedis jedis = JedisUtil.getJedis();
        // 1.2 使用sortedset排序查詢
        Set<String> categorys = jedis.zrange("category", 0, -1);
        List<Category> cs = null;
        // 2. 判斷查詢的集合是否為空
        if(categorys == null || categorys.size() == 0){
            // 3. 如果為空,需要從資料庫中查詢,再將資料存入redis
            // 3.1 從資料庫查詢
            System.out.println("從資料庫查詢");
            cs = dao.findAll();

            // 3.2 將集合資料儲存到redis中的key為category的sorted set中
            for (int i = 0; i < cs.size(); i++) {
                jedis.zadd("category",cs.get(i).getCid(),cs.get(i).getCname());
            }
        }else {
            // 4. 如果不為空,將set的資料存入list中,要做到資料結構統一,因為後期要返回一個list集合
            System.out.println("從redis中查詢");
            cs = new ArrayList<Category>();
            for (String name : categorys){
                Category category = new Category();
                category.setCname(name);
                cs.add(category);
            }
        }
        return cs;
    }
}
快取優化

10. 旅遊線路的分頁資訊展示

  類別id的傳遞:

    * Redis中查詢score(cid)

    * index頁面傳遞cid(通過location.search獲取cid)

    * 獲取index頁面傳來的cid

分析:

11. 旅遊線路名稱查詢

  在header.html中

  在route_list中獲取引數

  修改後臺程式碼:

Servlet中:

route_list.html中:

12. 旅遊線路詳情展示

13. 旅遊線路收藏

  1. 當頁面載入完成後,首先發送ajax請求,獲取使用者是否收藏的標記

  2. 根據標記,再去展示不同的按鈕樣式

資料庫表關係:

分析:

14. 點選按鈕收藏