您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
10-案例-用户注册(获取自增id)
发布时间:2024-12-07 13:49:46编辑:雪饮阅读()
-
其实这次主要想要实现的同样是对前番实现的注册功能的整合,整合到上篇中的项目中。
那么其实第一个就是我觉得把注册与登录都整合在一个service中,并需要考虑封装下注册成功后记住密码功能肯定要清理下,不然跳转到登录界面的时候还记录之前的用户名和密码,真就不太好了,另外也统一处理下中文乱码,所以也用之前的工具类来获取参数。所以这个service则如:
package com.service;
import com.mapper.UserMapper;
import com.pojo.User;
import com.util.SessionFactoryUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.URLEncoder;
public class UserService {
SqlSessionFactory sqlSessionFactory= SessionFactoryUtil.getSqlSessionFactory();
public void cleanRemember(HttpServletRequest req,HttpServletResponse resp,User user){
String remember=req.getParameter("remember");
Cookie cookie_u=new Cookie("username", URLEncoder.encode(user.getUsername()));
Cookie cookie_c=new Cookie("password", user.getPassword());
Cookie remember_c=new Cookie("remember", remember);
cookie_u.setMaxAge(0);
cookie_c.setMaxAge(0);
remember_c.setMaxAge(0);
resp.addCookie(cookie_u);
resp.addCookie(cookie_c);
resp.addCookie(remember_c);
}
public User login(HttpServletRequest req,HttpServletResponse resp) throws IOException {
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
String username=SessionFactoryUtil.getParameter(req,"username");
String password=SessionFactoryUtil.getParameter(req,"password");
User user=userMapper.select(username,password);
sqlSession.close();
if(user!=null){
HttpSession session= req.getSession();
session.setAttribute("user",user);
String remember=req.getParameter("remember");
if(remember==null){
remember="";
}
Cookie cookie_u=new Cookie("username", URLEncoder.encode(user.getUsername()));
Cookie cookie_c=new Cookie("password", user.getPassword());
Cookie remember_c=new Cookie("remember", remember);
if(remember.equals("1")){
cookie_u.setMaxAge(60*60*24*7);
cookie_c.setMaxAge(60*60*24*7);
remember_c.setMaxAge(60*60*24*7);
resp.addCookie(cookie_u);
resp.addCookie(cookie_c);
resp.addCookie(remember_c);
}
if(remember.equals("1")==false){
cookie_u.setMaxAge(0);
cookie_c.setMaxAge(0);
remember_c.setMaxAge(0);
cleanRemember(req,resp,user);
}
}
return user;
}
public User register(HttpServletRequest req,HttpServletResponse resp){
User user=new User();
String username=SessionFactoryUtil.getParameter(req,"username");
String password=SessionFactoryUtil.getParameter(req,"password");
user.setUsername(username);
user.setPassword(password);
SqlSession sqlSession=sqlSessionFactory.openSession(true);
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
if(userMapper.selectByUsername(username)==null){
userMapper.add(user);
sqlSession.close();
cleanRemember(req,resp,user);
return user;
}
sqlSession.close();
return null;
}
}
那么登录的servlet的逻辑则也对应稍加调整
package com.web;
import com.pojo.User;
import com.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
UserService userService=new UserService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user=userService.login(req,resp);
resp.setContentType("text/html;charset=utf-8");
if(user==null){
req.setAttribute("msg","用户名或密码错误");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
else{
resp.sendRedirect(req.getContextPath()+"/ServletQueryAll");
}
}
}
那么注册的servlet则可以更加简化了
package com.web;
import com.pojo.User;
import com.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {
UserService userService=new UserService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User newUser=userService.register(req,resp);
if(newUser!=null){
req.setAttribute("register_msg","注册成功,请登录");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
if(newUser==null){
req.setAttribute("register_error","用户名已存在");
req.getRequestDispatcher("/register.jsp").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
注册页面register.jsp同样也需要能响应注册失败的信息,所以register.jsp则修改如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎注册</title>
<link href="css/register.css" rel="stylesheet">
<style>
.msg{
color:red;
}
</style>
</head>
<body>
<div class="form-div">
<div class="reg-content">
<h1>欢迎注册</h1>
<span>已有帐号?</span> <a href="login.jsp">登录</a>
</div>
<form id="reg-form" action="${pageContext.request.contextPath}/registerServlet" method="post">
<table>
<tr>
<td>用户名</td>
<td class="inputs">
<input name="username" type="text" id="username">
<br>
<span id="username_err" class="err_msg">${register_error}</span>
</td>
</tr>
<tr>
<td>密码</td>
<td class="inputs">
<input name="password" type="password" id="password">
<br>
<span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
</td>
</tr>
</table>
<div class="buttons">
<input value="注 册" type="submit" id="reg_btn">
</div>
<br class="clear">
</form>
</div>
</body>
</html>
登录的jsp页面login.jsp同样需要响应从注册成功转发过来的注册成功消息,以及登录页面也是需要处理cookie不能存储中文的情况,所以需要对中文的url编码后cookie的反解,当然也有一种就是直接存储json对象或许更好,这里暂不纠结了,所以login.jsp修改如:
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.net.URLDecoder" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<%
String decodeUserName="";
for(Cookie cookieItem:request.getCookies()){
String cookieValue=cookieItem.getValue();
String cookieName=cookieItem.getName();
if(cookieName.equals("username")){
decodeUserName= URLDecoder.decode(cookieValue);
}
}
%>
<head>
<meta charset="UTF-8">
<title>login</title>
<link href="css/login.css" rel="stylesheet">
<style>
.msg{
color:red;
}
</style>
</head>
<body>
<div id="loginDiv">
<form action="${pageContext.request.contextPath}/loginServlet" id="form">
<h1 id="loginMsg">LOGIN IN</h1>
<div class="msg">${msg}</div>
<div class="msg">${register_msg}</div>
<p>Username:<input id="username" name="username" type="text" value="${decodeUserName}"></p>
<p>Password:<input id="password" name="password" type="password" value="${cookie.password.value}"></p>
<p>remember:<input type="checkbox" name="remember" value="1" <c:if test="${cookie.remember.value == 1}"> checked </c:if> /></p>
<div id="subDiv">
<input type="submit" class="button" value="login up">
<input type="reset" class="button" value="reset">
<a href="register.jsp">没有账号?点击注册</a>
</div>
</form>
</div>
</body>
</html>
但对于注册所用的userMapper接口中的add方法,则这里不用传统的insert了,因为这里我的偏好做法是能获取到增长id,所以这里则修改如:
package com.mapper;
import com.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
User select(@Param("username") String username, @Param("password") String password);
@Select("select * from tb_user where username=#{username}")
User selectByUsername(String username);
void add(User user);
}
那么同样的userMapper的配置文件中要声明增长id回调赋值及回调赋值于pojo的属性名
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.UserMapper">
<select id="select" resultType="User">
select * from tb_user where username=#{username} and password=#{password};
</select>
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into tb_user(`username`,`password`) value(#{username},#{password})
</insert>
</mapper>
useGeneratedKeys开启了回调赋值,keyProperty决定了回调赋值于pojo的属性名。
则add方法接收的user对象,在add处理完成后该user对象的id值就会被赋值为自增id的值。
登录成功后进入品牌列表,品牌列表顶部需要显示当前登录用户名,所以brand.jsp也修改后如:
<%--
Created by IntelliJ IDEA.
User: 1
Date: 2024/12/2
Time: 15:15
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>欢迎你,${pageContext.request.getSession().getAttribute("user").username}</p>
<a href="addBrand.jsp">添加品牌</a>
<table border="1" cellspacing="0" width="800">
<tr>
<th>序号</th>
<th>索引</th>
<th>ID</th>
<th>品牌名称</th>
<th>企业名称</th>
<th>排序</th>
<th>品牌介绍</th>
<th>状态</th>
<th>操作</th>
</tr>
<c:forEach items="${brands}" var="brand" varStatus="status">
<tr>
<th>${status.count}</th>
<th>${status.index}</th>
<th>${brand.id}</th>
<th>${brand.brandName}</th>
<th>${brand.companyName}</th>
<th>${brand.ordered}</th>
<th>${brand.description}</th>
<th>
<c:if test="${brand.status == 1}">
启用
</c:if>
<c:if test="${brand.status == 0}">
禁用
</c:if>
</th>
<th>
<a href="/threeTierArchitectureModule/BrandUpdateById?id=${brand.id}">修改</a>
</th>
</tr>
</c:forEach>
</table>
</body>
</html>
关键字词:自增id
相关文章
-
无相关信息