java-mysql 三层架构
在 Java 应用程序中,三层架构(Three-Tier Architecture)是一种常见的设计模式,用于分离应用程序的表示层、业务逻辑层和数据访问层。这种架构有助于提高代码的可维护性、可扩展性和可重用性。以下是详细解释 Java 应用程序中使用 MySQL 的三层架构:
### 一、三层架构简介
1. **表示层(Presentation Layer)**:
- 负责与用户交互,包括用户界面(UI)的展示和用户输入的处理。
- 通常包含 JSP、Servlet 或其他前端技术(如 Thymeleaf、Angular、React 等)。
2. **业务逻辑层(Business Logic Layer)**:
- 处理应用程序的业务逻辑,执行具体的业务操作。
- 通常包含服务类(Service)、业务对象(BO)等。
3. **数据访问层(Data Access Layer)**:
- 负责与数据库进行交互,执行数据的持久化操作。
- 通常包含数据访问对象(DAO)类。
### 二、示例应用程序
假设我们有一个简单的应用程序,用于管理用户信息,包括用户的 `id` 和 `name`。以下是使用 MySQL 的三层架构示例。
#### 1. 数据库表
首先,创建一个 MySQL 数据库表 `users`:
```sql
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
```
#### 2. 数据访问层(DAO)
定义一个数据访问对象(DAO)类,用于与数据库进行交互。
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class UserDAO {
private String jdbcURL = "jdbc:mysql://localhost:3306/testdb";
private String jdbcUsername = "root";
private String jdbcPassword = "yourpassword";
private static final String INSERT_USERS_SQL = "INSERT INTO users (name) VALUES (?);";
private static final String SELECT_USER_BY_ID = "SELECT id, name FROM users WHERE id = ?";
private static final String SELECT_ALL_USERS = "SELECT * FROM users";
private static final String DELETE_USER_SQL = "DELETE FROM users WHERE id = ?;";
private static final String UPDATE_USER_SQL = "UPDATE users SET name = ? WHERE id = ?;";
protected Connection getConnection() {
Connection connection = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
return connection;
}
public void insertUser(User user) throws SQLException {
try (Connection connection = getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(INSERT_USERS_SQL)) {
preparedStatement.setString(1, user.getName());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public User selectUser(int id) {
User user = null;
try (Connection connection = getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(SELECT_USER_BY_ID)) {
preparedStatement.setInt(1, id);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
String name = rs.getString("name");
user = new User(id, name);
}
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
public List<User> selectAllUsers() {
List<User> users = new ArrayList<>();
try (Connection connection = getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(SELECT_ALL_USERS)) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
users.add(new User(id, name));
}
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}
public boolean deleteUser(int id) throws SQLException {
boolean rowDeleted;
try (Connection connection = getConnection();
PreparedStatement statement = connection.prepareStatement(DELETE_USER_SQL)) {
statement.setInt(1, id);
rowDeleted = statement.executeUpdate() > 0;
}
return rowDeleted;
}
public boolean updateUser(User user) throws SQLException {
boolean rowUpdated;
try (Connection connection = getConnection();
PreparedStatement statement = connection.prepareStatement(UPDATE_USER_SQL)) {
statement.setString(1, user.getName());
statement.setInt(2, user.getId());
rowUpdated = statement.executeUpdate() > 0;
}
return rowUpdated;
}
}
```
#### 3. 业务逻辑层(Service)
定义一个服务类,处理应用程序的业务逻辑。
```java
import java.sql.SQLException;
import java.util.List;
public class UserService {
private UserDAO userDAO;
public UserService() {
userDAO = new UserDAO();
}
public void addUser(User user) {
try {
userDAO.insertUser(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
public User getUser(int id) {
return userDAO.selectUser(id);
}
public List<User> getAllUsers() {
return userDAO.selectAllUsers();
}
public void updateUser(User user) {
try {
userDAO.updateUser(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void deleteUser(int id) {
try {
userDAO.deleteUser(id);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
#### 4. 表示层(Servlet)
使用 Servlet 处理用户请求和响应。
```java
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
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("/")
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserService userService;
public void init() {
userService = new UserService();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getServletPath();
try {
switch (action) {
case "/new":
showNewForm(request, response);
break;
case "/insert":
insertUser(request, response);
break;
case "/delete":
deleteUser(request, response);
break;
case "/edit":
showEditForm(request, response);
break;
case "/update":
updateUser(request, response);
break;
default:
listUser(request, response);
break;
}
} catch (SQLException ex) {
throw new ServletException(ex);
}
}
private void listUser(HttpServletRequest request, HttpServletResponse response)
throws SQLException, IOException, ServletException {
List<User> listUser = userService.getAllUsers();
request.setAttribute("listUser", listUser);
RequestDispatcher dispatcher = request.getRequestDispatcher("user-list.jsp");
dispatcher.forward(request, response);
}
private void showNewForm(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher("user-form.jsp");
dispatcher.forward(request, response);
}
private void showEditForm(HttpServletRequest request, HttpServletResponse response)
throws SQLException, ServletException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
User existingUser = userService.getUser(id);
RequestDispatcher dispatcher = request.getRequestDispatcher("user-form.jsp");
request.setAttribute("user", existingUser);
dispatcher.forward(request, response);
}
private void insertUser(HttpServletRequest request, HttpServletResponse response)
throws SQLException, IOException {
String name = request.getParameter("name");
User newUser = new User(name);
userService.addUser(newUser);
response.sendRedirect("list");
}
private void updateUser(HttpServletRequest request, HttpServletResponse response)
throws SQLException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
User user = new User(id, name);
userService.updateUser(user);
response.sendRedirect("list");
}
private void deleteUser(HttpServletRequest request, HttpServletResponse response)
throws SQLException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
userService.deleteUser(id);
response.sendRedirect("list");
}
}
```
#### 5. 用户实体类(User)
定义一个用户实体类,表示数据库表 `users` 中的记录。
```java
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public User(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
#### 6. JSP 页面
定义两个 JSP 页面:一个用于显示用户列表,另一个用于用户表单。
**user-list.jsp**:
```jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>User List</title>
</head>
<body>
<h2>User List</h2>
<a href="new">Add New User</a>
<table border="1">
<tr>
<th>ID</th>
<th>Name</th>
<th>Actions</th>
</tr>
<c:forEach var="user" items="${listUser}">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>
<a href="edit?id=${user.id}">Edit</a>
<a href="delete?id=${user.id}">Delete</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
java-mysql 三层架构
在 Java 应用程序中,三层架构(Three-Tier Architecture)是一种常见的设计模式,用于分离应用程序的表示层、业务逻辑层和数据访问层。这种架构有助于提高代码的可维护性、可扩展性和可重用性。以下是详细解释 Java 应用程序中使用 …...
![](https://www.ngui.cc/images/no-images.jpg)
打工人如何应对AI对工作岗位的风险
面对AI对工作岗位的潜在取代,我们可以从多个层面制定应对策略,以确保劳动力市场的平稳过渡和社会的可持续发展。以下是一些具体的应对策略: 一、加强教育与培训 提升STEM教育:增加科学、技术、工程和数学(STEM&#…...
![](https://i-blog.csdnimg.cn/direct/afd5cc002d0540dcaf1675221ff82b14.png)
C++:从C语言过渡到C++
在这篇博客中,我将会介绍从C语言过渡到C的一些基础知识。 目录 C起源 C的关键字 输出hello,world 编辑 命名空间 1.什么是命名空间 2.namespace的作用 3.域作用限定符 4.命名空间的使用 IO流 缺省参数 函数重载 引用 1.引用的定义 2.引…...
![](https://www.ngui.cc/images/no-images.jpg)
在安卓中使用FFmpeg录制摄像头的视频并保存到本地MP4文件
在移动应用开发中,有时需要利用设备的摄像头录制视频,并且希望在录制过程中能够精确控制视频的质量、格式和时长。FFmpeg作为一个强大的多媒体处理工具,提供了广泛的功能和选项,能够帮助我们实现这样的需求。 添加依赖 在安卓平台…...
![](https://i-blog.csdnimg.cn/direct/c5da5fff2816463981af4698a2cb53ad.gif)
Vue从零到实战第一天
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
![](https://img-blog.csdnimg.cn/direct/3a3173fc7c7646fb962d29ef4163637c.png)
BUUCTF - Basic
文章目录 1. Linux Labs 【SSH连接漏洞】2. BUU LFI COURSE【文件包含漏洞】3. BUU BRUTE【暴力破解用户名密码】4. BUU SQL COURSE【SQL注入-当前数据库】5. Upload-Labs-Linux 1【文件上传漏洞】7. Buu Upload Course 1【文件上传包含漏洞】8. sqli-labs 1【SQL注入-服务器上…...
![](https://www.ngui.cc/images/no-images.jpg)
如何理解Node.js?NPM?Yarn?Vue?React?
一、背景 对后端技术栈更熟悉,对前端技术栈不了解,希望通过前后端的技术栈进行对比,可以更直观地了解前端技术栈。 二、Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行环境。它使得 JavaScript 可以在服务器端运…...
![](https://img-blog.csdnimg.cn/img_convert/b24da1bb2028a048bd669714bad6c435.jpeg)
苹果入局,AI手机或将实现“真智能”?
【潮汐商业评论/原创】 “AI应用智能手机不就是现在的AI手机。” 当被问到现阶段对AI手机的看法时,John如是说。“术业有专攻,那么多APP在做AI功能,下载用就是了,也用不着现在换个AI手机啊。” 对于AI手机,或许大多…...
![](https://i-blog.csdnimg.cn/direct/33c6feb29ad040c2843413d4791964f4.png)
AI网络爬虫019:搜狗图片的时间戳反爬虫应对策略
文章目录 一、介绍二、输入内容三、输出内容一、介绍 如何批量爬取下载搜狗图片搜索结果页面的图片?以孙允珠这个关键词的搜索结果为例: https://pic.sogou.com/pics? 翻页规律如下: https://pic.sogou.com/napi/pc/searchList?mode=2&start=384&xml_len=48&am…...
Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)
当 Windows 网络出现本机故障时,一般从以下两个方面解决:网络栈和使用网络栈的组件或程序。 1、Winsock 组件问题 以管理身份运行 cmd,输入以下命令 netsh winsock reset重置 Winsock 组件以修复网络连接问题。 Winsock 是 Windows 操作系…...
![](https://img-blog.csdnimg.cn/direct/ab386bb77e46451aa8e7ac96752a60b9.jpeg)
100 个网络基础知识普及,看完成半个网络高手!
1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层࿰…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
高盛开源的量化金融 Python 库
GS Quant GS Quant是用于量化金融的Python工具包,建立在世界上最强大的风险转移平台之一之上。旨在加速量化交易策略和风险管理解决方案的开发,凭借25年的全球市场经验精心打造。 它由高盛的定量开发人员(定量)创建和维护&#…...
![](https://www.ngui.cc/images/no-images.jpg)
【Linux】docker和docker-compose 区别是什么
Docker 和 Docker Compose 是用于容器化应用的工具,它们在开发、部署和管理容器化应用程序时有不同的作用。以下是对它们的简要介绍和功能描述: Docker 定义: Docker 是一个开源的平台,允许开发者自动化地部署、扩展和管理应用程序容器。容器是一种轻量级、可移植、独立的软…...
![](https://i-blog.csdnimg.cn/direct/98b90c7697764deda22b571b501e1071.gif)
Qt图片缩放显示
在Qt中,如果你想显示图片的像素或者对图片进行缩放显示,可以使用 QImage 类来处理图片数据,并使用 QLabel 或自定义的 QWidget 来显示图片,但是很难通过鼠标进行缩放显示 QGraphicsView可以实现此功能 在Qt中,QGraphi…...
![](https://i-blog.csdnimg.cn/direct/fcc14d8ee26549d78ccaac71da8f6f14.png)
47、lvs之DR
1、DR模式: 1.1、lvs三种模式: nat 地址转换 DR 直接路由模式 tun 隧道模式 1.2、DR模式的特点: 调度器在整个lvs集群当中是最重要的,在nat模式下,即负载接收请求,同时根据负载均衡的算法转发流量&…...
![](https://i-blog.csdnimg.cn/direct/7d20ccf7ea6842a0a3a58a798bac8b8e.png)
分布式技术栈、微服务架构 区分
1.分布式技术栈 这些技术栈都是为了更好的开发分布式架构的项目。 (大营销平台的系统框架如下图,扩展的分布式技术栈) (1)Dubbo——分布式技术栈 DubboNacos注册中心是应用可以分布式部署,并且提供RPC接…...
![](https://i-blog.csdnimg.cn/direct/490586dfd90644b8bdda7b9dd4c058b3.png#pic_center#pic_center)
【JavaEE精炼宝库】文件操作(2)——文件内容读写 | IO流
文章目录 一、输入流1.1 InputStream 概述:1.2 read 方法详解:1.3 close 方法:1.4 利用 Scanner 进行读操作:1.5 Reader: 二、输出流2.1 OutputStream 概述:2.2 write 方法详解:2.3 利用 PrintW…...
![](https://www.ngui.cc/images/no-images.jpg)
C++ 指针变量做参数传递时的情况分析
前言 指针变量作为参数传递时,很容易混淆指针本身和指针指向的内容,实际应用中可能会导致无法预料的问题,所以做一下详细分析。 注意,在测试过程中为了看测试效果,有些指针变量分配了空间,但是未做回收&am…...
![](https://i-blog.csdnimg.cn/direct/32579eed840845d9bedc6f91708d6a1e.png)
Linux环境下Oracle 11g的离线安装与配置历程
在成功体验了 Windows 版本的Oracle 11g 后,这几天心血来潮,决定再挑战一下Linux 环境下的安装,特别是在考虑到部门内部虚拟机无法联网的情况下,我选择了在CentOS 7上进行离线安装。这次安装之旅,主要参考了下面大佬的…...
![](https://i-blog.csdnimg.cn/direct/00042dac9e7747d1a618791ae52286f4.png)
上位机图像处理和嵌入式模块部署(mcu项目2:串口日志记录器)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 淘宝上面有一个商品蛮好玩的,那就是日志记录器。说是记录器,其实就是一个模块,这个模块的输入是一个ttl串口&am…...
![](https://i-blog.csdnimg.cn/direct/192882a287474e92a5c0704278b970fc.png)
容器是线程不安全的,如果多线程下不加锁直接使用容器会发什么
可能存在的问题 数据竞争 当两个或多个线程同时读写同一个容器且至少有一个线程在写时,会导致数据竞争。这种情况下,容器的内部状态可能会被破坏,从而导致未定义行为。这些未定义的行为包括数据损坏,程序崩溃,以及无…...
![](https://i-blog.csdnimg.cn/direct/bcfa366086234530ac0f3d194d428cdc.png)
配置光源——笔记
一、灯光的类型 (一)Directional Light(定向光) 1、只改变方向变化,不记录位置变化 2、相当于太阳光 3、室外一般使用 (二)Spot 聚光灯:昏暗(凌晨或傍晚),有一个光斑…...
![](https://i-blog.csdnimg.cn/direct/713e71309cfd44e2a463c84f568af313.png)
Java---SpringBoot详解一
人性本善亦本恶, 喜怒哀乐显真情。 寒冬暖夏皆有道, 善恶终归一念间。 善念慈悲天下广, 恶行自缚梦难安。 人心如镜自省照, 善恶分明照乾坤。 目录 一,入门程序 ①,创建springboot工程&#…...
![](https://img-blog.csdnimg.cn/img_convert/4a95a436263aa85aa3fdd88ad6f52862.png)
MFC扩展库BCGControlBar Pro v35.0 - 可视化管理主题等全新升级
BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了,这个版本改进类Visual Studio 2022的视觉主题、增强对多个…...
![](https://www.ngui.cc/images/no-images.jpg)
Springboot 配置 log4j2 时的注意事项
感谢博主 https://www.cnblogs.com/fishlittle/p/17950944 依赖 SpringBoot 的 spring-boot-starter/ spring-boot-starter-web 自带的是 logback 日志,若要使用 log4j2 日志,需要引入对应依赖。logback 日志和 log4j2 日志都是对 slf4j 门面的实现&am…...
![](https://i-blog.csdnimg.cn/direct/82578b378b544c038a050b94f4724329.png)
微服务-初级篇
微服务-初级篇 认识微服务1.1 单体架构1.2 分布式架构1.3 微服务 SpringCloud2.1 了解2.2 服务拆分原则2.3 服务拆分效果 Nacos注册中心3.1 认识和安装Nacos3.1.1 Nacos下载3.1.2 Nacos安装 3.2 服务注册到Nacos Feign远程调用4.1 Feign引入4.2 Feign配置 认识微服务 1.1 单体…...
![](https://i-blog.csdnimg.cn/direct/bf7a66810a4145edbe3fb146c5a4af99.png)
批量制作word表格
问题背景 将excel表中的成绩内容制作为成绩单,每页对应一个学员的成绩,方便打印 代码实现 ## 导入包 import pandas as pd from docx import Document from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_LINE_SPACING# 读取 Excel 内容 df pd.read_e…...
![](https://www.ngui.cc/images/no-images.jpg)
代码随想录算法训练营:27/60
非科班学习算法day27 | LeetCode455:分发饼干 ,Leetcode376:摆动序列 ,Leetcode53:最大子数组和 介绍 包含LC的两道题目,还有相应概念的补充。 相关图解和更多版本: 代码随想录 (programmercarl.com)https://programmercarl.c…...
![](https://i-blog.csdnimg.cn/direct/60f41d1c2b8b49119df2aa699befa217.png#pic_center)
Redis 中String类型操作命令(命令演示,时间复杂度,返回值,注意事项)
String 类型 文章目录 String 类型set 命令get 命令mset 命令mget 命令get 和 mget 的区别incr 命令incrby 命令decr 命令decrby 命令incrbyfloat 命令append 命令getrange 命令setrange 命令 字符串类型是 Redis 中最基础的数据类型,在讲解命令之前,我们…...
![](https://i-blog.csdnimg.cn/direct/e60408480b724d939f9fd05da40dd91e.png)
2024亚太杯中文赛B题洪水灾害的数据分析与预测原创论文分享
大家好,从昨天肝到现在,终于完成了2024年第十四届 APMCM 亚太地区大学生数学建模竞赛B题洪水灾害的数据分析与预测的完整论文啦。 实在精力有限,具体的讲解大家可以去讲解视频: 2024亚太杯中文赛B题洪水灾害预测原创论文保姆级教…...
![](/images/no-images.jpg)
做网站的费用怎么做账/百度云搜索引擎入口 百度网盘
在web工程中,jsp页面上的请求时要进行字符编码转换的 通常在web。xml中添加过滤器作用是把request对象中的头信息参数等等进行编码转换 然后继续后续过滤链。web。xml加入 (尽可能考前排放 过滤器是有顺序的)Set Character Encodinglter。SetCharacterEncodingFilte…...
![](/images/no-images.jpg)
wordpress取消页尾/今日国际新闻大事件
http://poj.org/problem?id2184 dp[s]表示当TSs时,TF的最大值。 背包容量?——我们要找到它的最大值,不断分开累加正s和负s即可。 if (s > 0) {for (j Max; j > Min; --j)dp[j s] max(dp[j s], dp[j] f);///dp[s]表示当TSs时&…...
![](https://img-blog.csdnimg.cn/20201007205012479.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FhMjUyODg3Nzk4Nw==,size_16,color_FFFFFF,t_70#pic_center)
太平洋手机报价大全/家庭优化大师
什么是架构分隔 单体 单体:是把系统部署到一台服务器上,所有的请求业务都由这台服务器处理 优点:适合小型系统,节省资源 缺点:安全性低,一旦有突发压力, 整个系统都会面临崩溃 分层—隔离效果…...
![](/images/no-images.jpg)
揭阳网站制作服务/seo关键词排名报价
1、驱动包要升级为 mysql-connector-java-8.0.11.jar2、JDBC driver 由“com.mysql.jdbc.Driver”改为“com.mysql.cj.jdbc.Driver”3、url中加上“userSSLfalse”。否则会出现以下错误:“Establishing SSL connection withoutservers identity verification is not…...
![](https://img-blog.csdnimg.cn/img_convert/38ac1e9650c4807d6dc223f135cbf56c.png)
做招聘网站价格/什么是百度快照
如果你平时工作比较忙碌,并且这种忙碌的工作会让你感觉到焦头烂额,那么在这种情况下,你就需要一些工具来辅助自己了。通常使用待办事项app是不少人的选择,那么作为一款好用的待办事项app,应该有什么功能呢?…...
![](/images/no-images.jpg)
新公司做网站有效果吗/合肥新闻 今天 最新消息
根据我们在第一阶段的第三小阶段综合研究的基础,来首先进行我们本阶段的开发学习活动的环境进行搭建,在这里,我们使用tc2.0提供的编译程序对程序进行编译连接,tc2.0提供的编译程序生成的代码是运行于8086PC模式的代码,…...