一、登入和注册功能的实现
1)登入和注册对应的用户类
public class User {
private Integer id;
private String username;
private String password;
private String email;
public User() {
}
public User(Integer id, String username, String password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
}
2)登入和注册的Servlet
public class UserServlet extends BeanServlet {
private UserService userService = new UserServiceImpl();
/**
* 处理登入的功能
*
* @param req
* @param resp
* @return void
* @author weisn
* @date 21:42
*/
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取参数
// String username = req.getParameter("username");
// String password = req.getParameter("password");
//使用 使用webUtils直接获取参数注入到对象中
User user = WebUtils.copyParamToBean(req.getParameterMap(), new User());
//调用userService处理登入逻辑
User loginUser = userService.login(new User(null, user.getUsername(), user.getPassword(), null));
if (loginUser == null) {
// 把错误信息,和回显的表单项信息,保存到Request域中
req.setAttribute("msg", "用户名或密码错误");
req.setAttribute("username", user.getUsername());
req.getRequestDispatcher("/pages/user/login.jsp").forward(req, resp);
} else {
// 登录 成功
// 保存用户登录的信息到Session域中
req.getSession().setAttribute("user", loginUser);
//跳转页面
req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req, resp);
}
}
/**
* 处理注册的功能
*
* @param req
* @param resp
* @return void
* @author weisn
* @date 21:42
*/
protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数
// String username = req.getParameter("username");
// String password = req.getParameter("password");
// String email = req.getParameter("email");
String code = req.getParameter("code");
User user = WebUtils.copyParamToBean(req.getParameterMap(), new User());
//2、检查 验证码是否正确 === 写死,要求验证码为:abcde
if (code.equalsIgnoreCase(code)) {
// 3、检查 用户名是否可用
if (userService.existsUsername(user.getUsername())) {
System.out.println("用户名[" + user.getUsername() + "]已存在!");
//跳回注册页面
// 把回显信息,保存到Request域中
req.setAttribute("msg", "用户名已经存在");
req.setAttribute("username", user.getUsername());
req.setAttribute("email", user.getEmail());
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp);
} else {//如果用户名不存在就调用Service保存到数据库
userService.registUser(new User(null, user.getUsername(), user.getPassword(), user.getEmail()));
//跳到注册成功页面 regist_success.jsp
req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req, resp);
}
} else {//注册不成功
// 把回显信息,保存到Request域中
req.setAttribute("msg", "验证码错误");
req.setAttribute("username", user.getUsername());
req.setAttribute("email", user.getEmail());
System.out.println("验证码[" + code + "]错误");
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp);
}
}
}
3)登入和注册的Service
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoimpl();
/**
* 注册功能的Dao操作
*
* @author weisn
* @param user
* @return void
* @date 22:42
*/
@Override
public void registUser(User user) {
userDao.saveUser(user);
}
/**
* 登入功能Dao操作
*
* @author weisn
* @param user
* @return com.atguigu.pojo.User
* @date 22:40
*/
@Override
public User login(User user) {
return userDao.querUserByUsernameAndPassword(user.getUsername(), user.getPassword());
}
/**
* 判断用户名是否存在
*
* @author weisn
* @param username
* @return boolean
* @date 22:40
*/
@Override
public boolean existsUsername(String username) {
if (userDao.querUserByUsername(username) == null) {
// 等于null,说明没查到,没查到表示可用
return false;
}
return true;
}
}
4)登入和注册的Dao
public class UserDaoimpl extends BaseDao implements UserDao {
@Override
public User querUserByUsername(String username) {
String sql = "select `id`,`username`,`password`,`email` from t_user where username=? ";
return querForone(User.class,sql,username);
}
@Override
public User querUserByUsernameAndPassword(String username, String password) {
String sql="select `id`,`username`,`password`,`email` from t_user where username = ? and password = ?";
return querForone(User.class,sql,username,password);
}
@Override
public int saveUser(User user) {
String sql = "insert into t_user(`username`,`password`,`email`) values(?,?,?)";
return update(sql, user.getUsername(),user.getPassword(),user.getEmail());
}
}
二、显示登入的用户名信息
1)UserServlet 程序中保存用户登录的信息
// 登录 成功
// 保存用户登录的信息到Session域中
req.getSession().setAttribute("user", loginUser);
//跳转页面
req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req, resp);
2)修改 login_succuess_menu.jsp
//从session中获取用户名显示
<span>欢迎<span class="um_span">${sessionScope.user.username}</span>光临尚硅谷书城</span>
3)还要修改首页 index.jsp 页面的菜单 :
//选择性展示有关信息
<div>
<%--如果用户还没有登录,显示 【登录 和注册的菜单】 --%>
<c:if test="${empty sessionScope.user}">
<a href="pages/user/login.jsp">登录</a> |
<a href="pages/user/regist.jsp">注册</a>
</c:if>
<%--如果已经登录,则显示 登录 成功之后的用户信息。--%>
<c:if test="${not empty sessionScope.user}">
<span>欢迎<span class="um_span">${sessionScope.user.username}</span>光临尚硅谷书城</span>
<a href="pages/order/order.jsp">我的订单</a>
<a href="userServlet?action=logout">注销</a>
</c:if>
<a href="pages/cart/cart.jsp">购物车</a>
<a href="pages/manager/manager.jsp">后台管理</a>
</div>
三、注销登入
- 销毁 Session 中用户登录的信息(或者销毁 Session)
- 重定向到首页(或登录页面)。
1)注销登入的Servlet程序
/**
* 注销功能的实现
*
* @param req
* @param resp
* @return void
* @author weisn
* @date 16:21
*/
protected void logout(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、销毁Session中用户登录的信息(或者销毁Session)
req.getSession().invalidate();
// 2、重定向到登录页面(或首页)。
resp.sendRedirect("/pages/user/login.jsp");
}
}
2)修改【注销】的菜单地址
<a href="userServlet?action=logout">注销</a>