java web 簡單版網上書城-登錄後顯示圖書

java web 簡單版網上書城-登錄後顯示圖書

放寒假了,哈哈哈
在這裏插入圖片描述
還是得繼續學習,繼續前一篇
https://blog.csdn.net/weixin_44889138/article/details/103837661
項目 GitHub地址
https://github.com/LGH-cmd/booksystem

回顯用戶名

  1. 在LoginServlet中添加代碼,驗證成功後將user對象存儲到session域中。

在這裏插入圖片描述

  1. 在head.jsp頁面中,使用EL表達式回顯用戶名。

在這裏插入圖片描述

註銷用戶

實現思路:

點擊註銷用戶時,超鏈接請求到後臺LogoutServlet中,刪除請求對應的session域中的USER屬性,然後重定向請求到login.jsp頁面。

  1. 在user包下創建LogoutServlet類
@WebServlet("/logoutServlet")
public class LogoutServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 刪除請求對應的session域中的USER屬性
		HttpSession session = req.getSession();
		session.removeAttribute("USER");
		
		//重定向請求到login.jsp頁面
		resp.sendRedirect(req.getContextPath()+"/login.jsp");
		
	}
	
}

  1. 在head.jsp頁面中,修改註銷用戶的超鏈接地址爲 logoutServlet
    在這裏插入圖片描述

顯示圖書列表

  1. 創建圖書信息表t_book, 並添加測試數據
DROP TABLE IF EXISTS `t_book`;
CREATE TABLE `t_book` (
  `id` varchar(10) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `price` decimal(6,2) DEFAULT NULL,
  `bnum` int(15) DEFAULT NULL,
  `category` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `t_book` VALUES ('1001', 'java編程思想', '69.90', '800', '計算機軟件');
INSERT INTO `t_book` VALUES ('1002', 'java從入門到精通', '35.80', '1000', '計算機軟件');
INSERT INTO `t_book` VALUES ('1003', 'javaEE企業應用開發', '58.00', '500', '計算機軟件');
INSERT INTO `t_book` VALUES ('1004', '數據結構與算法', '59.00', '200', '計算機軟件');
INSERT INTO `t_book` VALUES ('1005', '紅樓夢', '89.90', '600', '經典名著');
INSERT INTO `t_book` VALUES ('1006', '三國演義', '68.80', '600', '經典名著');

在這裏插入圖片描述

  1. 在model包中創建圖書實體類 Book
public class Book {
	
	private String id;  //書號
	private String name; //書名
	private double price; //價格
	private int bnum; //數量
	private String category; //類別
	
	
	public Book() {
		super();
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public int getBnum() {
		return bnum;
	}
	public void setBnum(int bnum) {
		this.bnum = bnum;
	}
	public String getCategory() {
		return category;
	}
	public void setCategory(String category) {
		this.category = category;
	}
	//重寫toString方法
	@Override
	public String toString() {
		return "Book [id=" + id + ", name=" + name + ", price=" + price + ", bnum=" + bnum + ", category=" + category
				+ "]";
	}
	
	
}
  1. 在dao包中創建BookDao類

public class BookDao {
	
	//查詢所有圖書信息,封裝成Book對象集合返回
	public ArrayList<Book> findAllBooks() throws Exception{
		ArrayList<Book> list = new ArrayList<>();
		//查詢t_book表,將數據封裝到集合中
		//獲取連接
		Connection conn = JdbcUtil.getConnection();
		//獲取執行者對象
		String sql = "select * from t_book";
		PreparedStatement prps = conn.prepareStatement(sql);
		//查詢並返回結果集
		ResultSet set = prps.executeQuery();
		//處理結果集
		while(set.next()){
			Book b = new Book();
			//獲取每一個字段的值
			String id = set.getString("id");
			String name = set.getString("name");
			double price = set.getDouble("price");
			int bnum = set.getInt("bnum");
			String category = set.getString("category");
			//將查詢結果設置到Book對象中
			b.setId(id);
			b.setName(name);
			b.setPrice(price);
			b.setBnum(bnum);
			b.setCategory(category);
			//添加對象到集合中
			list.add(b);
		}
		
		return list;
	}

}


  1. 在web包下中創建book包,在包中創建BookServlet類

@WebServlet("/bookServlet")
public class BookServlet extends HttpServlet {
	private BookDao bookDao = new BookDao();
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 獲取所有圖書
		try {
			ArrayList<Book> list = bookDao.findAllBooks();
			//將集合存儲到request請求域中
			req.setAttribute("BOOKLIST", list);
			//轉發請求到index.jsp頁面,在頁面進行取值
			req.getRequestDispatcher("index.jsp").forward(req, resp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			resp.setContentType("text/html;charset=utf-8");
			resp.getWriter().write("系統異常,請聯繫管理員 10086");
		}
		
	}
	
}	
  1. 在index.jsp頁面使用JSTL的循環標籤遍歷獲取集合的圖書信息。

在這裏插入圖片描述

在瀏覽器訪問地址 : http://localhost:8080/booksystem/bookServlet ,效果如下:

在這裏插入圖片描述

重要一步

實現未登錄攔截

實現思路:

創建過濾器攔截所有請求資源。

如果請求是訪問登錄頁面(login.jsp)或註冊頁面(register.jsp),直接放行。

如果是訪問其他頁面或資源,需要判斷用戶是否登錄,如果登錄直接放行,否則攔截請求,重定向到登錄頁面(login.jsp)

  1. 新建com.wei_xhh.booksystem.filter包,在包中創建LoginFilter過濾器。

@WebFilter("/*")
public class LoginFilter implements Filter {
	
	//根據登錄狀態實現資源攔截
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//將請求和響應對象轉成Http類型的請求和響應
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse resp = (HttpServletResponse)response;
		
		//獲取請求地址
		String path = req.getRequestURI();
		//判斷是否是登錄或註冊的請求
		if(path.contains("/login.jsp") 
				|| path.contains("/register.jsp") 
				|| path.contains("/loginServlet")
				|| path.contains("/registerServlet")
				|| path.contains("/css")
				|| path.contains("/images")
				|| path.contains("/js")
				|| path.contains("/checkNameServlet")){
			//放行資源
			chain.doFilter(req, resp);
		}else{
			//其他請求是否放行,需要根據是否登錄決定
			//獲取session中的USER屬性
			User user = (User)req.getSession().getAttribute("USER");
			//如果user不爲null,表示用戶已經登錄過,直接放行,否則重定向到登錄頁面
			if(user!=null){
				chain.doFilter(req, resp);
			}else{
				resp.sendRedirect(req.getContextPath()+"/login.jsp");
			}
		}
	}

	@Override
	public void destroy() {}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
	}
}

  1. 解決登錄成功後查詢不到數據的問題。

解決方案:
修改LoginServlet,在用戶登錄成功後不是直接重定向到index.jsp頁面,應該是請求後臺BookServlet,以便獲取數據。

在這裏插入圖片描述
先到這了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章