前言:上一篇文章是我对这个作业系统的一点点理解,然后这篇文章后将会开启我对整个简易系统的回顾,一点点剖析我当时对12306的拙见。
一、登录的实现
首先我搭建了一下登录的入口页面,我把所有要用到的HTML文件都放在了src/main/resources/templates这个路径下,然后这个登录页面我首先建立了一下命名为Login.html,页面的代码如下:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/check_login" method="post">
<p>用户名:<input type="text" maxlength="9" th:name="username"></p>
<p>密码:<input type="password" maxlength="16" th:name="password"></p>
<p>
<input type="submit" value="登录">
<a href="/register">注册</a>
</p>
</form>
</body>
</html>
这里我就搭建了一个十分简易的页面,主要是对CSS掌握不行,然后也是为了后续利于搭建一个好看的平台,可以随时改变(一点拙见)。然后我就在Controller层开始写控制层的代码了,首先需要明确Web应用的工作流程:客户端(浏览器)发送一个请求(Request)->服务器(Spring Boot)接收请求 -> 控制器(Controller)处理请求 -> 控制器返回一个视图名称(View Name) -> 视图解析器(View Resolver)根据视图名称找到对应的模板文件(HTML) -> 服务器将渲染后的 HTML 页面作为响应(Response)发送回浏览器 -> 浏览器展示页面。如此,我先将login页面先返回出来,代码如下:
@RequestMapping("/login")
public String login() {
log.info("登录");
return "login";
}
这里可以看见我记录一条日志信息,我这里就学习了一下黑马程序员的课程,调用了SLF4J这个库,而实际的日志实现则由 Logback 或 Log4j2 等库来完成,因为Spring Boot 默认集成了 SLF4J 和 Logback(这块是我听课学到的一部分)。
然后可以启动一下看看效果,在浏览器输入localhost:8081(因为我当时修改了端口号,我是边写12306边参考了其他的项目,双开了一下)这样登录页面就可以显示出来了。

因为跳转到注册界面我也是利用的视图映射,然后我又写了一个返回注册界面(register.html)的视图映射代码,代码如下:
@RequestMapping("/register")
public String register() {
log.info("注册");
return "register";
}
这样注册界面也就可以跳转回去了,展示如下:

这里可以看见我有一个”已有账号,去登录“的一个跳转链接,我这里附上一下注册页面的代码:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/check_register" method="post">
<p>用户名<input type="text" name="username" placeholder="请输入用户名"></p>
<p>密码<input type="password" name="password" placeholder="请输入密码"></p>
<p>邮箱<input type="email" name="email" placeholder="请输入邮箱"></p>
<p>手机号<input type="text" name="telephone" placeholder="请输入手机号"></p>
<input type="submit" value="注册">
<a href="/login">已有账号,去登录</a>
</form>
</body>
</html>
这里可以看见我的跳转参数设置的还是/login,所以还是利用的login登录界面的试图返回方法,所以代码是一致的。
接下来我就开始写相关的登录注册的逻辑了。
首先由刚才的登录页面的代码可以知道,我将登录提交的表单提交到了/check_login这个URL地址,然后我在控制层去接收了一下提交的username和password,这里我用的是HttpServletRequest这个接口里面的方法,前面的点击提交表单后,一个HTTP请求发送了出来,然后这个request对象就封装了这个请求的所有信息包括:请求的URL,请求的方法,请求头,请求的参数和请求体的数,所以我就用了getParameter这个方法去获取到了username和password这两个数据。
String username = request.getParameter("username");
String password = request.getParameter("password");
然后我就调用了service层的方法,并且将返回的结果设置成User对象
User user = authService.login(username, password);
这时候我发现一个问题,就是我登录进去是需要进行分页查询的,所以我要将分页查询的两个参数传进去,一个是qry_current_page,一个是qry_page_size,所以我这里将这两个参数设置在前端页面,通过表单一同提交,设置的参数如下:
<input type="hidden" th:name="qry_current_page" th:value="1">
<input type="hidden" th:name="qry_page_size" th:value="5"/>
这里是通过两个隐藏的输入框一同提交出去,那这里也就需要从控制层去接收这两个数据,那么我就又写了两个getParameter接收,不过由于前端传输过来的数据是String类型,到数据库进行操作的时候是“limit ? ,?”这个形式,所以我将接收到的参数做了一个类型转换,如下:
int qry_current_page = Integer.parseInt(request.getParameter("qry_current_page"));
int qry_page_size = Integer.parseInt(request.getParameter("qry_page_size"));
然后我就去写service层的代码,首先controller层我明确了返回类型是一个对象,所以service层的函数返回值也需要是个对象,然后通过调用mapper层去和数据库操作,去查找是否存在这个user对象,如果用户为空,那么就返回一个null值就行了,反之返回user对象,如下:
public User login(String username, String password) {
log.info("用户名:{},密码:{}", username,password);
User user = authMapper.login(username,password);
if (user == null){
return null;
}
return user;
}
然后就可以去书写mapper层的代码逻辑了,这里主要是去查找数据库是否存在user这个对象,然后返回给service层,如下:
@Select("select * from user where username=#{username} and password=#{password}")
User login(String username, String password);
最后返回到controller层的对象我也做了一个空值判断,如果不是空对象,那么就说明存在该用户,然后我就返回到车票查询的页面(success.html),同时,我还需要将分页的参数也一同传到该页面,这时候我就使用了RedirectAttributes这个接口的方法,将从前端获取到的两个数据传到车票查询页面,然后Spring MVC 会检查 redirectAttributes 中通过 addAttribute() 添加的属性,并将它们拼接到 URL 中,最后重定向到success.html即可,反之将重新登录(这里其实可以添加很多的异常处理,当时没来得及去实现,后续我会重新写这个项目然后去实现)总体的check_login方法的代码如下:
@RequestMapping("/check_login")
public String login(HttpServletRequest request,RedirectAttributes redirectAttributes) {
String username = request.getParameter("username");
String password = request.getParameter("password");
int qry_current_page = Integer.parseInt(request.getParameter("qry_current_page"));
int qry_page_size = Integer.parseInt(request.getParameter("qry_page_size"));
log.info("当前页码:{},每页显示数量:{}", qry_current_page, qry_page_size);
log.info("用户名:{},密码:{}", username, password);
User user = authService.login(username, password);
if (user != null) {
redirectAttributes.addAttribute("qry_current_page",qry_current_page);
redirectAttributes.addAttribute("qry_page_size",qry_page_size);
return "redirect:/success";
} else {
return "login";
}
}
至此整个登录的功能实现了。
二、注册的实现
注册的代码其实同理于登录的代码,无非就是前端输入了用户名等一系列注册所需要的用户数据,然后通过控制层调用HttpServletRequest接口里面的方法,然后将数据获取出来,然后通过service层去完善具体的业务逻辑,然后通过mapper层与数据库交互操作,一步步返回。
注册页面的表单包含了用户名,密码,邮箱地址,手机号这几项,然后通过getParameter方法获取到,如下:
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
String telephone = request.getParameter("telephone");
然后调用service层的方法,这里我先附上service层的业务逻辑代码:
public int register(String username, String password, String email, String telephone) {
log.info("用户名:{},密码:{},邮箱:{},手机号:{}", username,password,email,telephone);
User user = authMapper.check_telephone_unique(username,telephone);
if (user == null){
authMapper.register(username,password,email,telephone);
log.info("注册成功");
return 1;
}
return -1;
}
可以看到我调用了两个mapper层的方法,首先我先检验用户名和手机号是否是唯一的(这里其实有很大的问题,因为一个新用户想注册的账号,用户名可以是重复的,但是手机号不能重复,这里我却将二者都进行了重复校验,后续还是需要修改的,再说一个当时我数据库当中很多值没设计好,甚至字段大部分都是char类型的,其实开发的过程中还是很烦的)。这里附上mapper层的代码:
@Insert("insert into user(username,password,email,telephone) values(#{username},#{password},#{email},#{telephone})")
void register(String username, String password, String email, String telephone);
@Select("SELECT * from user where telephone = #{telephone} and username = #{username}")
User check_telephone_unique(String username ,String telephone);
检验结束后,如果数据库没有查找到重复的用户,那么就可以注册,返回数值为1,反之为-1,所以controller层代码我设置了一个int类型的flag,如果flag==1,那么就显示注册成功,反之失败。至此附上controller层的代码:
@RequestMapping("/check_register")
public String register(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
String telephone = request.getParameter("telephone");
log.info("用户名:{},密码:{},邮箱:{},电话:{}", username, password, email, telephone);
int flag = authService.register(username, password, email, telephone);
if (flag == 1) {
return "/login";
}
return "/register";
}
至此,注册的功能实现了。
三、技术总结
1. HttpServletRequest
HttpServletRequest 是 Java Servlet API 中的一个核心接口,它封装了客户端(通常是浏览器)向服务器发送的 HTTP 请求的所有信息。在 Spring MVC 中,可以通过在控制器方法的参数中声明它来访问这些信息,作用域是当前请求,随当前请求结束而销毁。
2. RedirectAttributes
RedirectAttributes 是 Spring MVC 3.1 引入的一个特殊接口,它是 Model 的一个子接口,专门用于在重定向(Redirect)时传递数据,作用域是跨越重定向的两次请求,addAttribute的数据成为 URL 的一部分。
四、结语
这篇文章主要讲述了一个十分简单的登录注册功能,希望能帮助的是基础很差的同学们有一个样例,然后也希望各位大佬们指出一点我代码里面的问题,如何去书写正确的业务逻辑。
4万+






