一、 前言
Express 是 Node.js 的一个流行框架,用于构建 Web 应用程序和 API。它提供了许多功能强大的工具和中间件,使得开发者能够轻松地创建高性能的服务器端应用。然而,实现一个完整的 Web 应用一个重要的方面是前台(客户端)与后台(服务器端)之间的交互。在这篇文章中,我们将探讨如何在 Express 框架下实现有效的前后端交互。
二、简介
实现前台与后台的交互通常要处理以后台路由、前台交互等内容:
1. 后台路由
在 Express 中,后台路由是定义了端点(endpoint)和处理函数的部分。这些路由负责处理来自客户端的请求,并返回相应的数据或执行相应的操作。下面是一个简单的后台路由示例:
const express = require ( 'express' ) ;
const app = express ( ) ;
app. get ( '/api/data' , ( req, res ) => {
const data = { message : '这是来自服务器的数据' } ;
res. json ( data) ;
} ) ;
app. listen ( 3000 , ( ) => {
console. log ( '服务器已启动,端口号: 3000' ) ;
} ) ;
在上面的例子中,我们定义了一个 GET 请求的路由 /api/data
,当客户端发送 GET 请求到这个路由时,服务器将返回一个 JSON 格式的数据。
2. 前台交互
要在前台与后台进行交互,通常使用 JavaScript 来发送请求并处理响应。在浏览器端,可以使用 Fetch API 或 XMLHttpRequest 对象来实现。以下是一个使用 Fetch API 的简单示例:
fetch ( '/api/data' )
. then ( response => {
if ( ! response. ok) {
throw new Error ( '网络请求失败' ) ;
}
return response. json ( ) ;
} )
. then ( data => {
console. log ( data) ;
} )
. catch ( error => {
console. error ( '发生错误:' , error) ;
} ) ;
在这个示例中,我们向 /api/data
路由发送了一个 GET 请求,并在收到响应后处理返回的数据。
三、真实案例
我们以视频网站的【分类编辑】的页面来介来看看在项目中如何实现前台与后台的异步交互;这里涉及到的重点 内容有:
前台如何通过后台读、写数据库中的数据
前台页面中的控件事件挂接
3.1前台通过后台获取数据库中的数据
在实现前台通过后台获取数据库中的数据时,首先需要后台提供相应的数据获取方法供前台调用。在较为优良的实践中,常见的做法是将数据表进行封装,形成模型。这种模型封装可以提供一种结构化的方式来管理和操作数据库中的数据,使得后台的数据访问更加可维护和可扩展。我们以Mysql数据库为例介绍后台的方法,其中数据库链接部分请参阅前面文章,这里只在末尾给出代码以方便调试;
CREATE TABLE `video_site`.`video_categories2` (
`ID` INT NOT NULL AUTO_INCREMENT,
`CategoriesName` VARCHAR(255) NOT NULL,
PRIMARY KEY (`ID`, `CategoriesName`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC));
3.1.1 在NodeJs中提供数据表访问代码
创建Model\videoCategoryModel.js
做为视频分类的模型封装,提供对数据表的增、删、改、查功能,其代码如下:
const db = require('./dbUtils');
class VideoCategory {
constructor(data) {
this.id = data.ID;
this.categoryName = data.CategoriesName;
}
// 根据分类ID查询分类
static async findById(id) {
try {
const results = await db.query.withoutConnection('SELECT * FROM video_categories WHERE ID = ?', [id]);
if (results.length > 0) {
const categoryData = results[0];
return new VideoCategory({
id: categoryData.ID,
categoryName: categoryData.CategoriesName
});
}
} catch (err) {
console.error('Error fetching video category by ID:', err);
throw err;
}
}
// 静态方法,用于查询所有分类
static async findAll() {
try {
const results = await db.query.withoutConnection('SELECT * FROM video_categories');
return results.map(categoryData => new VideoCategory(categoryData));
} catch (err) {
console.error('Error fetching all video categories:', err);
throw err;
}
}
// 实例方法,用于保存分类到数据库
async save() {
try {
const results = await db.query.withoutConnection(
'INSERT INTO video_categories (CategoriesName) VALUES (?)',
[this.categoryName]
);
this.id = results.insertId;
} catch (err) {
console.error('Error saving video category:', err);
throw err;
}
}
}
module.exports = VideoCategory;
3.1.2 提供路由
增加routes\categories.js
文件作为视频分类的路由文件,提供数据表内容访问API接口
const express = require('express');
const router = express.Router();
const CategoryModel = require('../model/CategoryModel');
// 渲染分类维护页面,当用户切换到视频分类页面时显示分类编辑页面
router.get('/admin/categories', async (req, res) => {
try {
const categories = await CategoryModel.getAllCategories();
res.render('categories', { categories });
} catch (error) {
console.error('Error rendering categories page:', error);
res.status(500).send('Internal Server Error');
}
});
// API调用获取所有分类
router.get('/admin/categories/api/Categories', async (req, res) => {
try {
const categories = await CategoryModel.getAllCategories();
res.json(categories);
} catch (error) {
console.error('Error fetching categories:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
});
// API调用添加分类
router.post('/admin/categories/api/Categories', async (req, res) => {
try {
const { CategoriesName } = req.body;
await CategoryModel.addCategory(CategoriesName);
res.status(201).json({ message: 'Category added successfully' });
} catch (error) {
console.error('Error adding category:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
});
// API调用更新分类
router.put('/admin/categories/api/Categories/:id', async (req, res) => {
try {
const { id } = req.params;
const { CategoriesName } = req.body;
await CategoryModel.updateCategory(id, CategoriesName);
res.json({ message: 'Category updated successfully' });
} catch (error) {
console.error('Error updating category:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
});
// API调用删除分类
router.delete('/admin/categories/api/Categories/:id', async (req, res) => {
try {
const { id } = req.params;
await CategoryModel.deleteCategory(id);
res.json({ message: 'Category deleted successfully' });
} catch (error) {
console.error('Error deleting category:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
});
module.exports = router;
3.1.3 将路由添加到由表中
在App.js
文件中添加以下代码
//……其它代码
const categoriesRoutes = require('./routes/categories');
//……其它代码
app.use('/', categoriesRoutes); // 挂载分类维护页面的路由
//……其它代码
3.2前台通过后台获取数据库中的数据
3.2.1 前台页面事件说明
在页面中提供一个文本框用于增加分类时输入分类名称,一个【增加】按钮用于增加分类,以及一个表格用于显示分类数据;数据修改及删除通过表格完成;表格显示如下
ID
分类名称
操作
1
初中
删除
2
高中
删除
增加views\categories.ejs
页面,并添加相应的事件,下面就所需要事件展开说明 1 document.addEventListener
事件说明请参阅附2 2 "DOMContentLoaded"
页面加载事件,内部主要实现:
挂接submit
事件,用于添加新分类;
定义window.deleteCategory
删除分类方法,用于挂接在表格中的删除按钮单击事件;
定义fetchCategories()
用于加载所有分类; 以上三个方法放到【"DOMContentLoaded"
】是为保证事件挂接成功,避免某些情况下因页面未完全加载完毕所挂接的控件未定义从而造成的挂接失败;
3 function createTableRow(category)
用于创建表格的方法; 4 async function validateAndUpdateCategory(element, id)
用于在表格中修改分类名称响应函数; 在创建表格时 ${category.CategoriesName}
时,指定了单元修输入后的响应函数; 5 async function updateCategory(id, newName)
用于修改分类名称后调用相应的后台API
3.2.1 前台页面代码细节说明
在categoryForm.addEventListener('submit'
页面提交事件中event.preventDefault()
用于阻止页面的默认提交事件,这样我们才能机会对用户输入内容进行验证,并根据验证结果决定处理动作;
单元格默认是不能编辑的,通过设置contenteditable="true"
至使单元可以编辑。
在增加分类后,这里直接重新加载了页面,若不想重新加载整个页面,可参见单元格编辑响应事件修改此处代码;
3.3 views\categories.ejs
代码如下:
课程分类管理
ID
分类名称? 分类名称不能包含以下字符:\ / : * ? " < > |,长度不能超过255个字符
操作
4. 结论
通过 Express 框架,我们可以轻松地实现前后端之间的数据交互。在后台,通过定义路由来处理来自客户端的请求;在前台,通过 JavaScript 来发送请求并处理响应。这种前后端交互的方式使得我们能够构建功能丰富、动态的 Web 应用程序。
附
1 数据库链接代码
文件名Model\dbUtils.js
,代码如下
const mysql = require('mysql');
// 创建数据库连接池
const pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: '数据库用户名',
password: '数据库密码',
database: 'video_site', //使用的数据库名
debug: false // 开启调试模式,会输出详细的 SQL 执行日志
});
// 获取数据库连接的方法
const getDBConnection = () => {
return new Promise((resolve, reject) => {
pool.getConnection((error, connection) => {
if (error) {
reject(error);
} else {
resolve(connection);
}
});
});
};
// 执行查询的方法(重载1:带 connection 参数)
const query = {
// 当调用者已经拥有连接时使用的查询方法
withConnection: (connection, sql, params) => {
return new Promise((resolve, reject) => {
connection.query(sql, params, (error, results, fields) => {
if (error) {
reject(error);
} else {
resolve(results);
}
});
});
},
// 当调用者没有连接时使用的查询方法,这个方法会负责获取和释放连接
withoutConnection: async (sql, params) => {
let connection;
try {
connection = await getDBConnection();
const results = await query.withConnection(connection, sql, params);
return results;
} catch (error) {
throw error;
} finally {
if (connection) {
connection.release();
}
}
}
};
module.exports = {
getDBConnection,
query
};
2 document.addEventListener说明
document.addEventListener
是 JavaScript 中用于添加事件监听器的方法之一。它允许开发者在特定的文档对象上监听各种类型的事件,比如鼠标点击、键盘按下、页面加载完成等,以便在事件发生时执行相应的操作。
使用方法
document. addEventListener ( event, function , useCapture) ;
event
: 要监听的事件类型,比如 “click”、“keydown”、“load” 等。
function
: 事件发生时要执行的函数,也称为事件处理程序。
useCapture
(可选): 一个布尔值,表示事件是在捕获阶段(true
)还是冒泡阶段(false
)触发事件处理程序。默认为 false
。
示例
document. addEventListener ( 'click' , function ( event ) {
console. log ( '点击了文档' ) ;
} ) ;
document. addEventListener ( 'keydown' , function ( event ) {
console. log ( '按下了键盘键:' , event. key) ;
} ) ;
在这个示例中,我们分别监听了文档的点击事件和键盘按键事件。当用户点击文档时,会在控制台输出 “点击了文档”;当用户按下键盘时,会在控制台输出相应的按键值。
优势
多事件处理 : 可以同时监听多个不同类型的事件,而不需要像传统的 onclick
或 onkeydown
一样,将事件处理程序直接赋值给特定的属性。
灵活性 : 可以使用匿名函数或命名函数作为事件处理程序,使代码更加模块化和可维护。
事件委托 : 可以利用事件冒泡机制,在父元素上添加一个事件监听器,来代理处理子元素的事件,提高性能和代码简洁度。
总之,document.addEventListener
是 JavaScript 中一种强大的事件处理机制,它为开发者提供了一种灵活、高效的方式来处理各种类型的事件。
你可能感兴趣的:(NodeJs,入门,交互,node.js,express,mysql,数据库)
解锁网页交互利器:深入浅出 AJAX,用 JavaScript 与后端服务器对话,局部请求刷新数据
微特尔普拉斯
ajax javascript ajax 前端 javascript
在当今互联网时代,网页早已不再是静态的信息展示平台,而是充满动态交互的应用体验场。而实现这种流畅交互体验的关键技术之一,便是AJAX(AsynchronousJavaScriptandXML)。它允许网页在后台悄无声息地与服务器交换数据,无需刷新整个页面,便可实现内容的动态更新,为用户带来行云流水般的操作体验。在AJAX出现之前,网页开发采用的是前后端不分离的模式。前端开发者编写好HTML和CSS
写一个图片裁剪的js,JavaScript图片裁剪插件PlusCropper
微特尔普拉斯
javascript node vue javascript 开发语言 ecmascript
在前端开发中,图片裁剪是一个常见的需求。本文将深入解析一个功能完善的JavaScript图片裁剪插件——PlusCropper,带你一步步了解其实现原理和使用方法。一、插件概述PlusCropper是一个轻量级的JavaScript插件,它允许用户在网页上交互式地裁剪图片。它提供了以下功能:可拖拽和缩放的裁剪框:用户可以通过鼠标或触摸操作来调整裁剪区域的大小和位置。图片旋转:支持图片的顺时针和逆时
数据库datetime时间前端显示格式化
微特尔普拉斯
java javascript jquery 数据库datetime 时间格式转换
后台查询数据库返回的这种时间格式2019-04-24T02:30:00.000+0000第一种方法:vartime="2019-11-04T08:04:52.000+0000";vard=newDate(time);vartimes=d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()+''+d.getHours()+':'+d.getMinut
导购返利系统的分布式事务管理
wx_tangjinjinwx
分布式
导购返利系统的分布式事务管理大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨导购返利系统中的分布式事务管理。随着系统的分布式架构越来越普遍,如何有效地管理分布式事务成为了一个关键问题。本文将详细介绍如何在Java应用中实现分布式事务管理,并提供相应的代码示例。1.分布式事务的挑战在分布式系统中,事务通常涉及多个服务或数据库,这给事务的一致性和可靠性带
返利机器人在导购电商平台中的集成与应用
微赚淘客系统@聚娃科技
机器人 microsoft
返利机器人在导购电商平台中的集成与应用大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何将返利机器人集成到导购电商平台中,以及其在实际应用中的具体实现。这包括从用户交互到数据处理,最终实现返利推荐和通知。1.返利机器人的功能概述返利机器人通常具备以下功能:用户交互:与用户进行对话,提供返利信息。数据获取:从电商平台获取最新的返利数据。数据处理:
mysql:表的约束(空属性,默认值,comment,zerofill,主键,唯一键,外键)
不会编程的阿成
数据库
目录表的约束空属性默认值(defualut)comment:列描述zerofill:显示约束主键自增长:auto_increment唯一键外键查询数据表的约束真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。表的约束有很多,这里主要介绍如下几个:null/notnull,defa
Navicat 15.x for MySQL最新版注册码破解激活教程
张先森丫
一、准备工作:破解注册步骤并不难,请耐心看完!1.下载Navicat15.xforMySQL官网下载地址:http://www.navicat.com.cn/download/navicat-premium2.下载注册机链接:https://pan.baidu.com/s/1-FHd7b7NveohwSKuxd-jzQ提取码:zxsY二、开始激活操作:1.将下载好的注册机压缩包复制到Navicat
详解TCP的三次握手
汪先声
tcp/ip 网络协议 网络
TCP(三次握手)是指在建立一个可靠的传输控制协议(TCP)连接时,客户端和服务器之间的三步交互过程。这个过程的主要目的是确保连接是可靠的、双方的发送与接收能力是正常的,并且可以开始数据传输。下面是对每个步骤的详细解释:1.第一次握手:客户端发送SYN过程:客户端(A)向服务器(B)发送一个同步报文段(SYN,SynchronizeSequenceNumber),表示它想要与服务器建立连接。目的:
MongoDB Atlas与LangChain集成指南
afTFODguAKBF
mongodb langchain 数据库 python
引言MongoDBAtlas是一款全托管的云数据库解决方案,可在AWS、Azure和GCP上使用。最新版本支持在MongoDB文档数据上进行原生向量搜索。本文将介绍如何使用LangChain将MongoDBAtlas与语言模型集成,以实现高效的向量搜索和语义缓存。安装和设置1.安装langchain-mongodb包pipinstalllangchain-mongodb向量存储LangChain提
mybatis支持json,Spring boot配置
Knight_9
mysql5.7版本以后支持原生json格式,基于Springboot进行配置说明。mybatis支持mysql的json格式mysql-connector,mysql的驱动版本要大于等于5.1.40,否则json字段查询会发生乱码。继承BaseTypeHandler自定义一个json类型处理器,放到一个handler包下,例:packagecom.c.config.handler;importc
利用Leaflet.js创建交互式地图:绘制固定尺寸的长方形
小金子J
前端框架 WebGIS javascript 开发语言 ecmascript 前端框架 信息可视化
在现代Web开发中,交互式地图已成为展示地理位置数据的重要工具。Leaflet.js是一个轻量级、功能丰富的开源JavaScript库,用于构建移动友好的交互式地图。在本文中,我们将探讨如何利用Leaflet.js在地图上绘制一个固定尺寸的长方形,扩展我们之前实现的单个多边形绘制功能。背景我们已经实现了一个功能,允许用户在地图上绘制任意形状的多边形。现在,我们希望在此基础上增加一个新功能:用户可以
怎么做好一个合格的芯片采购员——入门篇
林大数据
做采购的心累程度不低于一个业务员,这个想必各位做过芯片采购的同仁一定深有同感,为啥这么说呢?很多人以为采购就是等着经销商把货上上门,还要他们把你喂饱饱,你才会屈尊降贵地定他们的货。对于其他传统行业来说,确实是如此,但是对于芯片行业来说,一个合格采购员对公司来说,有着不可替代性,荣誉越大责任越大。因为芯片采购里面大大小小的坑实在太多,外行人根本想不到。假货防不胜防,翻新货怎么区分,谈好的价格一下午就
反思的魔力:用语言的力量强化AI智能体
步子哥
人工智能 机器学习
在浩瀚的代码海洋中,AI智能体就像初出茅庐的航海家,渴望探索未知的宝藏。然而,面对复杂的编程任务,他们常常迷失方向。今天,就让我们跟随“反思”的灯塔,见证AI智能体如何通过语言的力量,点亮智慧的明灯,成为代码世界的征服者!智能体的困境近年来,大型语言模型(LLM)在与外部环境(如游戏、编译器、API)交互的领域中大放异彩,化身为目标驱动的智能体。然而,传统的强化学习方法如同一位严苛的训练师,需要大
微信小程序集成前端日志库
人工智能的苟富贵
前端小程序 微信小程序 前端
在微信小程序内接入日志库的记录在开发微信小程序时,为了更好地调试和维护代码,通常需要记录日志信息。我尝试了多种日志库,包括Winston、pion和loglevel,并最终选择了loglevel作为日志库,并实现了日志上传到服务器的功能。本文详细记录了这一过程,以供参考。使用Winston失败最初,我尝试在微信小程序中使用Winston日志库。然而,Winston依赖Node.js的部分核心模块(
【Java】Mybatis Druid连接池配置详细
beautiful_huang
Java
pom.xmlcom.alibabadruid1.0.18.propertiesspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatis2?characterEncoding=utf-8&useSSL=truespring.da
数据库管理的利器Navicat —— 全面测评与热门产品推荐
界面开发小八哥
数据库 Navicat 数据库开发 sql mysql
在数据库管理领域,Navicat无疑是一款深受欢迎的软件。作为一个强大的数据库管理和开发工具,它支持多种数据库类型,包括MySQL、MariaDB、MongoDB、SQLServer、Oracle、PostgreSQL等。本文将全面测评Navicat的核心功能,同时推荐几款热门的Navicat产品。Navicat的主要特点1.跨平台支持:Navicat支持Windows、Mac和Linux平台,可
DevExpress WPF中文教程:如何解决排序、过滤遇到的常见问题?(一)
界面开发小八哥
wpf devexpress 界面控件 UI开发
DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心的商业智能产品,都能通过DevExpressWPF控件来实现。接下来将介绍如何解决DevExpre
通过DBeaver连接Phoenix操作hbase
不想做咸鱼的王富贵
通过DBeaver连接Phoenix操作hbase前言本文介绍常用一种通用数据库工具Dbeaver,DBeaver可通过JDBC连接到数据库,可以支持几乎所有的数据库产品,包括:MySQL、PostgreSQL、MariaDB、SQLite、Oracle、Db2、SQLServer、Sybase、MSAccess、Teradata、Firebird、Derby等等。商业版本更是可以支持各种NoSQ
5分钟熟练上手ES的具体使用
佚名涙
elasticsearch jenkins 大数据 学习
5分钟上手ES的具体使用相信有很多同学想要去学习elk时会使用docker等一些方式去下载相关程序,但提到真正去使用es的一系列操作时又会知之甚少。于是这一篇博客应运而生。本文就以下载好elk/efk系统后应该如何去使用为例,介绍es的具体操作。es关键字基本概念索引(Index):类似于关系型数据库中的“数据库”,是数据存储的容器。文档(Document):类似于关系型数据库中的“行”,是JSO
DevExpress WPF中文教程:如何解决排序、过滤遇到的常见问题?(二)
界面开发小八哥
wpf devexpress 界面控件 UI开发 .net
DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心的商业智能产品,都能通过DevExpressWPF控件来实现。接下来将介绍如何解决DevExpre
不会PS,教你设计出高大上的平面设计图!
mindmap
平面设计是一项有挑战的技术,之前只能用PS软件来做,会有一定的准入门槛。但随着各种软件的冒出,现在做平面设计不像之前那么苦难。这里推荐们推荐一款超简单的零门槛在线平面设计工具,帮助你轻松完成平面设计!菲果设计,一款全新发布的在线平面设计工具。拥有它之后,没有任何绘图基础的小白只需5分钟时间,即可打造出一幅专业的平面作品。现在,揭开面纱,细数菲果设计工具的六大特点,我们一起来了解下吧!一、6大场景,
javaweb基于ssm框架学生信息管理(成绩)系统设计与实现
ancen_73bd
开发平台、开发工具、应用服务器的介绍开发平台:Windows开发工具:idea+mySql应用服务器:ApacheTomcat8.0学生成绩管理系统主要用于学校学生成绩信息管理,能实现学生、老师、院系、班级、课程的增删改查操作,同时学生能进行选课和退课操作,老师能对学生的成绩录入和修改操作。系统流程图功能结构图部分截图免费源码获得:扫码关注微信公众号:ancenok,然后回复:013
感恩日记0103-0513
糊糊陪你瑜伽
一.每日精进:1.学习:《瑜伽之道》2.健身:《艾扬格瑜伽入门教程》第九周第二轮第7遍3.陪家人:今天是打拳日,对打的小哥哥出手很准,悟空也很抗打4.帮朋友:在直播间带大家练习;5.投资:每日定投box二.每日感恩:感恩sssb,所有伟大的传承上师们;感恩爸妈准备午餐,妈下午帮忙接悟空带他去上课;感谢二组给力的组委们,大家齐心协力,打了漂亮杖;感谢团长马倩总能在需要时答疑解惑,还开课组委会,优秀的
asp.net core的入门教学
21软件外包1班-庞兴南
asp.net 后端
什么是ASP.NETCoreasp.netcore是一个基于HTML和ASP的动态Web开发框架,主要用于web应用程序的开发。它是一个轻量级框架,使用HTML、ASP、CSS、JavaScript等技术。它易于使用和部署,可以快速构建web应用程序。asp.netcore提供了丰富的功能,包括模板引擎、文件解析、数据处理和用户管理等。本文将介绍asp.netcore的主要功能和特点,并提供使用方
TCP实现FTP功能
学不会のC
tcp/ip linux c语言 网络 网络协议
文件传输协议(FileTransferProtocol,FTP)是一种在网络中进行文件传输的广泛使用的标准协议。作为网络通信中的基础工具,FTP允许用户通过客户端软件与服务器进行交互,实现文件的上传、下载和其他文件操作。FTP工作在OSI模型的应用层,通常使用TCP作为其传输协议,确保数据传输的可靠性和顺序性。项目要求有服务器和客户端代码,基于TCP写的。在同一路径下,将客户端可执行代码复制到其他
命令行工具部署达梦数据库 DMDPC(BP 多副本架构)
百代繁华一朝都-绮罗生
数据库 架构 网络
解达梦数据库DPC集群的主要使用场景:DMDPC关注和解决的是大数据、计算与存储分离、高可用、支持全部的SQL标准、拥有完整的事务处理能力和集群规模能够动态伸缩的业务场景:大量的复杂查询操作要求优化器能够生成优良的执行计划,并且执行引擎能够充分利用多机器、多核的硬件资源某些行业对数据一致性和多副本备份容灾有较高要求,同时希望维护成本足够低和故障恢复时间足够短;用户的业务规模有峰值,要求所需的机器资
6.1 ASP.NET Core Web 入门
步、步、为营
.Net Core asp.net mvc
6.1ASP.NETCoreWeb入门ASP.NETCore中,严格来讲只有一个Asp.netCoreMVC一个框架,Asp.netCoreMVC既支持基于视图的MVC开发,也支持WebAPI和RazorPages开发。ASP.NETCoreMVC项目在VS2022中,一定选择ASP.NETCoreWeb应用(模型-视图-控制器)项目模板项目中wwwroot文件夹包含图片、JS、CSS等静态文件,
DMDPC安装部署
丷月亮是指路牌
数据库
1.DMDPC架构DMDPC架构由计划生成节点SP、数据存储节点BP和元数据服务器节点MP三部分组成:1、SP对外提供分布式数据库服务,用户可以登录到任意一个SP节点,获得完整的数据库服务;2、BP负责存储数据,执行SP的调度指令并将执行结果返回给SP;3、MP负责存储元数据并向SP、BP提供元数据服务。本文是在1台Linux虚拟机上通过创建四个实例的方式进行集群搭建.2.DMDPC集群规划DMD
Linux+Nginx+Asp.net Core及守护进程部署
念童
linux nginx asp.net 运维 服务器
上篇《Docker基础入门及示例》文章介绍了Docker部署,以及相关.netcore的打包示例。这篇文章我将以oss.offical.site站点为例,主要介绍下在linux机器下完整的部署流程,.netcore在docker容器中的运行已经介绍,这里.netcore运行环境我会介绍直接在linux运行的场景,内容主要包含以下几个部分:1.基础工具和Linux环境准备2..NetCore环境安装
mysql row_number吗_MySQL中的ROW_NUMBER()是什么?
春容
mysql row_number吗
MySQL版本8.0中包含的Row_NUMBER()。这是一种窗口函数。这可用于为行分配序列号。要了解,请借助CREATEpcommand创建一个表-建立表格CREATEtablerowNumberDemo->(->FirstNamevarchar(100)->);插入记录INSERTintorowNumberDemovalues('john');INSERTintorowNumberDemova
解读Servlet原理篇二---GenericServlet与HttpServlet
周凡杨
java HttpServlet 源理 GenericService 源码
在上一篇《解读Servlet原理篇一》中提到,要实现javax.servlet.Servlet接口(即写自己的Servlet应用),你可以写一个继承自javax.servlet.GenericServletr的generic Servlet ,也可以写一个继承自java.servlet.http.HttpServlet的HTTP Servlet(这就是为什么我们自定义的Servlet通常是exte
MySQL性能优化
bijian1013
数据库 mysql
性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间。性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等。本文介绍方法的主要有:
a.优化查询
b.优化数据库结构
ThreadPool定时重试
dai_lm
java ThreadPool thread timer timertask
项目需要当某事件触发时,执行http请求任务,失败时需要有重试机制,并根据失败次数的增加,重试间隔也相应增加,任务可能并发。
由于是耗时任务,首先考虑的就是用线程来实现,并且为了节约资源,因而选择线程池。
为了解决不定间隔的重试,选择Timer和TimerTask来完成
package threadpool;
public class ThreadPoolTest {
Oracle 查看数据库的连接情况
周凡杨
sql oracle 连接
首先要说的是,不同版本数据库提供的系统表会有不同,你可以根据数据字典查看该版本数据库所提供的表。
select * from dict where table_name like '%SESSION%';
就可以查出一些表,然后根据这些表就可以获得会话信息
select sid,serial#,status,username,schemaname,osuser,terminal,ma
类的继承
朱辉辉33
java
类的继承可以提高代码的重用行,减少冗余代码;还能提高代码的扩展性。Java继承的关键字是extends
格式:public class 类名(子类)extends 类名(父类){ }
子类可以继承到父类所有的属性和普通方法,但不能继承构造方法。且子类可以直接使用父类的public和
protected属性,但要使用private属性仍需通过调用。
子类的方法可以重写,但必须和父类的返回值类
android 悬浮窗特效
肆无忌惮_
android
最近在开发项目的时候需要做一个悬浮层的动画,类似于支付宝掉钱动画。但是区别在于,需求是浮出一个窗口,之后边缩放边位移至屏幕右下角标签处。效果图如下:
一开始考虑用自定义View来做。后来发现开线程让其移动很卡,ListView+动画也没法精确定位到目标点。
后来想利用Dialog的dismiss动画来完成。
自定义一个Dialog后,在styl
hadoop伪分布式搭建
林鹤霄
hadoop
要修改4个文件 1: vim hadoop-env.sh 第九行 2: vim core-site.xml <configuration> &n
gdb调试命令
aigo
gdb
原文:http://blog.csdn.net/hanchaoman/article/details/5517362
一、GDB常用命令简介
r run 运行.程序还没有运行前使用 c cuntinue 
Socket编程的HelloWorld实例
alleni123
socket
public class Client
{
public static void main(String[] args)
{
Client c=new Client();
c.receiveMessage();
}
public void receiveMessage(){
Socket s=null;
BufferedRea
线程同步和异步
百合不是茶
线程同步 异步
多线程和同步 : 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法
多线程和异步:多线程可以做不同的事情,涉及到线程通知
&
JSP中文乱码分析
bijian1013
java jsp 中文乱码
在JSP的开发过程中,经常出现中文乱码的问题。
首先了解一下Java中文问题的由来:
Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,
js实现页面跳转重定向的几种方式
bijian1013
JavaScript 重定向
js实现页面跳转重定向有如下几种方式:
一.window.location.href
<script language="javascript"type="text/javascript">
window.location.href="http://www.baidu.c
【Struts2三】Struts2 Action转发类型
bit1129
struts2
在【Struts2一】 Struts Hello World http://bit1129.iteye.com/blog/2109365中配置了一个简单的Action,配置如下
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configurat
【HBase十一】Java API操作HBase
bit1129
hbase
Admin类的主要方法注释:
1. 创建表
/**
* Creates a new table. Synchronous operation.
*
* @param desc table descriptor for table
* @throws IllegalArgumentException if the table name is res
nginx gzip
ronin47
nginx gzip
Nginx GZip 压缩
Nginx GZip 模块文档详见:http://wiki.nginx.org/HttpGzipModule
常用配置片段如下:
gzip on; gzip_comp_level 2; # 压缩比例,比例越大,压缩时间越长。默认是1 gzip_types text/css text/javascript; # 哪些文件可以被压缩 gzip_disable &q
java-7.微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如 h1 , h2 ,判断这俩个链表是否相交
bylijinnan
java
public class LinkListTest {
/**
* we deal with two main missions:
*
* A.
* 1.we create two joined-List(both have no loop)
* 2.whether list1 and list2 join
* 3.print the join
Spring源码学习-JdbcTemplate batchUpdate批量操作
bylijinnan
java spring
Spring JdbcTemplate的batch操作最后还是利用了JDBC提供的方法,Spring只是做了一下改造和封装
JDBC的batch操作:
String sql = "INSERT INTO CUSTOMER " +
"(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
[JWFD开源工作流]大规模拓扑矩阵存储结构最新进展
comsci
工作流
生成和创建类已经完成,构造一个100万个元素的矩阵模型,存储空间只有11M大,请大家参考我在博客园上面的文档"构造下一代工作流存储结构的尝试",更加相信的设计和代码将陆续推出.........
竞争对手的能力也很强.......,我相信..你们一定能够先于我们推出大规模拓扑扫描和分析系统的....
base64编码和url编码
cuityang
base64 url
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
web应用集群Session保持
dalan_123
session
关于使用 memcached 或redis 存储 session ,以及使用 terracotta 服务器共享。建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,一举几得啊。1、使用 filter 方法存储这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简
Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
dcj3sjt126com
数据库
public function getMinLimit () { $sql = "..."; $result = yii::app()->db->createCo
solr StatsComponent(聚合统计)
eksliang
solr聚合查询 solr stats
StatsComponent
转载请出自出处:http://eksliang.iteye.com/blog/2169134
http://eksliang.iteye.com/ 一、概述
Solr可以利用StatsComponent 实现数据库的聚合统计查询,也就是min、max、avg、count、sum的功能
二、参数
百度一道面试题
greemranqq
位运算 百度面试 寻找奇数算法 bitmap 算法
那天看朋友提了一个百度面试的题目:怎么找出{1,1,2,3,3,4,4,4,5,5,5,5} 找出出现次数为奇数的数字.
我这里复制的是原话,当然顺序是不一定的,很多拿到题目第一反应就是用map,当然可以解决,但是效率不高。
还有人觉得应该用算法xxx,我是没想到用啥算法好...!
还有觉得应该先排序...
还有觉
Spring之在开发中使用SpringJDBC
ihuning
spring
在实际开发中使用SpringJDBC有两种方式:
1. 在Dao中添加属性JdbcTemplate并用Spring注入;
JdbcTemplate类被设计成为线程安全的,所以可以在IOC 容器中声明它的单个实例,并将这个实例注入到所有的 DAO 实例中。JdbcTemplate也利用了Java 1.5 的特定(自动装箱,泛型,可变长度
JSON API 1.0 核心开发者自述 | 你所不知道的那些技术细节
justjavac
json
2013年5月,Yehuda Katz 完成了JSON API(英文,中文) 技术规范的初稿。事情就发生在 RailsConf 之后,在那次会议上他和 Steve Klabnik 就 JSON 雏形的技术细节相聊甚欢。在沟通单一 Rails 服务器库—— ActiveModel::Serializers 和单一 JavaScript 客户端库——&
网站项目建设流程概述
macroli
工作
一.概念
网站项目管理就是根据特定的规范、在预算范围内、按时完成的网站开发任务。
二.需求分析
项目立项
我们接到客户的业务咨询,经过双方不断的接洽和了解,并通过基本的可行性讨论够,初步达成制作协议,这时就需要将项目立项。较好的做法是成立一个专门的项目小组,小组成员包括:项目经理,网页设计,程序员,测试员,编辑/文档等必须人员。项目实行项目经理制。
客户的需求说明书
第一步是需
AngularJs 三目运算 表达式判断
qiaolevip
每天进步一点点 学习永无止境 众观千象 AngularJS
事件回顾:由于需要修改同一个模板,里面包含2个不同的内容,第一个里面使用的时间差和第二个里面名称不一样,其他过滤器,内容都大同小异。希望杜绝If这样比较傻的来判断if-show or not,继续追究其源码。
var b = "{{",
a = "}}";
this.startSymbol = function(a) {
Spark算子:统计RDD分区中的元素及数量
superlxw1234
spark spark算子 Spark RDD分区元素
关键字:Spark算子、Spark RDD分区、Spark RDD分区元素数量
Spark RDD是被分区的,在生成RDD时候,一般可以指定分区的数量,如果不指定分区数量,当RDD从集合创建时候,则默认为该程序所分配到的资源的CPU核数,如果是从HDFS文件创建,默认为文件的Block数。
可以利用RDD的mapPartitionsWithInd
Spring 3.2.x将于2016年12月31日停止支持
wiselyman
Spring 3
Spring 团队公布在2016年12月31日停止对Spring Framework 3.2.x(包含tomcat 6.x)的支持。在此之前spring团队将持续发布3.2.x的维护版本。
请大家及时准备及时升级到Spring
fis纯前端解决方案fis-pure
zccst
JavaScript
作者:zccst
FIS通过插件扩展可以完美的支持模块化的前端开发方案,我们通过FIS的二次封装能力,封装了一个功能完备的纯前端模块化方案pure。
1,fis-pure的安装
$ fis install -g fis-pure
$ pure -v
0.1.4
2,下载demo到本地
git clone https://github.com/hefangshi/f