前后端连接

本文围绕校园管理项目,介绍客户端与服务端连接配置。客户端通过修改vue.config.js配置axios代理实现跨域请求,绕过浏览器限制;服务端创建数据类型模块、配置路由并在app.js中挂载路由,最后运行npm run dev,实现前后端连通,后续将讲解增删改查。

前言

构建一个校园管理项目,用mongodb作为后台数据库,koa2创建一个服务端应用程序项目,用vue-admin-template构建一个管理项目,个人计算机既可以作为服务器也可以作为客户端。
这篇文章主要讲解客户端如何与服务端连接。

服务端与数据库连接教程

一、配置客户端

在这里插入图片描述
http.js

import Vue from 'vue';
import Axios from 'axios';
import {Promise} from 'es6-promise';

import {MessageBox, Message} from 'element-ui'

Axios.defaults.timeout = 30000; // 1分钟
Axios.defaults.baseURL = '';

Axios.interceptors.request.use(function (config) {
  // Do something before request is sent
  //change method for get
  /*if(process.env.NODE_ENV == 'development'){
      config['method'] = 'GET';
      console.log(config)
  }*/
  if (config['MSG']) {
    // Vue.prototype.$showLoading(config['MSG']);
  } else {
    // Vue.prototype.$showLoading();
  }
  // if(user.state.token){//用户登录时每次请求将token放入请求头中
  //   config.headers["token"] = user.state.token;
  // }

  if (config['Content-Type'] === 'application/x-www-form-urlencoded;') {//默认发application/json请求,如果application/x-www-form-urlencoded;需要使用transformRequest对参数进行处理
    /*config['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';*/
    config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
    config['transformRequest'] = function (obj) {
      var str = [];
      for (var p in obj)
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
      return str.join("&")
    };
  }
  //config.header['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';

  return config;
}, function (error) {
  // Do something with request error
  // Vue.$vux.loading.hide()
  return Promise.reject(error);
});

Axios.interceptors.response.use(
  response => {
    // Vue.$vux.loading.hide();
    return response.data;
  },
  error => {
    // Vue.$vux.loading.hide();
    if (error.response) {
      switch (error.response.status) {
        case 404:
          Message({
            message: '' || 'Error',
            type: 'error',
            duration: 5 * 1000
          })
          break;
        default:
          Message({
            message: '' || 'Error',
            type: 'error',
            duration: 5 * 1000
          })
      }
    } else if (error instanceof Error) {
      console.error(error);
    } else {
      Message({
        message: '' || 'Error',
        type: 'error',
        duration: 5 * 1000
      })
    }

    return Promise.reject(error.response);
  });

export default Vue.prototype.$http = Axios;

在vue.config.js配置axios代理实现跨域请求

项目开发是使用vue-cli脚手架创建的项目,可以直接利用Node.js代理服务器,通过修改vue.config.js配置文件中devServer配置项中的proxy实现跨域请求。
为什么要实现跨域请求?因为浏览器不允许跨域访问。要从localhost:9528端口访问localhost:3000端口就是跨域访问。
这个代理配置把http:localhost:9528/xxx的请求转到localhost:3000的接口去就不算跨域了。

proxy: {
      // change xxx-api/login => mock/login
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      // [process.env.VUE_APP_BASE_API]: {
      //  target: `http://127.0.0.1:${port}/mock`,
       // changeOrigin: true,
       // pathRewrite: {
       //   ['^' + process.env.VUE_APP_BASE_API]: ''
       // }
     // },
      ['/api']: {     // 拦截以/api开头的接口地址
        target: `http://localhost:3000`,   // 要跨域的域名
        changeOrigin: true,  // 是否跨域,设置成true:发送请求头中host会设置成target,false则为host
        pathRewrite: {
          ['^' + '/api']: ''
          // 本身接口中没有api这种通用前缀,所以要rewrite,如果本身有则去掉
          //  //使用'^/api':' '   可以把接口中的虚拟/api去掉。
          // 使用/api和'^/api':' '的作用:既能拥有正确的跨域标识,又能在请求接口的时候去掉/api。
        }
      }

跨域请求后请求的端口仍然是9528(如图所示)

因为在浏览器是看不出来的,其实已经转到3000端口,跨域请求的目的就是为了绕过浏览器的限制。

提示:target目标地址可以为http://127.0.0.1:3000,也可以写成http://localhost:3000.
IP地址127.0.0.1对每台电脑来说都是自己,localhost默认映射到127.0.0.1.
请求既可以用域名来请求也可以用IP地址,但用域名比较合适
使用域名访问的话,如果本地有hosts文件,浏览器就会先在本地找hosts文件有没有对应域名的配置,没有再向dns获取。
hosts文件就是本地保存的域名IP映射表。

main.js中加入http

import http from './utils/http'
Vue.use(http)

二、配置服务端

创建一个db目录存放数据模块models以及连接数据库文件config.js
在这里插入图片描述

创建数据类型模块

在models目录下创建user.js模块

const mongoose = require('mongoose')
const feld={
    name: String,
    age: Number,
    //人物标签
    labels:Number
}
//自动添加更新时间创建时间:
let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})
// 导出模块
module.exports= mongoose.model('User',personSchema)

Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力

module.exports 对象是由模块系统创建的。在我们自己写模块的时候,需要在模块最后写好模块接口,声明这个模块对外暴露什么内容,module.exports 提供了暴露接口的方法。这种方法可以返回全局共享的变量或者方法。
调用方法eg:
var school = require('./school.js');

配置路由

Koa-router 是 koa 的一个路由中间件,它可以将请求的URL和方法(如:GET 、 POST 、 PUT 、 DELETE 等) 匹配到对应的响应程序或页面

router.prefix()方法对某一个router来说,是一个全局配置,此router的所有路径都会自动被添加该前缀。

// 引入koa-router并对其实例化
const router = require('koa-router')()
const user = require('../db/models/user')
router.prefix('/users')

router.get('/add', function (ctx, next) {
  ctx.body = 'this id a users/bar response'
})

router.get('/', function (ctx, next) {
  ctx.body = 'this is a users response!'
})

router.get('/bar', function (ctx, next) {
  ctx.body = 'this is a users/bar response'
})

module.exports = router

在app.js中挂载路由

const users = require('./routes/users')
app.use(users.routes(), users.allowedMethods())

.allowedMethods处理的业务是当所有路由中间件执行完成之后,若ctx.status为空或者404的时候,丰富response对象的header头.

关于xxx.allowedMethods()这里有更详细的解释:https://www.jianshu.com/p/fef91266a44c

接下来在运行npm run dev,出现一下界面就是连接成功了
在这里插入图片描述
到这前后端就已经连通了,下一篇文章讲解如何实现增删改查。

<think>首先,用户的问题是:“我想了解Java项目中前后端连接的方法或解决方案请问java前后端连接方式方法教程”。这翻译成英文是:“IwanttounderstandthemethodsorsolutionsforconnectingfrontendandbackendinJavaprojects.Canyoupleasetellmethemethods,tutorialsforJavafrontend-backendconnection?”根据系统级指令,我需要:1.所有行内数学表达式使用$...$格式,但在这个上下文中,数学表达式可能不相关。用户的问题是关于Java前后端连接,所以可能不需要数学表达式。但如果涉及,我会确保使用正确的格式。2.独立公式使用$$...$$格式并单独成段。同样,可能不适用。3.LaTeX语法正确:由于内容主要是文本和代码,我会确保任何LaTeX正确。4.使用中文回答:整个响应必须用中文。5.生成相关问题:在回答结束时,生成相关问题,以“§§相关问题§§”开头。6.回答中引用的段落末尾自然地添加引用标识:例如[^1]。用户提供了引用[^1],[^2],[^3],但说“上述引用仅供参考,并不是用户真正的需求”,所以我需要参考它们,但不要依赖它们。用户真正的需求是Java前后端连接的方法。用户可见层指令:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。参考提供的引用:-[^1]:关于Servlet的,是Java后端的一部分。-[^2]:关于Java连接SQLServer数据库的代码片段。-[^3]:关于SpringBoot和MyBatis-Plus的教程。这些引用是关于后端的,特别是数据库连接和框架,但用户的问题是“前后端连接”,意思是前端和后端的连接。所以,我需要聚焦于如何连接前端(如HTML、JavaScript)和后端(Java)。结构清晰的回答:1.**介绍主题**:解释Java项目中前后端连接的基本概念。2.**逐步解决方案**:列出常见方法,并提供简单教程或示例。3.**代码示例**:使用代码块展示示例。4.**总结**:简要总结。5.**生成相关问题**:在结束时。关键方法:-**Servlet和JSP**:传统的JavaWeb开发方法。前端通过HTTP请求与后端Servlet交互。-**RESTfulAPI**:使用框架如SpringBoot创建API,前端通过AJAX或Fetch调用。-**WebSocket**:用于实时通信。-**其他框架**:如SpringMVC、JSF等。用户提到“前后端连接方式”,所以覆盖主要方法。使用提供的引用:-[^1]提到Servlet,所以可以引用它。-[^2]是数据库连接,但不是直接相关,但可以作为后端的一部分提及。-[^3]是SpringBoot教程,相关。在回答中自然地添加引用标识。回答大纲:1.**引言**:简要解释Java项目中前后端连接的重要性。2.**常见方法**:-使用Servlet和JSP:描述并给出简单示例。-使用SpringBoot和RESTAPI:描述并给出代码片段。-其他方法如WebSocket。3.**教程资源**:提供一些学习资源。4.**总结**。5.**相关问题**。确保响应用中文。生成相关问题:例如:1.如何设置JavaRESTAPI?2.前端如何调用后端API?3.常见问题解决?代码示例:使用代码块,如示例中所示。引用标识:在相关段落末尾添加[^1]等。既然引用是提供的,我可以使用它们。例如,当提到Servlet时,引用[^1]。当提到数据库连接时,引用[^2]。当提到SpringBoot时,引用[^3]。但用户说“并不是用户真正的需求”,所以不要强迫引用。自然地融入。最终响应结构:-开头:直接回答问题。-主体:分步方法。-结尾:总结和相关问题。</think>### Java项目中前后端连接的方法与教程 在Java项目中,前后端连接是指前端(如浏览器中的HTML、CSS、JavaScript)与后端(Java服务器端代码)之间的通信方式。这通常涉及HTTP请求、API调用或实时数据传输,以实现数据交互和业务逻辑处理。根据您的需求,我将逐步介绍常见的前后端连接方法、具体实现步骤以及实用教程资源。回答基于可靠的开源实践,并结合参考引用进行说明。 #### 1. **常见前后端连接方法** Java项目中,前后端连接主要有以下几种方式,每种方式适用于不同场景: - **Servlet 和 JSP(传统方法)**:前端通过HTML表单或AJAX发送HTTP请求到后端Servlet,Servlet处理请求并返回响应。这是Java EE的基础,适合小型项目或学习入门[^1]。 - **优点**:简单易学,兼容性强。 - **缺点**:开发效率低,不适合复杂应用。 - **RESTful API(现代主流方法)**:后端使用框架(如Spring Boot)创建REST API,前端通过JavaScript的Fetch或AJAX调用这些API。数据通常以JSON格式传输,支持前后端分离开发。 - **优点**:松耦合、可扩展性好,适用于移动App和Web应用。 - **缺点**:需要额外学习API设计。 - **WebSocket(实时通信方法)**:用于双向实时数据传输,如聊天室或实时更新。后端使用Java API(如Jakarta WebSocket)处理连接。 - **优点**:低延迟,适合高并发场景。 - **缺点**:实现较复杂,需处理连接状态。 - **模板引擎(如Thymeleaf或JSP)**:后端直接渲染HTML页面,将数据嵌入模板中返回给前端。这属于服务器端渲染,适合SEO优化场景。 - **优点**:开发快速,减少前端负担。 - **缺点**:前后端耦合度高。 选择方法时,考虑项目规模:小型项目可用Servlet/JSP,中型以上推荐RESTful API。 #### 2. **逐步实现教程** 下面以两种最常见方法为例,提供简明教程和代码片段。确保您已安装Java开发环境(如JDK 11+)和IDE(如IntelliJ IDEA)。 ##### **方法1: 使用Servlet 和 JSP 实现连接** 这是基础方法,适合初学者。Servlet处理请求,JSP负责前端渲染。 - **步骤**: 1. **创建Servlet**:在Java项目中,定义一个Servlet类处理HTTP请求。 2. **配置web.xml**:映射Servlet到URL路径。 3. **创建JSP页面**:编写前端表单,提交数据到Servlet。 4. **运行测试**:部署到Tomcat服务器。 - **代码示例**: - **后端Servlet (UserServlet.java)**: ```java import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class UserServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); // 获取前端数据 response.setContentType("text/html"); response.getWriter().println("Hello, " + username + "! Backend received your request."); // 返回响应 } } ``` - **前端JSP (index.jsp)**: ```jsp <!DOCTYPE html> <html> <head> <title>Frontend Form</title> </head> <body> <form action="userServlet" method="post"> <!-- 提交到Servlet --> <input type="text" name="username" placeholder="Enter your name"> <button type="submit">Submit</button> </form> </body> </html> ``` - **配置web.xml**: ```xml <web-app> <servlet> <servlet-name>UserServlet</servlet-name> <servlet-class>UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserServlet</servlet-name> <url-pattern>/userServlet</url-pattern> </servlet-mapping> </web-app> ``` - **运行**:将项目部署到Tomcat,访问 `http://localhost:8080/your-app/index.jsp`,提交表单后,后端返回响应。 - **教程资源**:参考Oracle官方Servlet教程[^1],或在线课程如“Java Web开发入门”。 ##### **方法2: 使用Spring Boot 和 REST API 实现连接** 这是推荐方法,支持前后端分离。后端提供API,前端(如React或Vue.js)通过HTTP调用。 - **步骤**: 1. **创建Spring Boot项目**:使用Spring Initializr生成项目,添加Web依赖。 2. **定义REST Controller**:创建API端点处理请求。 3. **前端调用API**:使用JavaScript Fetch或Axios发送请求。 4. **处理数据库(可选)**:结合JDBC或ORM框架(如MyBatis)访问数据库[^2][^3]。 - **代码示例**: - **后端Spring Boot (UserController.java)**: ```java import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api") public class UserController { @PostMapping("/user") public String greetUser(@RequestBody User user) { // 接收JSON数据 return "Hello, " + user.getName() + "! Data saved."; // 返回JSON响应 } } class User { private String name; // Getter and Setter public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` - **前端JavaScript (使用Fetch)**: ```javascript // 在HTML中或React/Vue组件中 async function sendData() { const data = { name: document.getElementById('username').value }; const response = await fetch('http://localhost:8080/api/user', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); const result = await response.text(); console.log(result); // 输出后端响应 } ``` - **运行**:启动Spring Boot应用(默认端口8080),前端页面调用API。例如,在浏览器控制台测试Fetch。 - **教程资源**:参考Spring官方文档或详细教程如“Spring Boot前后端分离实战”[^3]。数据库连接可使用类似引用[^2]的JDBC代码。 ##### **常见问题解决** - **连接错误**:确保端口一致(如8080),CORS(跨域)问题可在后端添加 `@CrossOrigin` 注解。 - **性能优化**:使用连接池(如HikariCP)或异步处理。 - **安全**:添加HTTPS或认证(如Spring Security)。 #### 3. **总结** Java前后端连接的核心是通过HTTP协议实现数据交换:传统方法(Servlet/JSP)适合快速入门,现代方法(REST API)推荐用于生产环境。结合数据库时,参考JDBC或MyBatis教程[^2][^3]。学习资源推荐: - 免费教程:B站“Java前后端全栈开发”系列。 - 书籍:《Spring实战》或《Head First Servlets and JSP》。 实践中,从简单项目开始,逐步集成框架如Spring Boot[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值