springboot+react实现前后端交互

2023-11-11

一、搭建springboot后台

1. 创建一个Springboot项目, 然后导入pom依赖, 本着一切从简的原则,如果不连接数据库的话,有个spring-boot-starter-web的依赖就够用了。 

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!--MySql连接驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

2. 因为是前后端分离开发,所以React不放在springboot目录下, 如果要连接数据库

application.properties配置

#数据库连接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

#配置mybatis信息
mybatis.type-aliases-package=com.jarvis.springboot_mybatis.Entity
mybatis.mapper-locations=classpath:mapper/*Mapper.xml


sql 
DROP TABLE IF EXISTS `user`;
create table `user`(
    `id` int(11) NOT NULL auto_increment,
    `username` varchar(50) default null,
    `password` varchar(50) default null,
    `name` varchar(50) default null,
    primary key (`id`)
)ENGINE = InnoDB AUTO_INCREMENT=10 DEFAULT  CHARSET=utf8;


insert into `user` values ('1','zhangsan','123','张三');
insert into `user` values ('2','lisi','123','里斯');

不连接数据库, 再根据下面修改就好。



@Controller
public class MybatisController {

    @RequestMapping(value = "/hello")
    @@ResponseBody
    public String queryUserList(){
        String s = "[{" + "\"name\":\"奥利给\"" + "}]";
        return s;
    }
}

3. 实体类配置以及mapper配置

public class User{
    private Integer id;
    private String username;
    private String password;
    private String name;
    
    //get/set自己加    alt+insert
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
    List<User> queryUserList();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.jarvis.springboot_mybatis.mapper.UserMapper">
    <select id="queryUserList" resultType="user">
        select * from user;
    </select>

</mapper>

4. 创建一个controller目录, 然后在创建一个类,加个@Controller注解

二、编写react

1. 复杂的也不会写,就是简单做个数据交互,安装好node和npm后, 利用npm命令 npm install create-react-app 下载create-react-app,然后再create-react-app 项目名创建项目, 具体如何创建自己百度。

删除掉没用的后

2. 配置页面跳转

import React, {Component} from 'react';
import {BrowserRouter as Router, Route} from 'react-router-dom';
import Home from './Home';
import Page1 from './Page1';
import Page2 from './Page2';

class App extends Component{
  render() {
    return (
        <Router>
          <div>
              {/*访问其他页面不显示Home*/}
            <Route exact path="/" component={Home}/>
            <Route path="/Page1" component={Page1}/>
            <Route path="/Page2" component={Page2}/>
          </div>
        </Router>
    )
  }
}

export default App;



--------------Home
import React, {Component} from 'react';
import {Link} from 'react-router-dom';

class Home extends Component{
    render() {
        return (
            <React.Fragment>
                <div>
                    This is Home!
                </div>
                <div>
                    <Link to="/Page1" style={{color:'black'}}>
                        <p>点击跳转到Page1</p>
                    </Link>
                    <Link to="/Page2" style={{color:'black'}}>
                        <p>点击跳转到Page2</p>
                    </Link>
                    <Link to="/Page3" style={{color:'black'}}>
                        <p>点击跳转到Page3</p>
                    </Link>
                </div>
            </React.Fragment>
        )
    }
}
export default Home;

3. 因为react的访问地址是http://127.0.0.1:3000, tomcat访问地址是http://127.0.0.1:8080,端口号不同,所以涉及到跨域问题, 有兴趣可以搜一下。

所以我采用两种方式进行跨域数据交互

第一种: fetch方式, 在前端修改请求头, 然后再后端在加上@CrossOrigin注解,可直接加在方法上,加在类上对应所有方法。

import React, {Component} from 'react'

class Page1 extends Component{
    constructor(props){
        super(props);
        this.state={
            mytext: []
        }
    }
    getData(){
        //修改请求头
        let myHeaders = new Headers({
            'Access-Control-Allow-Origin': '*',
            'Content-Type': 'text/plain'
        });
        fetch('http://127.0.0.1:8080/hello',{
            method:'GET',
            headers: myHeaders,
            mode: 'cors',
            //转或称字符串格式
        }).then(res=>res.json()).then(
            data=>{
                console.log(data);
                // eslint-disable-next-line
                data.map((key)=>{
                    this.setState({
                        mytext: [...this.state.mytext, key]
                    })
                })
            }
        )
    }
    //React周期函数,防止死循环,在组建被渲染前调用
    componentWillMount(){
        this.getData();
    }
    render() {
        return (
            <React.Fragment>
                <ul>
                    {
                        this.state.mytext.map((key, index)=>{
                            return <li key={index}>{key.name}</li>
                        })
                    }
                </ul>
            </React.Fragment>
        )
    }
}
export default Page1;

import com.jarvis.springboot_mybatis.Entity.User;
import com.jarvis.springboot_mybatis.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import java.util.List;

@Controller
@CrossOrigin
public class MybatisController {

    @Autowired
    private UserMapper userMapper;

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    @ResponseBody
    public List<User> hello(){
        List<User> user = userMapper.queryUserList();
        System.out.println(user);
        return user;
    }
}

第二种方式是XMLHttrRequest方式, 这种方式在前端不用配置,需要在后端设置请求头, 请求的时候需要将localhost改成127.0.0.1,要不然因为不识别会报错, 然后是setResponse需要和Origin保持一致。( F12)

true和false那是发不发送cookie,自行解决。

import React, {Component} from 'react'

class Page2 extends Component{
    constructor(props){
        super(props)
        this.state={
            service: [],
        }
    }
    componentDidMount() {
        //ajax方法去服务器取数据,异步true
        const xhr = new XMLHttpRequest()
        xhr.open("GET", "http://127.0.0.1:8080/Page22", true)
        //根据情况选择是否要随get请求发送用于身份认证的信息
        xhr.withCredentials = false
        xhr.send()

        xhr.onreadystatechange = () =>{
            /**
             *   0 UNSENT- open()尚未被调用
                 1 OPENED- send()尚未被调用
                 2 HEADERS_RECEIVED- send()已被调用,并且头和状态可用
                 3 LOADING下载;- responseText的保持部分数据
                 4 - 的操作完成
             */
            // eslint-disable-next-line
            if(xhr.readyState == XMLHttpRequest.DONE){
                // eslint-disable-next-line
                if(xhr.status == 200){
                    let gotService = JSON.parse(xhr.responseText)
                    this.setState({
                        service: gotService
                    })
                }
            }else {
                console.log(xhr.readyState + "---加载中")
            }
        }
    }

    render() {
        const serviceShows = this.state.service.map((user, index)=>{
            return (
                <tr key={index}>
                    <td>{user.id}</td>
                    <td>{user.username}</td>
                    <td>{user.name}</td>
                </tr>
            )
        })
        return (
            <table>
                <tbody>
                    {serviceShows}
                </tbody>
            </table>
        )
    }
}
export default Page2;

import com.jarvis.springboot_mybatis.Entity.User;
import com.jarvis.springboot_mybatis.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import javax.servlet.http.HttpServletResponse;

import java.util.List;

@Controller
@CrossOrigin
public class MybatisController {

    @Autowired
    private UserMapper userMapper;

    @RequestMapping(value = "/Page22", method = RequestMethod.GET)
    @ResponseBody
    public List<User> helloPage2(HttpServletResponse response){
        List<User> user = userMapper.queryUserList();
        System.out.println(user);
        //response.setHeader("Access-Control-Allow-Credentials","True");
        response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:3000");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
        return user;
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot+react实现前后端交互 的相关文章

随机推荐

  • 根据isbn查询图书信利用豆瓣的API

    String apikey 111111111111111111111111111111 String isbnUrl http api douban com book subject isbn public static void mai
  • java面向对象(一)

    面向对象 类对象方法 类的定义 作用域修饰词 一个类可以包含以下类型变量 static静态 静态变量类变量 静态方法 static代码块 final 修饰方法 修饰变量 static final 方法 构造方法特殊的方法 创建对象 访问成员
  • 什么是神经网络架构搜索?

    https mp weixin qq com s F6ZbX2JVqSOAhE2hXBnLLA
  • 洛谷 1969 积木大赛——水题

    题目 https www luogu org problemnew show P1969 include
  • 常见的几种网络故障案例分析与解决

    故障1 交换机刚加电时网络无法通信 故障现象 交换机刚刚开启的时候无法连接至其他网络 需要等待一段时间才可以 另外 需要使用一段时间之后 访问其他计算机的速度才快 如果有一段时间不使用网络 再访问的时候速度又会慢下来 故障分析 由于这台交换
  • 完全背包问题求组合数和排列数

    518 零钱兑换 II 这个是完全背包问题的典型应用 由于只是求个数 不涉及到零钱排列情况不一样算两次的情况 所以两层for循环 外层遍历物品 内层遍历背包 class Solution public int change int amou
  • 阿里云播放器prismplayer抓包的一些理解

    Prismplayer是一套在线视频播放技术方案 同时支持Flash和Html5两种播放技术 可对播放器进行功能配置和皮肤定制 其在线使用文档地址为 入口 在甘肃交通视频云联网平台中用的就是该播放器 通过抓包发现 播放的是hls的ts流 下
  • mysql存储过程

    CREATE DEFINER root localhost PROCEDURE test BEGIN DECLARE i int DEFAULT 0 DECLARE classSize int DEFAULT 0 SELECT count
  • 给jupter设置新环境

    文章目录 给jupternotebook设置新环境 遇到的报错 添加路径的方法 给jupternotebook设置新环境 先在anaconda界面新建环境 conda env list 查看conda prompt下的有的环境变量 带星号的
  • Vue2使用插件合集

    Quill 插件描述 Vue 富文本编辑器 1 下载 vue quill editor npm i vue quill editor S 2 将vue quill editor引入到main js import VueQuillEditor
  • 任务调度器leetcode621

    问题 来自LeetCode 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表 其中每个字母表示一种不同种类的任务 任务可以以任意顺序执行 并且每个任务都可以在 1 个单位时间内执行完 在任何一个单位时间 CPU 可以完成一
  • springcloudgateway集成hystrix

    目录 一 pom引入依赖 二 RestTemplate开启ribbon的负载均衡 LoadBalanced 三 yml配置和熔断降级的fallback接口 四 技术资料 springcloudgateway和Hystrix springcl
  • 如何设计高性能的分布式锁

    什么是分布式锁 在 JVM 中 在多线程并发的情况下 我们可以使用同步锁或 Lock 锁 保证在同一时间内 只能有一个线程修改共享变量或执行代码块 但现在我们的服务都是基于分布式集群来实现部署的 对于一些共享资源 在分布式环境下使用 Jav
  • Antd Table 可编辑表格

    antd Table 官方文档提及了 可编辑单元格 可编辑行 这里解决 可编辑表格 主要思路是将 antd Table 可编辑行 与 antd Form List 相结合 将Table视为 Form List 中循环的 Form Item
  • 如何使用Hexo搭建属于自己的博客

    Hexo安装步骤 Hexo官网 环境准备 Nodejs Git node v npm v 安装Hexo npm install hexo cli g cd到你需要创建博客的文件夹 hexo init blog cd blog npm ins
  • Ubuntu系统连接罗技K380键盘

    近日向学习LInux系统的使用 便把windows系统卸载装上了Ubuntu 下面是罗技K380连接Ubuntu 系统的方法 先打开K380键盘的蓝牙 我选择2 然后进入电脑的终端 输入如下命令 bluetoothctl devices 此
  • 超详细的tomcat的下载安装和配置教程

    tomcat运行的前提是安装并配置了JDK 若没有安装配置JDK 先去安装配置JDK 如下链接 JDK 1 8的下载安装和环境变量的配置 详细步骤 一 下载tomcat 1 进入tomcat的下载 tomcat下载官网 2 点击进入 点击
  • FastDFS在Docker集群安装

    一 简介 FastDFS是由国人余庆所开发 其项目地址 https github com happyfish100 FastDFS是一个轻量级的开源分布式文件系统 主要解决了大容量的文件存储和高并发访问的问题 文件存取时实现了负载均衡 Fa
  • 基于Matlab模拟宇宙射线μ

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • springboot+react实现前后端交互

    一 搭建springboot后台 1 创建一个Springboot项目 然后导入pom依赖 本着一切从简的原则 如果不连接数据库的话 有个spring boot starter web的依赖就够用了