- 本片博文记录登陆注册功能的开发,内容包括
1)前端注册登陆页面的实现
2)后端注册登陆行为逻辑代码的实现
3)用户数据表的设计和实现
4)前后台之间数据的交互
一、实体类和配置类
- 先按照如下图,在项目目录里新建如下的 Package 目录:
1、实体类
- 在 domain 目录下新建三个实体类:Msg、User 和 UserInfo,这三个实体类的具体代码如下:
- Msg 类:
package com.pyc.springmvcstudent.domain;
public class Msg {
private String title;
private String content;
public Msg(String title,String content){
this.title=title;
this.content=content;
}
public void setContent(String content) {
this.content = content;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
}
- User 类
package com.pyc.springmvcstudent.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private long id;
private String studentID;
private String password;
public User(){
super();
}
public User(String studentID,String password){
this.studentID=studentID;
this.password=password;
}
public void setId(long id) {
this.id = id;
}
public long getId() {
return id;
}
public void setStudentID(String studentID) {
this.studentID = studentID;
}
public String getStudentID() {
return studentID;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
}
- 这个类由于使用了 @Entity 注解,因此相当于一个数据表,运行时,Hibernate 框架会根据该类的名称和属性,在数据库中新建对应的数据表。下面的 UserInfo 类也是如此。
- UserInfo 类
package com.pyc.springmvcstudent.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class UserInfo {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private long id;
private String stuID;
private String name;
private String profession;
private String stuClass;
private String broth;
private String tel;
private Boolean online;
public UserInfo(){
super();
}
public UserInfo(String stuID,String name,String profession,String stuClass,String broth, String tel){
this.stuID=stuID;
this.name=name;
this.profession=profession;
this.stuClass=stuClass;
this.broth=broth;
this.tel=tel;
this.online=false;
}
public void setId(long id) {
this.id = id;
}
public long getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setProfession(String profession) {
this.profession = profession;
}
public String getProfession() {
return profession;
}
public void setStuClass(String stuClass) {
this.stuClass = stuClass;
}
public String getStuClass() {
return stuClass;
}
public String getStuID() {
return stuID;
}
public Boolean getOnline() {
return online;
}
public String getBroth() {
return broth;
}
public String getTel() {
return tel;
}
public void setBroth(String broth) {
this.broth = broth;
}
public void setOnline(Boolean online) {
this.online = online;
}
public void setStuID(String stuID) {
this.stuID = stuID;
}
public void setTel(String tel) {
this.tel = tel;
}
}
- 这些实体类的setter 和 getter,不用自己一个一个的敲,可以用 IDEA 的智能补充生成。
2、面向对象数据接口
- 由于上一步新建了两个使用了 @Entity 注解的实体类,因此需要编写相应的 Repository 接口类,这两个接口类放在 Dao Package 目录下,分别取名为:UserRepository 和 UserInfoRepository。
- UserRepository 接口类的代码如下:
package com.pyc.springmvcstudent.dao;
import com.pyc.springmvcstudent.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User,Long> {
}
- 暂时先只继承 JpaRepository 类提供的查询方法,后面根据需要添加自定义查询方法。
- UserInfoRepository 接口类代码如下:
package com.pyc.springmvcstudent.dao;
import com.pyc.springmvcstudent.domain.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserInfoRepository extends JpaRepository<UserInfo, Long> {
}
3、WebMVCConfig
4、WebController
- 对于不需要传递数据的页面,可以在 WebMVCConfig 中配置,对于需要传递数据的就需要用到 Controller 了,因此这里新建一个 WebController 放在 controller,其代码如下:
package com.pyc.springmvcstudent.controller;
import com.pyc.springmvcstudent.dao.UserInfoRepository;
import com.pyc.springmvcstudent.dao.UserRepository;
import com.pyc.springmvcstudent.domain.Msg;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class WebController {
final UserRepository userRepository;
final UserInfoRepository userInfoRepository;
public WebController(UserRepository userRepository,UserInfoRepository userInfoRepository){
this.userInfoRepository=userInfoRepository;
this.userRepository=userRepository;
}
@RequestMapping("/toSign")
public String toSign(Model model){
Msg msg = new Msg("系统提示","请按照格式进行注册");
model.addAttribute("msg", msg);
return "page/Sign";
}
}
二、视图页面
- 这里需要编辑两个视图页面,即登陆页面和注册页面,这里将登陆页面设置为系统的index页。
- 页面不用原生的HTML,而是用 Thymeleaf 模板页面,UI 框架使用 Bootstrap3.
1、Index 页
2、注册页面
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css"
integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp"
crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"></script>
<title>用户注册</title>
</head>
<body>
<div class="container">
<div class="row">
<br>
<br>
<br>
<div class="col-md-8">
<div class="panel panel-primary">
<div class="panel-heading">
<h2 class="panel-title">
提示信息:
</h2>
</div>
<div class="panel-body" th:if="${ not #lists.isEmpty(msg)}">
<div class="panel-info">
<h4 th:text="${msg.getTitle()}"></h4><h5 th:text="${msg.getContent()}"></h5>
</div>
</div>
</div>
</div>
<div class="col-md-8">
<form class="form-horizontal" style="width: 500px">
<div class="form-group">
<label for="stuID" class="col-sm-2 control-label">StudentID:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="stuID" name="stuID" placeholder="StudentID">
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">Password:</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="password" name="password" placeholder="password">
</div>
</div>
<div class="form-group">
<label for="stuName" class="col-sm-2 control-label">Name:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="stuName" name="stuName" placeholder="Student Name">
</div>
</div>
<div class="form-group">
<label for="profession" class="col-sm-2 control-label">Profession</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="profession" name="profession" placeholder="Profession">
</div>
</div>
<div class="form-group">
<label for="stuClass" class="col-sm-2 control-label">Class:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="stuClass" name="stuClass" placeholder="class">
</div>
</div>
<div class="form-group">
<label for="broth" class="col-sm-2 control-label">Broth:</label>
<div class="col-sm-10">
<input type="date" class="form-control" id="broth" name="broth" placeholder="1999-01-01">
</div>
</div>
<div class="form-group">
<label for="tel" class="col-sm-2 control-label">Tel:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="tel" name="tel" placeholder="Tel">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">Sign</button>
    
<button type="button" class="btn btn-default" onclick="window.location.href='/index'">Login</button>
</div>
</div>
</form>
</div>
</div>
</div>
</body>
3、测试页面显示是否正常
- 这一步进行页面显示测试,运行项目访问 http://localhost:8080/index 会显示如下页面:
- 我这里浏览器开启了黑色模式,所以页面底色是黑色,在非黑色模式下页面底色是白色。
- 点击注册按钮,正常情况下应该跳转到如下页面: