JavaWeb+Vue分离项目实现增删改查

news2024/10/6 5:57:08

文章目录

  • 前言
  • 数据库
  • 后端代码
    • util 代码
    • listener 代码
    • filter 代码
    • po 代码
    • dao 层增删改查代码
    • service 层增删改查代码
    • controller 层增删改查代码
  • 前端代码
    • 查询操作
    • 删除功能
    • 增加功能
    • 修改方法
      • 路由传参修改
      • 会话存储修改


前言

提示:这里可以添加本文要记录的大概内容:

req(request):请求
resp(response) :响应

请求通常是指客户端发送给服务器的请求消息。该请求可以包含请求方法、URL、HTTP版本、请求头和请求体等信息。服务器端会接收到这个请求,进行处理后再返回相应的响应消息。

响应通常是指服务器返回给客户端的响应消息。该响应可以包含HTTP状态码、响应头和响应体等信息。客户端会接收到这个响应并进行处理,例如渲染网页、下载文件等。

在Java中,开发者可以使用一些框架或库来处理请求和响应,例如Servlet API或Spring MVC等。这些框架和库提供了丰富的API和工具来处理网络通信、请求路由、数据转换和异常处理等。


在这里插入图片描述

提示:以下是本篇文章正文内容,下面案例可供参考

前端向后端发请求,后端controller接到请求后request.getParameter()取出数据,数据多的话封装到 po中,封装完后 service 处理请求,处理过程中设计数据库调用 dao,dao处理完后有结果了,结果给 service ,再给 controller,controller 根据结果再生成响应给前端

数据库

数据库代码:

drop TABLE IF EXISTS food;
-- IF EXISTS 表名; 作用:如果表存在就删掉(这段代码怎么执行都不会报错)
CREATE TABLE food
(
	foodId int auto_increment PRIMARY KEY,
	foodName VARCHAR(20) NOT NULL,
	foodPrice DOUBLE(8,2) NOT NULL,
	details VARCHAR(255),  -- 菜品描述
	think VARCHAR(255)   -- 菜品评价
);

INSERT INTO food(foodName,foodPrice,details,think)
VALUES('年糕',30.00,'多吃一块,幸福满满','还行,好吃不贵');

后端代码

新建Javaweb动态项目

项目包目录:
在这里插入图片描述

util 代码

util :封装了JDBC代码的工具类

注意里面的数据库名和密码

package com.project.mvc.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class JdbcUtil {
	public static Connection createConnection() {
		
		Connection connection = null;
		try {
			connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/food?characterEncoding=utf8&serverTimezone=Asia/Shanghai", "root", "123456");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return connection;
	}
	
	//释放资源 封装到静态方法中 
	public static void close(Statement statement,Connection connection) {
		try {
			statement.close();
			connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void close(ResultSet resultSet,Statement statement,Connection connection) {
		try {
			resultSet.close();
			statement.close();
			connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	//String类型转换为java.sql.Date类型 封装到方法中
	public static java.sql.Date toSqlDate(String string){
		java.util.Date d1=null;
		java.sql.Date  d2=null;
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		try {
			d1 = sdf.parse(string);
			d2 = new java.sql.Date( d1.getTime() );
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return d2;	
	}
}

listener 代码

listener:放监听器

package com.project.mvc.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class WebServerListener implements ServletContextListener{
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	
	}
}

filter 代码

filter:放过滤器

package com.project.mvc.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter("/*")
public class CommonFilter implements Filter{
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		// 设置请求的编码方式            post方式请求需要
		req.setCharacterEncoding("utf8");
		// 设置响应内容类型及编码方式
		resp.setContentType("application/json;charset=utf8");
		// 设置响应头允许ajax跨域请求
		resp.setHeader("Access-Control-Allow-Origin", "*");
		// 放行 
		chain.doFilter(request, response);
	}
}

po 代码

po:放简单对象

public class Food {
	private Integer foodId;
	private String foodName;
	private double foodPrice;
	private String details;
	private String think;
	// Getter/Setter/to String/有参无参构造方法自动生成
}

dao 层增删改查代码

dao:数据访问 JDBC

增删改返回结果是整数

package com.project.mvc.dao;

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import com.project.mvc.po.Food; 
import com.project.mvc.util.JdbcUtil; 

public class FoodDao { 

    // 插入菜品信息         做封装
    public int insertFood(Food food) { 
    	// 定义返回值,默认值0
        int result = 0;
        // 只有插入需要结果集ResultSet
        Connection connection = null; 
        PreparedStatement statement = null;
        // 创建数据库连接
        connection = JdbcUtil.createConnection(); 
        try {
            // 创建预编译的 SQL 语句并设置参数,id在数据库中是自增这里不需要写
            statement = connection.prepareStatement("insert into food(foodName,foodPrice,details,think) values(?,?,?,?)"); 
            // 给? 赋值,用setXXX方法
            statement.setString(1, food.getFoodName()); 
            statement.setDouble(2, food.getFoodPrice()); 
            statement.setString(3, food.getDetails()); 
            statement.setString(4, food.getThink()); 

            // 执行 SQL语句,返回结果,增删改用executeUpdate()方法,都属于更新
            result = statement.executeUpdate(); 
        } catch (SQLException e) {
            // TODO try/catch 包围
            e.printStackTrace();
        } finally {
            // 关闭数据库连接和预编译的语句
            JdbcUtil.close(statement, connection); 
        }
        // 返回结果
        return result; 
    }

    // 删除指定菜品信息       按照主键删除
    public int deleteFoodId(int foodId) {
    	// 定义结果,默认值0
        int result = 0; 
        Connection connection = null; 
        PreparedStatement statement = null; 
        // 创建数据库连接
        connection = JdbcUtil.createConnection(); 
        try {
            // 创建预编译的 SQL 语句并设置参数
            statement = connection.prepareStatement("delete from food where foodId=?"); 
            // 这个方法里面没有封装数据
            statement.setInt(1, foodId); 
            // 执行 SQL语句,返回成功操作的结果,增删改都属于更新
            result = statement.executeUpdate(); 
        } catch (SQLException e) {
            // TODO try/catch 块
            e.printStackTrace();
        } finally {
            // 关闭数据库连接和预编译的语句
            JdbcUtil.close(statement, connection); 
        }
        // 返回结果
        return result; 
    }

    // 修改菜品信息
    public int UpdateFood(Food food) { 
    	// 定义返回值
        int result = 0; 
        Connection connection = null; 
        PreparedStatement statement = null; 
        // 创建数据库连接
        connection = JdbcUtil.createConnection(); 
        try {
            // 创建预编译的 SQL 语句(根据主键改其他列)并设置参数                                    
            statement = connection.prepareStatement("update food set foodName=?,foodPrice=?,details=?,think=? where foodId=?"); 
            // 给? 赋值,用setXXX方法
            statement.setString(1,food.getFoodName()); 
            statement.setDouble(2,food.getFoodPrice()); 
            statement.setString(3,food.getDetails()); 
            statement.setString(4,food.getThink()); 
            statement.setInt(5,food.getFoodId());
            // 执行 SQL语句,返回结果
            result = statement.executeUpdate(); 
        } catch (SQLException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } finally {
            // 关闭数据库连接和预编译的语句
            JdbcUtil.close(statement, connection); 
        }
        // 返回的结果
        return result; 
    }

    // 模糊查询菜品  返回一个集合
    public ArrayList<Food> query(String foodName){ 
    	// 定义返回值
        ArrayList<Food> list = new ArrayList<>(); 
        // 查询需要结果集
        Connection connection = null; 
        PreparedStatement statement = null; 
        ResultSet resultSet = null; 
        // 创建数据库连接
        connection = JdbcUtil.createConnection(); 
        try {
            // 创建预编译的 SQL 语句并设置参数
            statement = connection.prepareStatement("select foodId,foodName,foodPrice,details,think from food where foodName like ?"); 
            // 设置名字模糊查询      给?赋值
            statement.setString(1,"%"+foodName+"%"); 
            // 执行 SQL 语句,结果是个结果集resultSet
            resultSet = statement.executeQuery(); 
            // 带条件的while循环,有下一个取出来
            while (resultSet.next()) {
                // 创建出一个Food对象
                Food food = new Food(); 
                // 把结果集的数据取出来,进行Set
                food.setFoodId(resultSet.getInt("foodId")); 
                food.setFoodName(resultSet.getString("foodName")); 
                food.setFoodPrice(resultSet.getDouble("foodPrice")); 
                food.setDetails(resultSet.getString("details"));
                food.setThink(resultSet.getString("think")); 
                // 将 Food 对象添加至查询结果列表
                list.add(food); 
            }
        } catch (SQLException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } finally {
            // 关闭数据库连接、查询结果和预编译的语句
            JdbcUtil.close(resultSet, statement, connection); 
        }
        // 返回查询结果列表
        return list; 
    }
}

service 层增删改查代码

dao 的调用者是 service,service 被 controller调用

service:业务逻辑类代码

下面代码用了一个三元运算符,可以将它解释为如下代码:

if (dao.insertFood(food) > 0) {
    return "食品增加成功";
} else {
    return "食品增加失败";
}

三元运算符的格式为:条件表达式 ? 表达式 1 : 表达式 2
其中条件表达式的值为 true,则返回表达式 1 的值,否则返回表达式 2 的值。
因此当调用 insertFood 方法插入食品记录成功时,三元运算符的条件表达式值为 true,则返回 “食品增加成功”,否则返回 “食品增加失败”

package com.project.mvc.service; 

import java.util.ArrayList; 
import com.google.gson.Gson; 
import com.project.mvc.dao.FoodDao; 
import com.project.mvc.po.Food; 

// 业务类调用 dao 类方法
public class FoodService { 
	//	调用dao,提前创建dao对象
    private FoodDao dao = new FoodDao(); 

    // 定义 add 方法,返回字符串,参数是po类
    public String add(Food food) { 
    	// dao层返回值 是 整数 > 0 ?(是否)成功 : (否则)失败
        return dao.insertFood(food) > 0 ? "食品增加成功" : "食品增加失败";
    }

    // 定义 remove 方法,返回整数
    public String remove(int foodId) { 
        // 调用 FoodDao 类的 deleteFoodId 方法,并返回操作结果
        return dao.deleteFoodId(foodId) > 0 ? "食品删除成功" : "食品删除失败";
    }

    // 定义 update 方法,返回字符串,参数是po类
    public String update(Food food) { 
        // 调用 FoodDao 类的 UpdateFood 方法,并返回操作结果
        return dao.UpdateFood(food) > 0 ? "食品修改成功" : "食品修改失败";
    }

    // 定义 query 方法,返回 Gson格式字符串(按照名字模糊查询,传一个名字进来)
    public String query(String foodName) { 
        // 调用 FoodDao 类的 query 方法,拿到返回的集合
        ArrayList<Food> list = dao.query(foodName); 
        // 创建 Gson 对象
        Gson gson = new Gson(); 
        // 将查询结果转化为 JSON 格式并返回
        return gson.toJson(list); 
    }
}

controller 层增删改查代码

controller:放 servlet 代码,业务逻辑类

先测试后端

package com.project.mvc.controller;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 加WebServlet注解,设置servlet的访问路径
@WebServlet("/food")
// 继承HttpServlet
public class FoodController extends HttpServlet {

    // 重写servlet的  service方法
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        // 获取 请求 发来的数据
        String action = req.getParameter("action");
        
        // 获取 响应 
        PrintWriter writer = resp.getWriter();
        
        // 根据请求参数中的action值进行不同的处理
        if (action.equals("add")) { 
            // 生成响应  输出
            writer.print("添加请求处理完毕");
        } else if (action.equals("delete")) {
            // 生成响应  输出
            writer.print("删除请求处理完毕");
        } else if (action.equals("update")) {
            // 生成响应  输出
            writer.print("更新请求处理完毕");
        } else if (action.equals("query")) { 
            // 生成响应  输出
            writer.print("查找请求处理完毕");
        }
    }
}

postman测试:测试前运行 Tomcat 服务器
在这里插入图片描述
经过测试所有请求均处理完毕

在真实项目中,并不是直接生成响应,要在里面写各自真正处理的代码

在这里每写一个功能就测试一下

package com.project.mvc.controller;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.project.mvc.po.Food;
import com.project.mvc.service.FoodService;

@WebServlet("/food")
public class FoodController extends HttpServlet {
    
    // 创建一个FoodService的实例,用于调用其中的方法
    private FoodService service = new FoodService();
    
    // 重写HttpServlet中的service方法
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        
    	// 获取 前端请求 发来的数据
        String action = req.getParameter("action");
        // 获取 响应 
        PrintWriter writer = resp.getWriter();
        
        // 判断请求的类型添加
        if (action.equals("add")) {   
            // 获取请求参数,传过来的数据都是字符串
            String foodName = req.getParameter("foodName");
            String foodPrice = req.getParameter("foodPrice");
            String details = req.getParameter("details");
            String think = req.getParameter("think");
            
            // 创建一个Food对象,用 po对象封装
            Food food = new Food();
            // 调用setXXX方法封装
            food.setFoodName(foodName);
            // 取出来的数据是字符串,这里的数据是double,所以这里需要转型
            food.setFoodPrice(Double.parseDouble(foodPrice)); 
            food.setDetails(details);
            food.setThink(think);
            // 调用service处理,在上面创建,方面后面调用
            
            // 调用FoodService中的add()方法,将数据添加到数据库中
            String result = service.add(food);
            // 将结果输出到前端页面
            writer.print(result);
            
        // 删除数据
        } else if (action.equals("delete")) {  
            // 获取请求参数,类型是String
            String foodId = req.getParameter("foodId");
            // 调用FoodService中的remove()方法,将数据从数据库中删除
            String result = service.remove(Integer.parseInt(foodId));
            // 将结果输出到前端页面
            writer.print(result);
            
        // 更新数据    
        } else if (action.equals("update")) {  
            // 获取请求参数
            String foodId = req.getParameter("foodId");
            String foodName = req.getParameter("foodName");
            String foodPrice = req.getParameter("foodPrice");
            String details = req.getParameter("details");
            String think = req.getParameter("think");
            
            // 创建一个Food对象,用于存储数据(封装)
            Food food = new Food();
            
            // 将获取到的参数存储到Food对象中
            food.setFoodId(Integer.parseInt(foodId));
            food.setFoodName(foodName);
            food.setFoodPrice(Double.parseDouble(foodPrice));
            food.setDetails(details);
            food.setThink(think);
            
            // 调用FoodService中的update()方法,更新数据到数据库中
            String result = service.update(food);
            // 将结果输出到前端页面
            writer.print(result);
        
        // 是查询数据
        } else if (action.equals("query")) {   
            // 获取请求参数,查name数据即可
            String foodName = req.getParameter("foodName");
            // 返回值   调用FoodService中的query()方法,从数据库中查询数据
            String result = service.query(foodName);
            
            // 将结果输出到前端页面
            writer.print(result);
        }
    }
}

各个功能测试:

添加测试:
在这里插入图片描述

删除测试:
在这里插入图片描述

修改测试:
在这里插入图片描述

查询测试:
在这里插入图片描述

总结

前端通过视图发送来一些数据,controller负责接受请求,接到请求后取出请求发来的数据,数据多的话就把数据封装到po里;接下来调用业务类service,数据多的话把po传给service去用;service需要去调dao,数据多的话也传po

请求来了→controller→数据多的话就数据封装po→service→dao→service→controller→生成响应给前端
在这里插入图片描述

前端代码

新建一个前端项目,在创建时勾选上Router选项,因为有跳转
在这里插入图片描述

创建好项目后安装axiosqs框架
请添加图片描述
最后生成内容框、左侧框与上方框

<template>
  <div class="wrapper">
    <header class="header">外卖系统</header>
    <div class="main">
      <aside class="menu">
        <router-link to="/query">外卖管理</router-link>
      </aside>
      <section class="work">
        <router-view></router-view>
      </section>
    </div>
  </div>
</template>

然后随便生成点样式区分

然后生成三个视图FoodAddFoodQueryFoodUpdate

接下来在index.js文件中导入这三个路由并配置路由对象

import FoodAdd from '@/views/FoodAdd'
import FoodQuery from '@/views/FoodQuery'
import FoodUpdate from '@/views/FoodUpdate'
const routes = [
{
  path: '/query',
  name: 'query',
  component: FoodQuery
},
{
  path: '/add',
  name: 'add',
  component: FoodAdd
},
{
  path: '/update',
  name: 'update',
  component: FoodUpdate
}
]

查询操作

<template>
  <div>
    菜品名:<input type="text" v-model="foodName">
    <button @click="query">查询</button>
    <button @click="gotoAdd">新增</button>
    <table>
        <tr>
            <th>菜品编号</th>
            <th>菜品名</th>
            <th>菜品价格</th>
            <th>菜品描述</th>
            <th>菜品评价</th>
            <th>修改</th>
            <th>删除</th>
        </tr>
        <tr v-for="(food, index) in items" :key="index">
            <!-- 与po类中属性名一致 -->
            <th>{{ food.foodId }}</th>
            <th>{{ food.foodName }}</th>
            <th>{{ food.foodPrice }}</th>
            <th>{{ food.details }}</th>
            <th>{{ food.think }}</th>
            <th><button @click="gotoUpdate(index)">修改</button></th>
            <th><button @click="del(index)">删除</button></th>
        </tr>
    </table>
  </div>
</template>

<script>
import axios from 'axios'
import qs from 'qs'
export default {
  data () {
    return {
        
    }
  },
  methods: {
   
  },
  components: {},
  computed: {},
  watch: {},
  mounted () {}
}
</script>

<style scoped>
/* 加点样式 */
</style>

在这里插入图片描述
接下来在data中配置查询相关数据(双向绑定的数据:foodName,遍历的数据:items

  data () {
    return {
        foodName: '',
        items: []
    }
  },

接下来在methods发请求:

  methods: {
    query(){
    
    }
  }

然后需要引入的axios框架发请求给后端(在script标签下)

import axios from 'axios'

接下来就可以在query方法内对请求进行发送

    query(){
        axios.get(`http://localhost:8888/MVCProject/food?action=query&foodName=${this.foodName}`)
        .then((response)=>{
         // response:返回来的响应,也可以写成resp
            this.items = response.data
        })
    },

路径在postman内找:
其中菜品名字的值要变成动态的
在这里插入图片描述
点击查询后:
请添加图片描述

删除功能

删除是发送post请求,正常发送数据需要导入qs框架(在script标签下)

import qs from 'qs'

接下来要把菜品编号发给服务器

// i:下标
 del(i){
        alert(this.items[i].foodId)
 }      

这时候点击删除按钮会有对应的下边提示
在这里插入图片描述
删除要传两个参,第一个是地址,第二个是post发送的数据

    del(i){
        // alert(this.items[i].foodId)
        axios.post('http://localhost:8888/MVCProject/food',qs.stringify({
            action: 'delete',
            foodId: this.items[i].foodId
        })).then((response)=>{
            alert(response.data)
            // 查询删完后的结果
            this.query()
        })
    }

在这里插入图片描述

增加功能

方法名:gotoAdd

    gotoAdd(){
    	// 不需要传参,直接加地址
        this.$router.push('/add')
    }

接下来回到Add视图加一些输入框

这里的数据是跟controller类中的取数据的名字一致

v-model是绑定到一个对象里的几个属性

<template>
  <div>
    菜品名称:<input type="text" v-model="food.foodName"> <br>
    菜品价格:<input type="text" v-model="food.foodPrice"> <br>
    菜品描述:<input type="text" v-model="food.details"> <br>
    菜品评价:<input type="text" v-model="food.think"> <br>
    <button @click="addFood">新增</button>
  </div>
</template>

接下来写data

  data () {
    return {
    	// 对象用{}
        food: {
            foodName: '',
            foodPrice: '',
            details: '',
            think: '',
        }
    }
  },

接下来在methods内编写addFood方法

先导入ajax请求导入axios框架,因为要发数据,所以也导入qs框架

import axios from 'axios'
import qs from 'qs'

methods内:

  methods: {
    addFood(){
    							   		// v-model是绑定到food对象里的几个属性  简化
        axios.post('http://localhost:8888/MVCProject/food',qs.stringify(this.food))
	
    }
  },

但是现在还少个action,所以在food对象中加一个action数据

  data () {
    return {
        // 对象用{}
        food: {
            foodName: '',
            foodPrice: '',
            details: '',
            think: '',
            action: 'add'
        }
    }
  },

随后完善addFood方法

  methods: {
    addFood(){
                                        // v-model是绑定到food对象里的几个属性  简化
        axios.post('http://localhost:8888/MVCProject/food',qs.stringify(this.food))
        .then( (response)=>{
            // 增加弹窗
            alert(response.data)
        } )
    }
  },

请添加图片描述

修改方法

路由传参修改

在FoodQuery页面中已经定义过了gotoUpdate方法,所有在下面加上gotoUpdate方法

    gotoUpdate(i){
        this.$router.push({
            path: '/update',
            // query方式传参
            query: this.items[i]
        })
    }

在修改页面中先把template写完:

在修改页面中要有ID,但是只能看,不能改(只读):readonly

<template>
  <div>
    菜品编号:<input type="text" readonly v-model="food.foodId"> <br>
    菜品名称:<input type="text" v-model="food.foodName"> <br>
    菜品价格:<input type="text" v-model="food.foodPrice"> <br>
    菜品描述:<input type="text" v-model="food.details"> <br>
    菜品评价:<input type="text" v-model="food.think"> <br>
    <button @click="updateStudent">修改</button>
  </div>
</template>

接下来写脚本部分:
1、定义绑定的对象 food
2、完成updateFood方法的编写

  data () {
    return {
      food: {
        foodId: this.$route.query.foodId,
        foodName: this.$route.query.foodName,
        foodPrice: this.$route.query.foodPrice,
        details: this.$route.query.details,
        think: this.$route.query.think,
        action: 'update'
      }
    }
  },

点击修改按钮,看一下数据有没有传过来
在这里插入图片描述

接下来要做修改的提交
script标签下先导入

import axios from 'axios';
import qs from 'qs';

随后发请求,处理响应(.then

  methods: {
    updateFood(){
      axios.post('http://localhost:8888/MVCProject/food',qs.stringify(this.food))
      .then((response)=>{
        alert(response.data)
      })
    }
  },

在这里插入图片描述

会话存储修改

把FoodUpdate页面复制一份取名FoodUpdateSession加以区分
然后在index.js中导入路由并配置路由对象

import FoodUpdateSession from '@/views/FoodUpdateSession'
//...
{
  path: '/session',
  name: 'session',
  component: FoodUpdateSession
}

接下来在FoodQuery页面的修改按钮中再加一个修改按钮:

<th><button @click="gotoUpdate(index)">路由传参</button><button @click="gotoSession(index)">会话存储</button></th>

在下面加上gotoSession方法

    gotoSession(i){
        this.$router.push('/session')
    }

先看下能不能跳过去
在这里插入图片描述
现在还没有数据,接下来存数据

    gotoSession(i){
        sessionStorage.setItem('food',JSON.stringify(this.items[i]))
        this.$router.push('/session')
    }

随后再运行一遍,打开开发者工具查看应用→会话存储
在这里插入图片描述
接下来取出数据恢复对象形式
FoodUpdateSession视图下删除data中的数据,变成:

  data () {
    return {
      food: {

      }
    }
  },

属性需要在会话中取出来,用到了钩子函数mounted

需要在上个视图中,存储在会话里的数据取出来

  mounted () {
    let s = sessionStorage.getItem('food')
    s = JSON.parse(s)
    this.food = s
  }

这时候数据就传过来了
在这里插入图片描述
现在还差个action就可以修改了,但是在发送前需要action,在发送前增加新的属性action

  methods: {
    updateFood(){
      this.food['action'] = 'update'
      axios.post('http://localhost:8888/MVCProject/food',qs.stringify(this.food))
      .then((response)=>{
        alert(response.data)
      })
    }
  },

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java037——多线程

当涉及到计算机操作系统中的并发执行时&#xff0c;进程和线程是两个核心概念。 一、程序(program) 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一 段静态的代码&#xff0c;静态对象。 二、进程&#xff08;Process&#xff09; 进程&#xff0…

MD5数据加密方法

什么场景需要使用数据加密呢&#xff1f;比如秘密数据传输、用户密码加密存储等等 数据传输可使用密钥对的方式进行加密解密&#xff0c;使用签名方式验证数据是否可靠&#xff0c;而密码加密存储可使用MD5等一些算法对数据进行单向加密 一、MD5单向加密 1、百度说法&#x…

【基础统计学】带重叠差分置信区间的检验

一、说明 对于统计模式识别&#xff0c;需要从基本的检验入手进行学习掌握&#xff0c;本篇是对统计中存在问题的探讨&#xff1a;如果两个分布有重叠该怎么做。具体的统计学原理&#xff0c;将在本人专栏中系统阐述。 二、几个重要概念 2.1 什么是假设检验 假设检验是一种统计…

第二节 C++ 数据类型

文章目录 1. 概述1.1 数据类型的重要作用 (了解) 2. 数据类型2.1 什么是进制 ?2.1.1 存储单位 2.2 整数类型2.2.1 整数类型使用2.2.2 超出范围2.2.3 关键字 sizeof 2.3 实型(浮点型)2.3.1 setprecision()函数2.3.2 科学计数 (了解即可) 2.4 字符型2.4.1 字符型定义2.4.2 ASCII…

树-用Java托举

再讲完前面几个数据结构后&#xff0c;下面&#xff0c;我们开始对树进行一个讲解分析 树 引言 树是一种重要的数据结构&#xff0c;在计算机科学中有着广泛的应用。树是由节点和边组 成的非线性数据结构&#xff0c;具有层次结构和递归定义的特点。每个节点可以有多个子 节点…

【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书

Yan-英杰的主 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 问题描述 报错信息如下 报错描述 解决方法 总结 【粉丝福利】 【文末送书】 目录&#xff1a; 本书特色&#xff1a; 问题描述 报错信息如下 Description:An attempt…

Docker 命令(二)

查看 docker 版本信息 docker version #查看版本信息docker 信息查看 docker info Client:Context: defaultDebug Mode: falsePlugins:app: Docker App (Docker Inc., v0.9.1-beta3)buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)Server:Containers: 0 …

get请求传入[ ]这类字符 返回400错误解决

问题描述 使用get请求查询&#xff0c;传入特殊字符 []时&#xff0c;接口报错。 分析原因 高版本的tomcat&#xff0c;有个新特性&#xff1a; 严格按照RFC 3986规范进行访问解析&#xff0c;而 RFC3986规范定义了Url中只允许包含英文字母&#xff08;a-zA-Z&#xff09;、数…

【Python】数据分析+数据挖掘——Pandas中文件I/O操作

文章目录 前言1. 读入文本格式数据文件1.1 pd.read_csv实例 1.2 pd.read_table1.3 pd.read_excel实例 1.4 pd.read_sql 2. 保存数据文件2.1 保存数据文件到外部文件中2.2 保存数据文件到数据库中 结束语 前言 在数据分析和数据挖掘中&#xff0c;数据通常以文件的形式存储在磁…

静电消除风机风棒的工作原理

静电消除风机风棒的工作原理静电消除离子风机是一种专门用于消除静电的设备。静电是由于物体表面带有静电荷而引起的现象&#xff0c;容易导致尘埃吸附、静电放电等问题。静电消除离子风机通过释放负离子或正离子来中和空气中的静电荷&#xff0c;从而减少静电问题的发生。 静…

【基于CentOS 7的Rsync服务】

目录 一、概述 二、特性 1.快速 2.安全 3.应用场景 三、数据的同步方式 1.pull 2.push 四、rsync传输模式 1.本地传输 2.远程传输 3.守护进程 五、rsync应用 1.安装 2.监听端口 六、rsync命令 1.格式 1.1 作为远程命令 1.2 作为rsync服务 2.选项 3.举例 …

服务器数据恢复-ESX SERVER无法连接到STORAGE的数据恢复案例

服务器数据恢复环境&#xff1a; 某公司信息管理平台&#xff0c;数台VMware ESX SERVER虚拟机共享一台IBM某型号存储。 服务器故障&#xff1a; VC报告虚拟磁盘丢失&#xff0c;管理员ssh到ESX中执行fdisk -l命令查看磁盘&#xff0c;发现STORAGE已经没有分区表了。重启设备后…

2023-7-20-第二十一式访问者模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

unity预制体打包

unity做好的预制体如果给别的工程使用&#xff0c;如果是单纯的ctrlcv会导致丢失引用&#xff0c;如材质信息等&#xff0c;我们可以将其打包好再导入给别的工程。 如打包这个cube&#xff1a; 点击Export&#xff0c;选择保存位置

【算法基础:搜索与图论】3.2 树与图的dfs和bfs

文章目录 例题846. 树的重心&#xff08;深度优先遍历 / 树形DP&#xff09;⭐⭐⭐⭐⭐&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;&#xff08;重要&#xff01;好题&#xff01;&#xff09;847. 图中点的层次 相关链接 要学会建树、建图的通用方法。…

【C++】C++ 11 新特性

文章目录 &#x1f4d5; ★ 右值引用 ★概念左值引用和右值引用的比较使用场景和意义移动构造左值引用的缺陷 完美转发属性丢失为什么会属性丢失解决方法 &#x1f4d5; 新的类功能默认成员函数default 和 delete 关键字 &#x1f4d5; lambda 表达式问题的提出概念函数对象和 …

nuxt获取地址栏(路由)参数

要获取的路由地址&#xff08;页面顶部地址栏&#xff09;&#xff1a;http://172.31.0.1:5353/judge-manage?id3694089482878918764&name%E6%B5%8B%E8%AF%95&judgeIde9IJWN5usmzbrtNC3zYSRtAcKu-M333h 1、获取域名或ip端口&#xff1a;172.31.0.1:5353 2、获取地址…

JMeter的使用方法

JMeter是开源软件&#xff0c;100%的使用Java语言来进行开发的&#xff0c;支持主流的协议&#xff08;HTTP,HTTPS,WebService,gRPC&#xff09;的API测试和性能测试,是一款非常优秀的测试工具软件。 java 语言编写的程序&#xff0c;程序要运行&#xff0c;对外运行的程序有两…

Windows 2012 R2 编辑ini文本遇到的编码问题

在编辑服务端配置文件时&#xff0c;发现对于ini文本文件&#xff1a; 需注意点一&#xff1a;如果另存为UTF-8保存的实际上格式是UTF-8-BOM编码格式&#xff1b; 但是两种格式是存在差异的&#xff1a; 因此造成在使用C#调用系统DLL读取文件时并未报错&#xff0c;但是当使用…

access数据库注入

access数据库一般是100人以下的小型数据库&#xff0c;后缀是asp的网站 先加一个’看下回显内容&#xff0c;有没有报错 在用and 11 和and 12看下回复内容 and 12 有报错内容&#xff0c;可以确定存在注入点 猜数据库名字&#xff0c;asp的数据库后缀是mdb and exists(select *…