JavaWeb - 旅遊網專案
阿新 • • 發佈:2020-11-14
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; } }快取優化