利用SpringBoot实现RestFul风格的增删改查操作

会遇到的问题:1、在提交delete请求时,可能会报405错误,解决办法在配置文件中加入在配置文件中加入spring.mvc.hiddenmethod.filter.enabled=true启用隐藏方法过滤器

       2、可能会遇到Error creating bean with name ‘requestMappingHandlerMapping‘ defined in class path resource ,解决办法:自己检查controller的请求头是不是有重复的

说明:这个小项目没有使用数据库,利用map容器模拟了几条数据。我是在b站上学习了尚硅谷的SpringBoot教程。

开搞~!!!

我的环境(idea 2019.3.3、maven3.6)

准备工作:

一、准备好静态页面(bootstrap中文网很多)

二、创建一个SpringBoot工程,加入Web、Thymeleaf依赖。

三、引入静态资源,页面放在templates文件夹下,*.js、*.css和图片放在static文件夹下

四、修改页面,因为使用了Thymeleaf模板引擎,为了保证正常使用时有提示,在页面html标签中加入

xmlns:th="http://www.thymeleaf.org"

  修改静态资源的超链接格式举例:

<link th:href="@{/asserts/css/bootstrap.min.css}"  rel="stylesheet">

  根据自己下载的页面选择是否抽取公共页面,thymeleaf抽取页面的三种格式

th:insert:将公共片段整个插入到声明引入的元素中,带div标签

th:replace:将声明引入的元素替换为公共片段,不带div标签

th:include:将被引入的片段的内容包含进这个标签中,带div标签但是不带公共片段的标签头,也就是直接将内容放进一个div中

<footer th:fragment="copy">
&copy; 2011 The Good Thymes Virtual Grocery
</footer>

引入方式
<div th:insert="footer :: copy"></div>
<div th:replace="footer :: copy"></div>
<div th:include="footer :: copy"></div>

效果
<div>
    <footer>
    &copy; 2011 The Good Thymes Virtual Grocery
    </footer>
</div>

<footer>
&copy; 2011 The Good Thymes Virtual Grocery
</footer>

<div>
&copy; 2011 The Good Thymes Virtual Grocery
</div>

五、准备实体类、持久层接口(本项目业务简单,暂时不加业务层)

Employee实体类(构造器、gette/setter方法省略)

   private Integer id;
    private String lastName;

    private String email;
    //1 男, 0 女
    private Integer gender;
    private Department department;
    private Date birth;

Department实体类

    private Integer id;
    private String departmentName;

EmployeeDao接口

@Repository
public class EmployeeDao {

    private static Map<Integer, Employee> employees = null;

    @Autowired
    private DepartmentDao departmentDao;

    static{
        employees = new HashMap<Integer, Employee>();

        employees.put(1001, new Employee(1001, "E-AA", "[email protected]", 1, new Department(101, "D-AA")));
        employees.put(1002, new Employee(1002, "E-BB", "[email protected]", 1, new Department(102, "D-BB")));
        employees.put(1003, new Employee(1003, "E-CC", "[email protected]", 0, new Department(103, "D-CC")));
        employees.put(1004, new Employee(1004, "E-DD", "[email protected]", 0, new Department(104, "D-DD")));
        employees.put(1005, new Employee(1005, "E-EE", "[email protected]", 1, new Department(105, "D-EE")));
    }

    private static Integer initId = 1006;

    public void save(Employee employee){
        if(employee.getId() == null){
            employee.setId(initId++);
        }

        employee.setDepartment(departmentDao.getDepartment(employee.getDepartment().getId()));
        employees.put(employee.getId(), employee);
    }

    public Collection<Employee> getAll(){
        return employees.values();
    }

    public Employee get(Integer id){
        return employees.get(id);
    }

    public void delete(Integer id){
        employees.remove(id);
    }
}

DepartmentDao

@Repository
public class DepartmentDao {

    private static Map<Integer, Department> departments = null;

    static{
        departments = new HashMap<Integer, Department>();

        departments.put(101, new Department(101, "D-AA"));
        departments.put(102, new Department(102, "D-BB"));
        departments.put(103, new Department(103, "D-CC"));
        departments.put(104, new Department(104, "D-DD"));
        departments.put(105, new Department(105, "D-EE"));
    }

    public Collection<Department> getDepartments(){
        return departments.values();
    }

    public Department getDepartment(Integer id){
        return departments.get(id);
    }

}

准备工作差不多了,接下就是编写CRUD

一、

1、做一个用户名密码校验

@Controller
public class LoginController {
    @PostMapping("/user/login")
//    @RequestMapping(value = "/user/login",method = RequestMethod.POST)
    public String login(@RequestParam("username") String username,@RequestParam("password") String password,
                        Map<String,Object> map,HttpSession session ){
        if(!StringUtils.isEmpty(username)&&"123".equals(password)){
//            登陆成功,防止表单重复提交,可以重定向到主页
            session.setAttribute("loginUser",username);
            return "redirect:/main.html";
        }else{
            map.put("msg","用户名或密码错误");
            return "login";
        }

    }
}

2、做一个非法请求过滤

/**
 * 登录检查
 */
public class LoginHandlerInterceptor implements HandlerInterceptor {

    @Override
//   执行前
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object loginUser = request.getSession().getAttribute("loginUser");
        if (loginUser == null) {
//            未登录,返回登录页
            request.setAttribute("msg", "没有权限请先登录");
            request.getRequestDispatcher("/index.html").forward(request, response);
            return false;
        } else {
//            已登录,放行
            return true;
        }

    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

配置完记得在@Configuration标识的配置类中注册

CRUD代码比较简单,直接贴代码

@Controller
public class EmployeeController {
    @Autowired
    EmployeeDao employeeDao;
    @Autowired
    DepartmentDao departmentDao;

    //    查询所有员工返回列表页面
    @GetMapping("emps")
    public String list(Model model) {
        Collection<Employee> all = employeeDao.getAll();
//        放在请求域中
        model.addAttribute("emps", all);
        return "emp/list";
    }

    //    来到员工添加页面
    @GetMapping("/emp")
    public String toAddPage(Model model) {
//        去添加页面之前,先查出所有部门在页面显示
        Collection<Department> departments = departmentDao.getDepartments();
        model.addAttribute("depts", departments);
        return "emp/add";
    }

    //   员工添加
//    SpringMVC 自动将请求参数和入参对象的属性进行一一绑定:要求了请求参数的名字和JavaBean入参对象里面的属性名是一样的
    @PostMapping("/emp")
    public String AddEmp(Employee employee) {
//        添加完成后来到员工列表页面
        System.out.println("保存的员工信息"+employee);
        employeeDao.save(employee);
//        redirect: 表示重定向到一个地址  / 代表当前项目路径
//        forward:表示转发到一个地址
        return "redirect:/emps";
    }
//    去修改页面,查出信息并回显
    @GetMapping("/emp/{id}")
    public String toEditPaage(@PathVariable("id") Integer id ,Model model){
        Employee employee = employeeDao.get(id);
        model.addAttribute("emp",employee);
//        页面要显示所有的部门列表
        Collection<Department> departments = departmentDao.getDepartments();
        model.addAttribute("depts", departments);
//        回到修改页面(add是一个修改添加二合一的页面)
        return "emp/add";
    }
//    员工修改:需要提交员工id
    @PutMapping("/emp")
    public String updateEmployee(Employee employee){
        System.out.println("修改的数据"+employee);
        employeeDao.save(employee);
        return "redirect:/emps";
    }
//    员工删除
    @DeleteMapping("/emp/{id}")
    public String deleteEmployee(@PathVariable("id") Integer id){
        employeeDao.delete(id);
        return "redirect:/emps";
    }
}

原文地址:https://www.cnblogs.com/gxl0502/p/12576450.html

时间: 2024-10-16 06:03:12

利用SpringBoot实现RestFul风格的增删改查操作的相关文章

进入全屏 nodejs+express+mysql实现restful风格的增删改查示例

首先,放上项目github地址:https://github.com/codethereforam/express-mysql-demo 一.前言 之前学的java,一直用的ssm框架写后台.前段时间接触到node.js,于是花了两天时间学了一下node.js并写了一个CRUD简单示例.由于前几天一直学用github pages搭建博客,一直没时间写README,今天有空补了上来. 下面来内容自于项目的README. 二.项目介绍 基于node.js + express + mysql实现的re

利用SQLiteOpenHelper创建数据库,进行增删改查操作

Android中提供SQLiteOpenHelper类,在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象.继承和扩展SQLiteOpenHelper类主要做的工作就是重写以下两个方法.onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行. onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前

如何用Spring框架的&lt;form:form&gt;标签实现REST风格的增删改查操作

1.首先创建两个bean类,Employee(职工)和Department(部门),一个部门可以有多个职工 Employee类(属性:职工ID:id:姓名:lastName:邮箱:email:性别:gender:所属部门:department) 1 package com.bwlu.bean; 2 public class Employee { 3 private Integer id; 4 private String lastName; 5 private String email; 6 /

【框架】[Hibernate]利用Hibernate进行单表的增删改查-Web实例

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 前面两篇博客已经将Hibernate的基础知识讲解得差不多了,差不多到写实例的时候了. 本篇只用hibernate进行单表的增删改查. 应用Hibernate,对students表进行增删改查. service层和DAO层,我都是直接写实现类了(因为这里主要是演示一下Hibernate的使用),如果是开发项目,注意一定要写接口! 准备数据库: 首先准备一个students表: cr

django 利用ORM对单表进行增删改查

牛小妹上周末,一直在尝试如何把数据库的数据弄到界面上.毕竟是新手,搞不出来,文档也看不懂.不过没关系,才刚上大学.今晚我们就来解释下,要把数据搞到界面的第一步.先把数据放到库里,然后再把数据从库里拿出来. 以下内容,参考django官方文档 . 1.创建MODEL 这里和官方文档一致.直接拷出来,放到一个叫models的py文件里面.若是你的项目中没有,一定不要觉得无处写代码.你自己建一个即可 同步数据库: 执行以下命令.不懂的可以参考:django连接mysql python manage.p

SpringBoot快速上手——《二》:SpringBoot集成SSM,实现增删改查功能

SpringBoot集成SSM,实现增删改查功能 github源码:https://github.com/xivinChen/SpringBoot 一.先介绍创建模块的另一种方式 1.点击Maven -> 勾选Create from archetype -> 选择 maven-archetype-quickstart 有时会需要点击 自动导入 2.工程目录 可以看到,这样创建的模块是相对干净的,需要我们手动的编写程序启动入口类.需要配置时还得创建配置文件.下一步见证. 3.完善模块 添加依赖,

Mybatis实现单表增删改查操作

mybatis是对持久层进行了封装.mybatis文档地址:https://mybatis.org/mybatis-3/zh/index.html 下面实现单表的增删改查操作. 1.新建maven项目命名为mybatis.并在pom.xml中引入相关依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

(转)SQLite数据库增删改查操作

原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n).char(n).d

Scala对MongoDB的增删改查操作

=========================================== 原文链接: Scala对MongoDB的增删改查操作 转载请注明出处! =========================================== 依赖环境:jdk1.8.Scala 2.12.idea mongodb Driver:3.1.1.注意,mongo for scala的驱动涉及多个jar(如下图),依赖于mongo-java-driver.jar 这里使用的sbt管理依赖,直接在bu