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,以便获取数据。

在这里插入图片描述
先到这了

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