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