源码放在了github上:https://github.com/PonnyDong/jsp-servlet-
前面的几篇中展示了网页的登录与注册的功能。
登录与注册一
登录与注册二
登录与注册三
登录与注册四
接下来,介绍自动登录、动态显示零食信息、购物车、添加删除零食、清空购车的功能。
首先是数据库和Myeclipse的展示:
数据库名为project,两个表名分别为product与user。
主页面的展示:
登录界面:
登录成功之后跳转到主页面,在原先登录的地方,动态显示用户的名字。也可以勾取自动登录按钮,即使关闭了浏览器,再打开时仍是这个用户名。
注册:
点击每个零食信息都会跳转到添加购物车界面:
可以自定义选择购买物品的数量,添加购物车:
显示每个物品的单价,以及总价格。可以对每个物品进行删除、清空购物车。
当购物车为空时,显示购物车为空的界面。自动登录
自动登录部分可以继续在登录部分的Servlet中完成。首先应当判断何时自动登录?在登录界面有自动登录选项,此时我们可以判断:当自动登录的选项勾上时,我们执行自动登录的功能。
<input type="checkbox" name="autoLogin" value="autoLogin"> 自动登录
我们将其设置为autoLogin,将其传递给LoginServlet,在LoginServlet中判断其是否点击了,
String autoLogin=request.getParameter("autoLogin");
if(autoLogin!=null){
//编码
String username_code = URLEncoder.encode(username, "UTF-8");
String password_code = URLEncoder.encode(password, "UTF-8");
Cookie cookie_username=new Cookie("cookie_username",username_code);
Cookie cookie_password=new Cookie("cookie_password",password_code);
cookie_username.setMaxAge(100);//自动登录持续时间
cookie_password.setMaxAge(100);
//设置访问路径
cookie_username.setPath(request.getContextPath());
cookie_password.setPath(request.getContextPath());
//发送cookie
response.addCookie(cookie_username);
response.addCookie(cookie_password);
}
设置编码、自动登录持续的时间、以及访问路径等。如果从jsp中传来autoLogin不为空的信息,那么,if条件便满足。
接下来设置一个自动登录的Filter过滤器。在LoginServlet中已经发送了cookie,在过滤器中需要接收cookie中的username和pasword
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse) response;
HttpSession session = req.getSession();
Cookie[] cookies = req.getCookies();
判断cookie中的username和password是否为空,
if(cookie_username!=null&&cookie_password!=null){
UserService service=new UserService();
User user=null;
try {
user=service.login(cookie_username, cookie_password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
session.setAttribute("user", user);
}
如果username和password不为空,那么就传递到Service层,由service层传递到Dao层,
public User login(String username, String password) throws SQLException {
// TODO Auto-generated method stub
UserDao dao=new UserDao();
return dao.login(username,password);
}
信息传递到dao层之后,经Dao层向数据库中查询之后,返回查询的结果:
public User login(String username, String password) throws SQLException {
// TODO Auto-generated method stub
QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from [user] where username=? and password=?";
return runner.query(sql, new BeanHandler<User>(User.class), username,password);
}
自动登录与登录部分有相似之处,两者都需要Service层接收username和password,并将其传递给Dao层,由Dao层向数据库中判断传递过来的username和password是否在数据库中已经已经存在。而自动登录需要在登录的基础上,判断是否已经勾选autoLogin。
动态显示Username
我们实现了登录的功能之后,如何知道当前的Username是什么?能否动态显示当前当前用户名?
回到head.jsp中,如果已经实现了登录,那么用户名也就不为空,此时需要判断:如果username不为空,那么就显示username;如果username为空,那么就继续显示登录链接。
引入JSTL
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:if test="${empty user }">
<li><a href="login.jsp">登录</a></li>
<li><a href="register.jsp">注册</a></li>
</c:if>
<c:if test="${!empty user }">
<li>欢迎您:${user.username }</li>
<li><a href="#">退出</a></li>
</c:if>
<li><a href="cart.jsp">购物车</a></li>
<li><a href="#">帮助中心</a></li>