day13_mvc 前后端分离 - 教程

news/2025/11/19 17:27:13/文章来源:https://www.cnblogs.com/gccbuaa/p/19243369

day13_mvc 前后端分离

1MVC

model (数据)模型

view 视图

control 控制

servlet+jsp 用jsp做view

如果需要数据

页面跳转

1请求转发

请求对象调用

一次请求

借助request对象 可以传任意类型

2响应重定向

响应对象调用

多次请求

只能传字符的简单数据

2前后端分离

前端 html css javascript

通过ajax请求(前端技术 发送请求的技术) 交互数据

后端 java

2.1ajax技术介绍

* ajax核心功能   * 页面不跳转的前提下 发请求与后端做数据交互   * 1.ajax通过子线程发送请求   * 2.报文结构相同 后端处理模式不变   * 3.后端会有一定的变化   *   1.后端不再传页面标签 只传处理结果   *   2.重定向功能无效   *   3.请求转发(功能削弱 很少用到)   *   *   * 前端使用vue框后 使用MVVM模式

2.2ajax原生代码

页面

      Title   <script>   /*   * ajax核心功能   * 页面不跳转的前提下 发请求与后端做数据交互   * 1.ajax通过子线程发送请求   * 2.报文结构相同 后端处理模式不变   * 3.后端会有一定的变化   *   1.后端不再传页面标签 只传处理结果   *   2.重定向功能无效   *   3.请求转发(功能削弱 很少用到)   *   *   * 前端使用vue框后 使用MVVM模式   *   *   * */
​   const myHref = ()=>{       //异步请求对象       let xhr = new XMLHttpRequest();       //1配置回调函数       xhr.onreadystatechange = ()=>{           if(xhr.readyState == 4 && xhr.status == 200){               //请求正常 响应正常               let respData = xhr.responseText               console.log(respData)               //可以根据响应情况 写不同js处理               //......           }       }       //2.设置请求参数       xhr.open("post","/day13/ajaxDemo")       //3.设置请求头       xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");       xhr.setRequestHeader("myHeader","jack123")       //4.发送请求       xhr.send("username=rose&age=15");
​
​   }
​
​
</script>

服务端

package com.javasm;
​
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 java.io.IOException;
import java.io.PrintWriter;
​
/*** @className: AjaxDemoServlet* @author: gfs* @date: 2025/10/17 10:59* @version: 0.1* @since: jdk17* @description:*/
@WebServlet("/ajaxDemo")
public class AjaxDemoServlet extends HttpServlet {
​   @Override   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {       //取请求参数       System.out.println(req.getParameter("username"));       //取请求头       String myHeader = req.getHeader("myHeader");       System.out.println(myHeader);
​
​       //通过输出流 返回数据       resp.setContentType("text/html;charset=utf-8");       PrintWriter writer = resp.getWriter();       writer.print("name ok!!!");       writer.close();
​
​   }
}
​
2.3axios 简化ajax请求

https://www.axios-http.cn/docs/intro axios官网

简化后的ajax请求

get请求

axios.get('/day13/ajaxDemo?username=rose')           .then((resp)=>{               //请求响应数据对象               console.log(resp)               //返回的实际数据               console.log(resp.data)           })

post请求

axios.post('/day13/ajaxDemo','username=rose')           .then((resp)=>{               //请求响应数据对象               console.log(resp)               //返回的实际数据               console.log(resp.data)           })

请求格式:

//用来配置请求的其他参数    axios.post('/day13/ajaxDemo','username=rose',{headers: {'myHeader': 'zhangsan'},})//写成功的回调           .then((resp)=>{               //请求响应数据对象               console.log(resp)               //返回的实际数据               console.log(resp.data)           })//写失败的回调           .catch(function (error) {               // 处理错误情况               console.log(error);           })//不管成功失败           .finally(function () {               // 总是会执行           });

原始请求格式 全用json配置

// 发起一个post请求
//全部用json做配置
axios({ method: 'post', url: '/user/12345', data: {   firstName: 'Fred',   lastName: 'Flintstone'}
});

校验用户名重复示例

页面

      Title   
   
   
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script>   const checkName = ()=>{       let currentName =  document.getElementById("username").value       //vue 依赖 插件       axios.post("/day13/checkName","username="+currentName)          .then(resp=>{               console.log(resp.data)               if(resp.data){                   document.getElementById("checkNameSpan").innerHTML = "用户名可用"              }else{                   document.getElementById("checkNameSpan").innerHTML = "用户名重复"              }          }) ​  } ​ ​ ​ </script> ​

服务端

package com.javasm;
​
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 java.io.IOException;
import java.io.PrintWriter;
​
/*** @className: CheckNameServlet* @author: gfs* @date: 2025/10/17 11:48* @version: 0.1* @since: jdk17* @description:*/
@WebServlet("/checkName")
public class CheckNameServlet extends HttpServlet {
​   @Override   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {       req.setCharacterEncoding("utf-8");       String username = req.getParameter("username");       String respData = "";       if("jack".equals(username)){           //重复           respData = "false";       }else{           //可用           respData = "true";       }
​       resp.setContentType("text/html;charset=utf-8");       PrintWriter writer = resp.getWriter();       writer.print(respData);       writer.close();
​
​   }
}
​

3后端接口标准化

后端针对ajax请求和前后端分离 需要做一些代码格式的标准化

* 1.三层结构* 2.servlet做控制层* 3.数据返回json*   可以返回多维度数据  和复杂的数据结构*   resp.setContentType("application/json;charset=utf-8")* 4.使用统一的转换jar包*   json与java对象互相转换*   Gson    google的   功能大而全 api较复杂 转换效率偏慢*   Jackson            功能大而全 转换效率偏慢 api较简单*   Fastjson           功能较全   转换块      api简单*   验证json字符串的网站 https://www.json.cn/*   使用fastjson  (标准json格式 需要key带引号)*   JSON.toJSONString(对象)                               对象  转json字符串*   User user2 = JSON.parseObject(myJsonStr, User.class) 字符串  转java对象** 5.统一返回数据的key*   ReturnResult*   操作码 code  操作信息  msg  附加数据(详细信息)  returnData** 6.通过枚举类 列举操作与操作信息的对应关系*   防止程序员手误 导致操作码错乱
package com.javasm;import com.alibaba.fastjson.JSON;
import com.javasm.entity.ReturnCode;
import com.javasm.entity.ReturnResult;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 java.io.IOException;
import java.io.PrintWriter;/*** @className: CheckNameServlet* @author: gfs* @date: 2025/10/17 11:48* @version: 0.1* @since: jdk17* @description:*/
@WebServlet("/checkName")
public class CheckNameServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/** 后端只提供数据处理服务* (后端是远程调用的方法)* 代码格式做标准化***** 1.三层结构* 2.servlet做控制层* 3.数据返回json*   可以返回多维度数据  和复杂的数据结构*   resp.setContentType("application/json;charset=utf-8")* 4.使用统一的转换jar包*   json与java对象互相转换*   Gson    google的   功能大而全 api较复杂 转换效率偏慢*   Jackson            功能大而全 转换效率偏慢 api较简单*   Fastjson           功能较全   转换块      api简单*   验证json字符串的网站 https://www.json.cn/*   使用fastjson  (标准json格式 需要key带引号)*   JSON.toJSONString(对象)                               对象  转json字符串*   User user2 = JSON.parseObject(myJsonStr, User.class) 字符串  转java对象** 5.统一返回数据的key*   ReturnResult*   操作码 code  操作信息  msg  附加数据(详细信息)  returnData** 6.通过枚举类 列举操作与操作信息的对应关系*   防止程序员手误 导致操作码错乱*** */req.setCharacterEncoding("utf-8");String username = req.getParameter("username");//String respData = "";ReturnResult returnResult = new ReturnResult();if("jack".equals(username)){//重复returnResult.setCode(ReturnCode.NAMECHECK_FAILED.getCode());returnResult.setMsg(ReturnCode.NAMECHECK_FAILED.getMsg());returnResult.setReturnData("red");//respData = "{\"msg\":\"用户名重复\",\"color\":\"red\"}";}else{//可用returnResult.setCode(ReturnCode.NAMECHECK_OK.getCode());returnResult.setMsg(ReturnCode.NAMECHECK_OK.getMsg());returnResult.setReturnData("green");//respData = "{\"msg\":\"用户名可用\",\"color\":\"green\"}";}resp.setContentType("application/json;charset=utf-8");PrintWriter writer = resp.getWriter();writer.print(JSON.toJSONString(returnResult));writer.close();}
}

接口文档:

前后端可以根据接口文档做开发 是前后端交互的重要文档

* 后端服务接口* 校验用户名是否重复接口* 接口文档*  请求地址  /day13/checkName*  请求方式  get/post*  请求参数  username string*  返回数据格式  json*  返回数据示例*             重复*                   {code: 10011,msg: "用户名重复",returnData: "red"}*             可用{code: 10010,msg: "用户名可用",returnData: "green"}

4前端使用独立的服务器 vite

注意:

axios与vue没有集成关系 不是vue插件 是普通依赖

安装

pnpm add axios

哪个页面使用 就在那个页面引入

import  axios from 'axios'
axios.get("/xxx")

跨域请求异常情况:

//跨域问题://从服务器A 直接访问服务器B   浏览器会做限制//浏览器自动发送预检请求 检查请求是否出自同源 method=options

解决方法 符合cors标准

配置CORS  符合浏览器的CORS 规范被访问端配置 允许访问的来源
/* 允许跨域的主机地址*/resp.setHeader("Access-Control-Allow-Origin", "http://localhost:5173");/* 允许跨域的请求⽅法GET, POST, HEAD 等*/resp.setHeader("Access-Control-Allow-Methods", "*");/*重新预检验跨域的缓存时间*/resp.setHeader("Access-Control-Max-Age", "3600");/* 允许跨域的请求头 */resp.setHeader("Access-Control-Allow-Headers", "*");/* 是否携带cookie */resp.setHeader("Access-Control-Allow-Credentials", "true");

接口例子2 省市县信息

数据库表

查询省市县信息的sql语句

select * from tb_area where parent_code = 1001

查询省市县接口

controller

package com.javasm.controller;import com.alibaba.fastjson.JSON;
import com.javasm.entity.AreaInfo;
import com.javasm.entity.ReturnCode;
import com.javasm.entity.ReturnResult;
import com.javasm.service.AreaService;
import com.javasm.service.impl.AreaServceImpl;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 java.io.IOException;
import java.io.PrintWriter;
import java.util.List;/*** @className: ListAreaServlet* @author: gfs* @date: 2025/10/17 16:47* @version: 0.1* @since: jdk17* @description:*/
@WebServlet("/listArea")
public class ListAreaServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/* 查询地区信息接口* 接口文档*  请求地址  /day13/listArea*  请求方式  get/post*  请求参数  parentCode int   必填         非必填项*                           必须要传值     有默认值*  返回数据格式  json*  返回数据示例*//* 允许跨域的主机地址*/resp.setHeader("Access-Control-Allow-Origin", "http://localhost:5173");/* 允许跨域的请求⽅法GET, POST, HEAD 等*/resp.setHeader("Access-Control-Allow-Methods", "*");/*重新预检验跨域的缓存时间*/resp.setHeader("Access-Control-Max-Age", "3600");/* 允许跨域的请求头 */resp.setHeader("Access-Control-Allow-Headers", "*");/* 是否携带cookie */resp.setHeader("Access-Control-Allow-Credentials", "true");//1接收请求参数 转换格式 封装对象String parentCodeStr = req.getParameter("parentCode");Integer parentCode = 0;//没有key null  有key 没值  ""if(parentCodeStr!=null&&!"".equals(parentCodeStr)){parentCode = Integer.parseInt(parentCodeStr);}//2调用serviceAreaService areaServce = new AreaServceImpl();List areaInfos = areaServce.listAreaByParentCode(parentCode);//3根据执行结果 返回json数据ReturnResult returnResult = new ReturnResult(ReturnCode.QUERY_SUCCESS.getCode(),ReturnCode.QUERY_SUCCESS.getMsg(),areaInfos);resp.setContentType("application/json;charset=utf-8");PrintWriter writer = resp.getWriter();writer.print(JSON.toJSONString(returnResult));writer.close();}
}

service

package com.javasm.service.impl;import com.javasm.dao.impl.AreaDaoImpl;
import com.javasm.entity.AreaInfo;
import com.javasm.service.AreaService;import java.util.List;/*** @className: AreaServceImpl* @author: gfs* @date: 2025/10/17 16:58* @version: 0.1* @since: jdk17* @description:*/
public class AreaServceImpl implements AreaService {@Overridepublic List listAreaByParentCode(Integer parentCode) {return new AreaDaoImpl().listAreaByParentCode(parentCode);}
}

dao

package com.javasm.dao.impl;import com.javasm.dao.AreaDao;
import com.javasm.entity.AreaInfo;
import com.javasm.entity.User;import java.sql.*;
import java.util.ArrayList;
import java.util.List;/*** @className: AreaDaoImpl* @author: gfs* @date: 2025/10/17 16:52* @version: 0.1* @since: jdk17* @description:*/
public class AreaDaoImpl implements AreaDao {@Overridepublic List listAreaByParentCode(Integer parentCode) {//jdbc 流程比较繁琐List listArea = new ArrayList<>();Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//1 创建连接//加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//创建连接connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", "root");//2准备请求数据请求String sql = "select * from tb_area where parent_code = ?";preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,parentCode);//3发送请求 接收反馈resultSet = preparedStatement.executeQuery();//4读取响应报文中的数据内容 做成java中的对象数据while(resultSet.next()){int areaCode = resultSet.getInt("area_code");String areaName = resultSet.getString("area_name");String parentCodeDB = resultSet.getString("parent_code");listArea.add(new AreaInfo(areaCode,areaName,parentCode)) ;}} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (SQLException e) {throw new RuntimeException(e);}finally {try{if(resultSet!=null)resultSet.close();if(preparedStatement!=null)preparedStatement.close();if(connection!=null)connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}return listArea;}
}

entity

package com.javasm.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @className: AreaInfo* @author: gfs* @date: 2025/10/17 16:50* @version: 0.1* @since: jdk17* @description:*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AreaInfo {private Integer areaCode;private String areaName;private Integer parentCode;}

写完接口后 使用接口测试工具 测试接口的使用

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

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

相关文章

noexcept修饰的函数无法被catch到(只会崩溃)

由于createTest函数是被noexcept修饰的,但是createTest又抛出了异常,这是catch不到的class Test {vector<int> vec; public :Test(int siz) : vec(siz) {printf("siz: %d\n", siz); fflush(stdout);…

C语言的strlen的模拟实现

strlen是一个库函数,作用是计算字符串的长度 头文件为<string.h> 今天我们来用三种方式实现一下 循环 #include<stdio.h> #include<assert.h> size_t my_strlen(const char* arr) {size_t count = …

CF1221F Choose a Square

首先将点转化到上面去。 此时变成要你求一条横线和一条竖线,使得它们右下方区域里的点权值和尽可能大。 考虑扫竖线,对于每个横线维护一个线段树,向右扫的时候每删除一些结点就在线段树里后缀减即可。

2025年pp阻燃管制造企业权威推荐榜单:pp灌溉管/pp管件批发/pp聚丙烯管源头厂家精选

在化工、冶金及环保工程领域,PP阻燃管凭借其优异的耐腐蚀性、阻燃安全性及使用寿命,已成为输送腐蚀性介质、处理工业废水及粉尘回收系统的关键材料,其材料配方与制造工艺直接关系到整个工业设施的安全与稳定运行。 …

python学习笔记-PyInstaller打包成软件包

python学习笔记-PyInstaller打包成软件包Posted on 2025-11-19 17:14 夜owl 阅读(0) 评论(0) 收藏 举报1. PyInstaller 介绍 1.1. 什么是 PyInstaller? PyInstaller 是一个用于将 Python 程序打包成独立可执行文…

2025年欧标托盘定做厂家权威推荐榜单:工业木托盘/木卡板托盘/物流木托盘源头厂家精选

在全球化贸易与供应链效率持续提升的背景下,欧标托盘作为符合国际标准(EPAL)的物流载具,其规格统一性、结构稳定性与资质合规性已成为跨境物流与企业出口的关键保障。行业数据显示,2025年全球欧标托盘市场销售额预…

Python pip使用简介和国内镜像下载

Python pip使用简介和国内镜像下载 什么是pip pip 是 Python 的官方包管理工具,用于安装和管理第三方库(也称为“包”或“模块”)。自 Python 3.4 起,pip 默认随 Python解释器安装,通过命令行使用 pip 命令进行包…

2025 电加热器厂家最新推荐排行榜:实力制造商深度解析,覆盖多场景加热设备优质解决方案远红外/管道/远红外防爆/空气/高温高压反应釜电加热器厂家推荐

引言 工业加热器作为生产流程中的核心关键设备,其性能优劣直接关系到工艺稳定性、产品质量把控与企业综合成本控制,广泛应用于机械制造、化工生产、新能源、船舶航空等多个核心领域。当前市场上加热器品牌良莠不齐,…

2025 年 11 月工业 VOC 检测仪厂家推荐排行榜,VOC 气体检测仪,便携式 VOC 检测仪,固定式 VOC 检测仪,在线 VOC 检测仪公司推荐

2025年11月工业VOC检测仪厂家推荐排行榜 随着环保法规日益严格和工业安全需求不断提升,挥发性有机物(VOC)检测仪市场迎来快速增长。作为环境监测和工业安全的关键设备,VOC检测仪的技术创新和应用拓展成为行业关注焦…

2025 年 11 月氢气分析仪厂家推荐排行榜,在线氢气分析仪,便携式氢气分析仪,微量氢气分析仪,防爆氢气分析仪公司推荐

2025 年 11 月氢气分析仪厂家推荐排行榜 随着氢能产业的快速发展,氢气分析仪作为保障安全生产和工艺控制的关键设备,其市场需求持续增长。在石油化工、新能源、半导体制造等领域,精确的氢气浓度监测对工艺优化、安全…

2025-11-19 ZYZ28-NOIP-XiaoMao Round 33550336 hetao1733837的record

2025-11-19 ZYZ28-NOIP-XiaoMao Round 33550336 hetao1733837的record2025-11-19 ZYZ28-NOIP-XiaoMao Round 33550336 hetao1733837的record 比赛链接: A.C.Competitive Fishing 原题链接1:CF2042C Competitive Fish…

linux find -exec

find 是 Linux 中一个非常强大的命令行工具,用于在文件系统中搜索文件和目录。-exec 是 find 命令的一个选项,用于指定当找到匹配的文件时,执行的命令。一、find 命令的基本结构 find [路径] [选项] [命令] 其中 -e…

VMware 17 安装 CentOS 7 详细步骤

一、VMware 下载和安装 百度网盘:https://pan.baidu.com/s/1F8-EmFk8oaf2q647zAP35w 提取码: LN66以下为网上搜集到的许可证:MC60H-DWHD5-H80U9-6V85M-8280D(亲测有效)JUO9O-6039P-08409-8J0QH-2YR7F4A4RR-813DK-M…

02.入门篇-开发工具

02.入门篇-开发工具2 开发工具 2.1 开发工具简介开发Java程序必须先安装好 JDK(Java Development Kit),也就是 Java开发工具包,其中包含了常见的开发工具以及 JRE(Java Runtime Environment,其中包含了Java核心库…

2025年【口碑好的/比较好的/靠谱的】配变电站房智能辅控主设备公司推荐排行榜 哪家好/强/靠谱 -------南京品尼科自动化有限公司

2025年【口碑好的/比较好的/靠谱的】配变电站房智能辅控主设备公司推荐排行榜 哪家好/强/靠谱 -------南京品尼科自动化有限公司 在电力行业智能化转型的浪潮中,配变电站房智能辅控主设备作为保障电力设施安全、稳定、…

使用RPA下载文件测试

使用RPA下载文件测试使用RPA下载文件测试

2025年进口二位三通电磁阀厂商权威推荐榜单:进口小口径三通电磁阀/进口单电控三通电磁阀/进口双电控三通电磁阀源头厂家精选

在工业自动化与控制领域,进口二位三通电磁阀凭借其高可靠性、快速响应与长寿命的显著优势,已成为液压系统、气动回路、医疗设备和食品机械等关键应用中的核心控制元件。 随着工业自动化程度的提升和精密控制需求的增…

2025年防水贴缝带实力厂家权威推荐榜单:双面贴缝带/单面贴缝带/道路贴缝带源头厂家精选

在道路养护行业持续向高效、环保方向发展的背景下,防水贴缝带凭借其施工便捷、耐久可靠、经济环保的特点,已成为路面预防性养护的核心材料之一。行业数据显示,中国公路养护里程已占公路总里程的约90%,其中预防性养…

go2视频流获取webrtc

在开始之前,你需要安装 uv。可以通过以下命令安装:curl -LsSf https://astral.sh/uv/install.sh | sh 安装完成后,可以通过以下命令验证 uv 是否安装成功:uv --version 创建虚拟环境 在项目目录下创建一个新的虚拟…

2025年托辊设备定做厂家权威推荐榜单:托辊配件/梳形托辊/槽形托辊源头厂家精选

在工业输送系统持续向智能化、高效化发展的背景下,托辊设备作为输送系统的核心部件,其承载能力、使用寿命与定制化程度直接影响整个生产线的运行效率。为帮助用户精准筛选优质供应商,本文基于企业生产能力、技术实力…