1.R-封装结果类
@Data
public class R<T> {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据-->T 泛型类型,表示任意类型
private Map map = new HashMap(); //动态数据
//静态方法可以直接通过类名.方法名来调用。
public static <T> R<T> success(T object) {
R<T> r = new R<T>();
r.data = object;
r.code = 1;
return r;
}
public static <T> R<T> error(String msg) {
R r = new R();
r.msg = msg;
r.code = 0;
return r;
}
public R<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
@Data:
@Data
注解是Lombok库中的一个注解,它提供了一些方便的方法来自动生成Java类的一些常用方法,如toString()
、equals()
、hashCode()
、getter
和setter
等。使用@Data
注解可以简化Java类的编写,减少重复代码。
R<T>:
泛型类,表示该类可以是任意类型;用于封装返回结果。其中T表示任意类型。可以是String,Integer等。
static <T>:
在Java中,static <T>
表示一个泛型静态方法。其中,static
关键字表示该方法属于类而不是实例,可以直接通过类名调用而不需要创建类的实例。<T>
表示这是一个泛型方法,可以接收任意类型的参数。
2.EmployController-处理员工登录请求
@Slf4j //表示使用SLF4J日志框架进行日志记录
@RestController //表示这是一个RESTful风格的控制器,用于处理HTTP请求并返回JSON格式的数据。
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
/**
* 登录功能
* @param request HttpServletRequest 对象专门用于封装 HTTP 请求消息
* @param employee 前端页面返回给我们的是json数据,@RequestBody的作用其实是将json格式的数据转为java对象
* @param
* @return
*/
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee) {
// 1.将页面提交的密码password进行md5加密处理, 得到加密后的字符串
//获取页面提交的password;
String password = employee.getPassword();
//将密码加密
password = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));
// 2.根据页面提交的用户名username查询数据库中员工数据信息
//获取页面提交的用户名
String username = employee.getUsername();
//根据此用户名来在数据库中是否有此用户
//LambdaQueryWrapper:Mybatis-plus 条件构造器
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
//Employee::getUsername->相当于创建一个Employee对象,并调用此对象的getUsername()方法
//eq()->此方法相当于赋值,把employee.getUsername()赋值给前者
queryWrapper.eq(Employee::getUsername, employee.getUsername());
//通过用户名查询
Employee emp = employeeService.getOne(queryWrapper);
// 3.如果没有查询到, 则返回登录失败结果
if (emp == null) {
return R.error("登录失败");
}
// 4.密码比对,如果不一致, 则返回登录失败结果
//判断两个字符串的值是否相等,使用equals
//不能使用==,这是在比较两个字符串的索引值是否相同
if (!emp.getPassword().equals(password)) {
return R.error("登录失败");
}
// 5. 查看员工状态,如果为已禁用状态,则返回员工已禁用结果
if (emp.getStatus() == 0) {
return R.error("该用户已被禁用");
}
// 6.登录成功,将员工id存入Session, 并返回登录成功结果
//采用键值对存储
request.getSession().setAttribute("employee", emp.getId());
return R.success(emp);
}
}
@Slf4j:
表示使用SLF4J日志框架进行日志记录。
@RestController
表示这是一个RESTful风格的控制器,用于处理HTTP请求并返回JSON格式的数据。
RestController是一个由@Controller和@ResponseBody两个注解组合而成的特殊注解。@Controller用于标识一个类为控制器,而@ResponseBody则负责将方法返回的对象转换为JSON、XML等格式并直接写入到HTTP响应体中。也就是说,使用@RestController标记的类表示这是一个RESTful风格的控制器,它可以处理HTTP请求并返回对应格式的响应。
RESTful风格控制器
RESTful风格的控制器是一种设计模式,它遵循了REST(Representational State Transfer)架构风格的主要原则。这种风格并非标准,只是提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。在Spring MVC框架中,一个RESTful风格的控制器通常负责处理用户的请求并返回相应的数据。
具体来说,一个RESTful风格的控制器通常包含一个或多个方法,每个方法负责处理一种特定的用户请求。这些方法通过接口定义或注解定义来实现。例如,在一个处理员工登录的控制器中,可能会有一个处理GET请求的方法用于显示登录页面,以及一个处理POST请求的方法用于处理用户提交的登录表单。
此外,RESTful风格强调使用HTTP动词来表示对资源的操作(如GET、POST、PUT、PATCH、DELETE等),并通过URI(Uniform Resource Identifier)表示资源的唯一标识符。例如,在上面提到的员工登录控制器中,可能会有一个URL为"/employee/login"的方法用于处理用户提交的登录请求。
@RequestMapping("/employee")
表示该控制器处理以"/employee"为前缀的URL请求
@RequestMapping
是Spring MVC框架中的一个注解,用于映射HTTP请求到特定的处理方法。它通常与@Controller
注解一起使用,以便将请求映射到控制器类的方法。
@Autowired
使用了@Autowired
注解来自动注入一个名为employeeService
的服务对象。这个服务对象负责处理与员工相关的业务逻辑。
@Autowired
是Spring框架中的一个注解,用于自动装配bean。它可以将一个bean注入到另一个bean中,或者将一个bean注入到一个字段、构造函数或setter方法中。使用@Autowired
注解可以简化依赖注入的过程,提高代码的可读性和可维护性。
@PostMapping("/login")
@PostMapping("/login")
是Spring框架中的一个注解,用于处理HTTP POST请求。它通常与@Controller
注解一起使用,以便将请求映射到特定的处理方法。在这个例子中,/login
路径将被映射到名为login
的方法上。
HttpServletRequest
HttpServletRequest是Java Servlet API中的一个接口,用于表示客户端发送给服务器的HTTP请求。它包含了请求的各种信息,如请求方法、请求URI、请求头、请求参数等。在Java Web开发中,我们可以通过HttpServletRequest对象来获取这些信息,以便对请求进行处理和响应。
ServletRequest与HttpServletRequest的区别
ServletRequest和HttpServletRequest都是Java Servlet API中的接口,它们有一些区别。ServletRequest是Servlet规范定义的通用请求接口,定义了所有Servlet请求对象必须遵循的通用行为和功能。而HttpServletRequest则是ServletRequest的子接口,它继承了ServletRequest并添加了一些特定于HTTP协议的方法,如getHeader()、getMethod()等。总的来说,ServletRequest是一种更广义的请求接口,而HttpServletRequest是针对HTTP协议的专用接口。
@RequestBody
@RequestBody是Spring框架中的一个注解,用于将请求体中的数据绑定到方法参数上。它通常与@RestController或@Controller一起使用,以便将客户端发送的JSON、XML或其他格式的数据解析为Java对象,并将其作为方法参数传递。这样,我们可以在控制器方法中直接处理这些数据,而无需手动解析请求体。
密码加密
password = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));
这段代码是使用Apache Commons Codec库中的DigestUtils类对密码进行MD5加密。首先,它将密码转换为UTF-8编码的字节数组,然后使用md5DigestAsHex方法将字节数组转换为16进制字符串表示的MD5哈希值。最后,将加密后的密码赋值给变量password。
LambdaQueryWrapper
LambdaQueryWrapper:Mybatis-plus 条件构造器,用于构建复杂的查询条件。它提供了链式调用的方式,可以方便地组合多个查询条件。
条件查询
//获取页面提交的用户名
String username = employee.getUsername();
//根据此用户名来在数据库中是否有此用户
//LambdaQueryWrapper:Mybatis-plus 条件构造器
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
//Employee::getUsername->相当于创建一个Employee对象,并调用此对象的getUsername()方法
//eq()->此方法相当于赋值,把employee.getUsername()赋值给前者
queryWrapper.eq(Employee::getUsername, employee.getUsername());
//通过用户名查询
Employee emp = employeeService.getOne(queryWrapper);
首先创建一个条件构造器,
Employee::getUsername->相当于创建一个Employee对象,并调用此对象的getUsername()方法
LambdaQueryWrapper的eq方法用于添加一个等于查询条件,表示查询Employee实体类中的username字段等于传入的employee对象的username属性。因此,使用get方法来获取employee对象的username属性值,而不是set方法来设置该属性值。字段等于值
getOne()
getOne()是Mybatis-Plus中的一个通用查询方法,用于根据指定的查询条件查询一条记录。它接收一个QueryWrapper对象作为参数,返回一个实体类对象。
equals()
//判断两个字符串的值是否相等,使用equals //不能使用==,这是在比较两个字符串的索引值是否相同
员工id存入session
request.getSession().setAttribute("employee", emp.getId());
将员工id存入Session
这段代码是Java Web开发中的一部分,用于将一个名为"employee"的属性值设置为emp对象的id。
具体来说,request.getSession()
获取当前请求的会话对象,然后使用 setAttribute()
方法将 "employee" 属性的值设置为 emp 对象的 id。这样,在后续的请求处理过程中,可以通过 request.getSession().getAttribute("employee")
来获取该属性的值。
EmployeeController-员工退出
@PostMapping("/logout")
public R<String> logout(HttpServletRequest request) {
//清理Session中保存的当前登录员工的id
request.getSession().removeAttribute("employee");
return R.success("退出成功");
}