java web 簡單版網上書城-登錄後顯示圖書
放寒假了,哈哈哈
還是得繼續學習,繼續前一篇
https://blog.csdn.net/weixin_44889138/article/details/103837661
項目 GitHub地址
https://github.com/LGH-cmd/booksystem
回顯用戶名
- 在LoginServlet中添加代碼,驗證成功後將user對象存儲到session域中。
- 在head.jsp頁面中,使用EL表達式回顯用戶名。
註銷用戶
實現思路:
點擊註銷用戶時,超鏈接請求到後臺LogoutServlet中,刪除請求對應的session域中的USER屬性,然後重定向請求到login.jsp頁面。
- 在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");
}
}
- 在head.jsp頁面中,修改註銷用戶的超鏈接地址爲 logoutServlet
顯示圖書列表
- 創建圖書信息表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', '經典名著');
- 在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
+ "]";
}
}
- 在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;
}
}
- 在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");
}
}
}
- 在index.jsp頁面使用JSTL的循環標籤遍歷獲取集合的圖書信息。
在瀏覽器訪問地址 : http://localhost:8080/booksystem/bookServlet ,效果如下:
重要一步
實現未登錄攔截
實現思路:
創建過濾器攔截所有請求資源。
如果請求是訪問登錄頁面(login.jsp)或註冊頁面(register.jsp),直接放行。
如果是訪問其他頁面或資源,需要判斷用戶是否登錄,如果登錄直接放行,否則攔截請求,重定向到登錄頁面(login.jsp)
- 新建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
}
}
- 解決登錄成功後查詢不到數據的問題。
解決方案:
修改LoginServlet,在用戶登錄成功後不是直接重定向到index.jsp頁面,應該是請求後臺BookServlet,以便獲取數據。
先到這了