public String index(HttpSession session,
Model model){
Object login = session.getAttribute(“login”);
if (login != null){
return “index”;
}else {
model.addAttribute(“msg”,“请重新登录”);
return “login”;
}
}
3、为了实现一个登录成功后,显示登录成功的用户名
定位到页面显示用户名信息的地方
thymeleaf的行内写法
取出登录成功用户的用户名即可实现此功能
(注意是.name不是通过get方法获取的)
[[${session.login.name}}]]
4.完成CRUD(Create、Read、Update、Delete)
编码思路
controller层接受用户的请求,将指令传递给业务模型Model(Service+Mapper)进行业务判断、数据库存取,最后根据业务逻辑选择不同的视图
dao层
-
定义操作数据库的service接口,通过service调用mapper完成数据库的增删改查
-
编写Mapper接口,定义操作数据库的方法
-
生成mapper映射文件编写sql语句
-
通过实现类来实现接口定义的功能
2.controller层
-
根据前端页面请求方式,定义对应的映射方法
-
进行简单的判断和跳转处理
查询数据库所有数据,所以返回的是一个User集合(将数据库条目封装成User对象)
4.1 service接口
package com.caq.boot.service;
import com.caq.boot.pojo.User;
import java.util.List;
public interface Crud {
//登录用户
User getAcc(String name, String age);
//查看所有用户
List listAllAcc();
//注册,新建用户
void insertAcc(String name, int age, String email);
//修改用户
void updateAcc(String name, int age, String email, int id);
//按照id查找用户
User selectById(int id);
//根据id删除用户
void deleteUserById(int id);
}
4.2 mapper接口
mapper接口和实体类User对象可通过mybatisX插件进行快速生成
package com.caq.boot.mapper;
import com.caq.boot.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
-
@author Jack
-
@description 针对表【user】的数据库操作Mapper
-
@createDate 2022-03-01 09:08:01
-
@Entity com.caq.boot.pojo.User
*/
@Mapper
public interface UserMapper {
List selectAll();
User selectByNameAndAge(String name,String age);
void insertUser(String name, int age, String email);
void updateUser(String name, int age, String email,int id);
User SelectById(int id);
void deleteUser(int id);
}
4.3 mapper.xml
<?xml version="1.0" encoding="UTF-8"?>update user
set name = #{name},
age = #{age},
email = #{email}
where id = #{id};
delete
from user
where id = #{id}
select *
from user
where name = #{name}
and age = #{age};
select *
from user;
select *
from user
where id = #{id};
INSERT INTO user (name, age, email)
VALUES (#{name}, #{age}, #{email});
4.4 service实现类
package com.caq.boot.service.Impl;
import com.caq.boot.mapper.UserMapper;
import com.caq.boot.pojo.User;
import com.caq.boot.service.Crud;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CrudImpl implements Crud {
@Autowired
UserMapper userMapper;
@Override
public User getAcc(String name, String age) {
return userMapper.selectByNameAndAge(name,age);
}
@Override
public void insertAcc(String name, int age, String email) {
userMapper.insertUser(name,age,email);
}
@Override
public void updateAcc(String name, int age, String email,int id) {
userMapper.updateUser(name, age, email, id);
}
@Override
public User selectById(int id) {
return userMapper.SelectById(id);
}
@Override
public void deleteUserById(int id) {
userMapper.deleteUser(id);
}
@Override
public List listAllAcc() {
return userMapper.selectAll();
}
}
4.5 LoginController
控制登录相关的请求
package com.caq.boot.controller;
import com.caq.boot.pojo.User;
import com.caq.boot.service.Impl.CrudImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@Autowired
CrudImpl crud;
//跳转到登录页
@GetMapping({“/”, “/login”})
public String login() {
return “login”;
}
//提交表单进行验证
@PostMapping(“/login”)
public String index(@RequestParam(“name”) String name,
@RequestParam(“age”) String age,
HttpSession session,
Model model) {
User acc = crud.getAcc(name,age);
if (acc != null){
session.setAttribute(“login”,acc);
return “redirect:/index”;
}else {
model.addAttribute(“msg”,“账号或密码错误”);
return “login”;
}
}
// 重定向后的判断
@GetMapping(“/index”)
public String index(HttpSession session,
Model model){
Object login = session.getAttribute(“login”);
if (login != null){
return “index”;
}else {
model.addAttribute(“msg”,“请重新登录”);
return “login”;
}
}
}
4.5 RegisterController
package com.caq.boot.controller;
import com.caq.boot.service.Impl.CrudImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpSession;
@Controller
public class RegisterController {
@Autowired
CrudImpl crud;
@GetMapping(“register.html”)
public String register(){
return “register”;
}
@PostMapping(“register”)
public String submit(@RequestParam(“name”) String name,
@RequestParam(“age”) int age,
@RequestParam(“email”) String email
){
crud.insertAcc(name,age,email);
return “redirect:/login.html”;
}
@GetMapping(“/login.html”)
public String login(){
return “login”;
}
}
4.6 tablesController
表格相关的控制
package com.caq.boot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class TableController {
@GetMapping(“/tables.html”)
public String tables(){
return “tables”;
}
}
4.7 Crud相关的控制
package com.caq.boot.controller;
import com.caq.boot.pojo.User;
import com.caq.boot.service.Impl.CrudImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpSession;
import java.util.List;
@Controller
public class CrudController {
@Autowired
CrudImpl crud;
@GetMapping(“tables”)
public String listAll(Model model,
HttpSession session) {
if (session.getAttribute(“login”) != null){
List users = crud.listAllAcc();
model.addAttribute(“listUsers”, users);
return “tables”;
}else {
model.addAttribute(“msg”,“请先登录”);
return “login”;
}
}
//新增用户点击的处理
@GetMapping(“insert_page”)
public String insert(){
return “insert_page”;
}
//新增用户后提交表单的处理
@PostMapping(“insert_page”)
public String insertAcc(@RequestParam(“name”) String name,
@RequestParam(“age”) int age,
@RequestParam(“email”) String email) {
crud.insertAcc(name, age, email);
return “redirect:/tables”;
}
//同上
@GetMapping(“update_page/{id}”)
public String update(@PathVariable(“id”) int id,
Model model){
User user = crud.selectById(id);
model.addAttribute(“user”,user);
return “update_page”;
}
@PostMapping(“update_page”)
public String update(@RequestParam(“name”) String name,
@RequestParam(“age”) int age,
@RequestParam(“email”) String email,
@RequestParam(“id”) int id
){
crud.updateAcc(name,age,email,id);
return “redirect:/tables”;
}
//删除用户的请求处理
@GetMapping(“delete/{id}”)
public String delete(@PathVariable(“id”)int id){
crud.deleteUserById(id);
return “redirect:/tables”;
}
}
4.8 前端页面的处理
前端框架
前端页面可以通过网上的UI模板套用
主要是关键的位置,会出现什么样的请求我们处理好这些请求即可
前端页面用到了很多Thymeleaf的知识,下面我会着重写这一块相关的
Layui - 经典开源模块化前端 UI 框架(官方文档镜像站) (layuiweb.com)
Examples · Bootstrap (getbootstrap.com)
能在这里拿很多你想要的样式,表单啊、按钮…等等
个性化提示
我们定位到登录页,可以在这里做一个错误提示
例如:如果没有登录就去访问类路径下的资源,那么提示一些警告。
我们在Welcome Back!下面新建一行,这一行来提示错误信息。通过在controller层的判断,如果没有登录就用Model忘请求域中存入错误信息Model.addAttribute(“msg”,密码或账户错误)
我们存取过后呢,在前端页面怎么显示?通过thymeleaf来获取即可
Welcome Back!
<input name=“name” type=“email” class=“form-control form-control-user”
id=“exampleInputEmail” aria-describedby=“emailHelp”
placeholder=“Enter Email Address…”>
<input name=“age” type=“password” class=“form-control form-control-user”
id=“exampleInputPassword” placeholder=“Password”>
Me
input标签的说明
input标签要注意加上name属性,不然提交的时候请求域中获取不到输入的值
概念
payload,翻译过来是有效载荷
payload 字面意思“有效载荷,有效负荷,有效载重”。
要解释什么是有效载重,用货运行业打个比方:
比如有一位客户需要支付一笔费用委托货车司机运送一车石油,石油本身的重量、车子的重量、司机的重量等等,这些都属于载重(load)。但是对于该客户来说,他关心的只有石油的重量,所以石油的重量是有效载重(payload,也就是付费的重量)。
所以抽象一下,payload 可以理解为一系列信息中最为关键的信息。
对于程序员来说就是在程序中 起关键作用的代码。
安全方面:
通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,
比如数据量的大小、校验位等,这样就相当于给已经分批的原始数据加一些外套,这些外套起标示作用,使得原始数据不易丢失,
一批数据加上“外套”就形成了传输通道的基本传输单元,叫做数据帧或数据包,而其中的原始数据就是payload
我来模拟一个登录请求,查看一下它提交的信息
表单提交的说明
表单提交是post请求
thymeleaf的循环
th:each 迭代
th:each="user:${listUsers}"
其中listUsers是一个数组,user是遍历的元素
通过这种方式就可以把数据库所有的数据展示到表格中了==(获取到对象后,通过对象的get方法获取对应的属性)==
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习
已经将知识体系整理好(源码,笔记,PPT,学习视频)
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
个数组,user是遍历的元素
通过这种方式就可以把数据库所有的数据展示到表格中了==(获取到对象后,通过对象的get方法获取对应的属性)==
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-Qfa05qxh-1711821942730)]
[外链图片转存中…(img-bL5FoUyJ-1711821942731)]
[外链图片转存中…(img-KjaAvAHK-1711821942731)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习
已经将知识体系整理好(源码,笔记,PPT,学习视频)
[外链图片转存中…(img-mqWXxZ9U-1711821942732)]
[外链图片转存中…(img-KE28EySn-1711821942732)]
[外链图片转存中…(img-F31qQOHI-1711821942733)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!