Blog
用Spring框架搭建简单的登录注册与查询模块后台的最基本流程(配合maven和oracle数据库)
首先:修改pom.xml文件:
主要是将数据库连接插件下载到本地仓库
pom.xml文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gem</groupId>
<artifactId>erp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>erp</name>
<description>erp</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>12.1.0.1-atlassian-hosted</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
第一步:
新建java类,该类对应数据库中所需的表。类中定义好自己需要的属性。下载lombok插件,该插件会自动生成对应属性的方法,操作的方法是如下:
/**
* 员工实体类
*/
//利用lombok工具自动生成构造,get/set,hashcode,equals,toString方法
@Data
@NoArgsConstructor
@AllArgsConstructor
//springdata JPA自动映射实体类和表的关系
@Entity
@Table(name = "ERP_EMP")
public class Employee {
//属性
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "emp_id")
@SequenceGenerator(name = "emp_id", sequenceName = "erp_emp_id", initialValue = 1, allocationSize = 1)
private Long id;
//员工表中的名字是非空唯一的
@Column(nullable = false, unique = true)
private String name;
@Column
@Enumerated(EnumType.ORDINAL)
private Gender gender;//枚举类型
@Column
@Temporal(TemporalType.DATE)
private Date startDate;//日期类型
@Column
private Double salary;
}
以上代码会在数据库中生成一个名为ERP_EMP的表,表中的项为类中的属性。
第二步:
创建连接数据库的DAO接口,通过继承Spring框架的JpaRepository类,接口的定义变得异常简单!例如:
import org.springframework.data.jpa.repository.JpaRepository;
/**
* 员工数据访问对象,定义了所有的员工增删改查方法
*/
public interface EmployeeDao extends JpaRepository<Employee, Long> {
}
这个接口的定义就十分简单了。而连接用户登录表的接口就需要定义自己需要的方法:
package com.example.demo.dao;
import com.example.demo.Entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
public interface UserDao extends JpaRepository<User, Long> {
//JPQL
@Query("from User where username=?1 and password=?2")
User login(String username, String password);
//检测用户名是否已经存在
@Query("from User where username=?1")
User check(String username);
}
第三步:
创建表查询控制类
在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。 1.
package com.example.demo.controller;
import com.example.demo.dao.EmployeeDao;
import com.example.demo.Entity.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/emp")
public class EmpController {
@Autowired
EmployeeDao employeeDao;
//分页查询数据
@RequestMapping("/list")
public String list(Model model) {
Page<Employee> page = employeeDao.findAll(PageRequest.of(0, 3));
//把分页整个数据对象存入模型数据范围
model.addAttribute("page",page);
return "list";
}
}
2.
package com.example.demo.controller;
import com.example.demo.dao.UserDao;
import com.example.demo.Entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
//控制器
@Controller
//用户模块窄化处理
@RequestMapping("/user")
public class UserController {
//依赖注入用户DAO
@Autowired
UserDao userDao;
//登录方法
@RequestMapping("/login")
public void login(String username, String password, HttpSession session, HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();
//登录的本质就是查询数据库中是否用户名和密码都匹配用户输入的账户
User user = userDao.login(username, password);
if (user == null) {
//登录失败
out.print(0);
} else {
//登录成功
//记录用户登录状态
session.setAttribute("user", user);
out.print(1);
}
}
//登出方法
@RequestMapping("/logout")
public String logout(HttpSession session) {
//删除session中记录的用户信息
session.invalidate();
//跳转登录页面
return "index";
}
//验证用户名
@RequestMapping("/check")
public void check(String username, HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();
User user = userDao.check(username);
if (user == null) {
//说明该用户名可以注册
out.print(1);
} else {
//说明该用户名已经被注册
out.print(0);
}
}
//注册功能
@RequestMapping("/register")
public String register(User user){
userDao.save(user);
//重定向
return "redirect:/";
}
}
第四步:
创建拦截器Interceptor:
package com.example.demo.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 用户登录验证拦截器
*/
public class MyAdminInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
Object obj = request.getSession().getAttribute("user");
if (obj == null) {
//说明没有登录
//1.提示
request.setAttribute("msg", "请先登录!");
//2.强制跳转
request.getRequestDispatcher("/").forward(request, response);
return false;
}
//放行
return true;
}
}
第五步:
创建springboot自定义类。我们需要根据需求自己配置拦截器。
package com.example.demo.Config;
import com.example.demo.interceptor.MyAdminInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//springboot配置类
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyAdminInterceptor())
//配置拦截路径
.addPathPatterns("/**")
//配置从拦截路径中去除的路径
.excludePathPatterns("/index.html", "/", "/user/*", "/asserts/**");
}
}
第六步:
最后,记得编辑application.yml文件:
server:
port: 8888
servlet:
context-path: /erp
spring:
datasource:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:XE
username: ***
password: ***
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
format_sql: true
show_sql: true
mvc:
favicon:
enabled: false