J2EE之自定义框架知识(下篇 综合运用增删改查)

2023-11-03

J2EE之自定义框架知识(下篇 综合运用增删改查)

前言

在前面两期博客中我们了解了关于自定义MVC框架对之前代码的一些优化原理,今天我给大家带来的是自定义MVC框架的综合运用(增删改查),

下面由我来给大家分享(跟着我们的思维导图一起了解一下)

在这里插入图片描述

所需文件

链接:https://pan.baidu.com/s/1vHTem1HD1CEdjGTmJuPAFQ
提取码:yx04

该链接将本次分享所需的文件包含在内了,有需要课前往下载

1.将框架打成jar包,然后导入新工程,并且把框架的依赖jar包导入进去

1.1将框架打成jar包

如图所示

在这里插入图片描述

在这里插入图片描述

1.2 导入所需的jar包

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.将分页标签相关文件、及相关助手类导入

2.1导入数据工具类文件

(由于代码过多,如图所示)

在这里插入图片描述

2.2 导入分页工具类

在这里插入图片描述

3. 项目环境搭建

3.1 框架的配置文件添加

右击scr新建一个Source Folder文件夹,在此文件夹中新建一个.xml文件

(如图所示)

在这里插入图片描述

mvc.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<config>
	
	<!-- 
		在这里每加一个配置,就相当于actions.put("/goods", new GoodsAction());
		这样就解决了代码灵活性的问题
	 -->
	<action path="/book" type="com.YX.Web.BookAction">
<!-- 	 查询:BookList.jsp		返回值:list -->
<!-- 	 * 增删改确定:book.action?methodName=list		返回值:toList -->
<!-- 	 * 增加修改跳转对应界面:bookEdit.jsp			返回值:toEdit -->
		<forward name="list" path="/bookList.jsp" redirect="false" />
		<forward name="toList" path="/book.action?methodName=list" redirect="true" />
		<forward name="toEdit" path="/bookEdit.jsp" redirect="false" />
	</action>
	
</config>

3.2 web.xml的配置

web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>YX_MVC_project</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>mvc</servlet-name>
  	<servlet-class>com.zking.framework.DispatchServlet</servlet-class>
  	<init-param>
  		<param-name>configurationLocation</param-name>
  		<param-value>/mvc.xml</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>mvc</servlet-name>
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>
</web-app>

4. 实体类和Dao方法类的编写

实体类Book类
package com.YX.entity;


/**实体类:书籍类
 * @author 君易--鑨
 * 2023年7月3日下午10:00:37
 * 
 */
public class Book {
//定义属性
	private int bid;
	private String bname;
	private float price;
	
//	获取属性对应的get和set方法
	public int getBid() {
		return bid;
	}
	public void setBid(int bid) {
		this.bid = bid;
	}
	public String getBname() {
		return bname;
	}
	public void setBname(String bname) {
		this.bname = bname;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	
	/**
	 * 无参构造
	 */
	public Book() {
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * 有参构造
	 * @param bid
	 * @param bname
	 * @param price
	 */
	public Book(int bid, String bname, float price) {
		super();
		this.bid = bid;
		this.bname = bname;
		this.price = price;
	}
	@Override
	public String toString() {
		return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
	}
}

Dao方法类BookDao类
package com.YX.Dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import com.YX.entity.Book;
import com.YX.until.BaseDao;
import com.YX.until.DBAccess;
import com.YX.until.PageBean;
import com.YX.until.StringUtils;

/**
 * 数据库方法类
 * 
 * @author 君易--鑨 2023年7月3日下午10:04:40
 * 
 */
public class BookDao extends BaseDao<Book> {

	/**
	 * 查询的方法
	 * 
	 * @param book
	 *            带有查询内容的实体对象
	 * @param pageBean
	 *            分页工具类
	 * @return
	 * @throws Exception
	 */
	public List<Book> list(Book book, PageBean pageBean) throws Exception {
		String sql = "select * from t_mvc_book where 1=1 ";
		// 获取查询的书名
		String bname = book.getBname();
		// 获取书籍id
		int bid = book.getBid();
		if (StringUtils.isNotBlank(bname)) {// 判断查询的书名不为空
			sql += " and bname like '%" + bname + "%'";
		}
		if (bid != 0) {// 判断id不等于0,说明传了id过来
			sql += " and bid = " + bid;
		}
		return super.executeQuery(sql, Book.class, pageBean);
	}

	/**
	 * 新增的方法
	 * 
	 * @param book
	 *            新增的实体对象
	 * @return
	 * @throws Exception
	 */
	public int add(Book book) throws Exception {
		// 编写sql语句
		String sql = "insert into t_mvc_book values (?,?,?)";
		return super.executeUpdate(sql, book, new String[] { "bid", "bname", "price" });
	}

	/**
	 * 删除的方法
	 * 
	 * @param book
	 *            指定信息
	 * @return
	 * @throws Exception
	 */
	public int del(Book book) throws Exception {
		// 编写sql语句
		String sql = "delete from t_mvc_book where bid = ?";
		return super.executeUpdate(sql, book, new String[] { "bid" });
	}

	public int edit(Book book) throws Exception {
		// 编写sql语句
		String sql = "update t_mvc_book set bname = ?,price = ? where bid = ?";
		return super.executeUpdate(sql, book, new String[] { "bname", "price", "bid" });
	}

}
Dao方法的Junit测试类(BookDaoTest)
package com.YX.Dao;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Test;

import com.YX.entity.Book;
import com.YX.until.PageBean;


/**junit测试类用于测试方法
 * @author 君易--鑨
 * 2023年7月3日下午10:35:14
 * 
 */
public class BookDaoTest {

//	实例化Dao方法
	private BookDao bookdao=new BookDao();
	@Test
	public void testList() {
//		实例化实体对象
		Book book =new Book();
		book.setBname("君易");//设置查询的内容
		PageBean pageBean=new PageBean();
//		pageBean.setPage();//设置查询第几页
		pageBean.setPagination(false);//设置分页
		try {
			List<Book> list = bookdao.list(book, pageBean);
			for (Book b : list) {
				System.out.println(b);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
}

	@Test
	public void testAdd() {
//		实例化实体对象
		Book book =new Book();
//		设置要新增的书籍
		book.setBid(52);
		book.setBname("君易--鑨");
		book.setPrice(52);
//		调用方法
		try {
			bookdao.add(book);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void testDel() {
//		实例化实体对象
		Book book =new Book();
//		设置要删除的书籍
		book.setBid(52);
//		调用方法
		try {
			bookdao.del(book);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void testEdit() {
//		实例化实体对象
		Book book =new Book(50,"君易--鑨",520);
//		调用方法
		try {
			bookdao.edit(book);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

查看测试结果(带模糊查询和分页)

在这里插入图片描述

删除后查询测试结果

在这里插入图片描述

修改后查询结果

在这里插入图片描述

新增后查询结果

在这里插入图片描述

5. 完成BookAction类的代码

在这里插入图片描述

package com.YX.Web;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.YX.Dao.BookDao;
import com.YX.entity.Book;
import com.YX.until.PageBean;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriver;

/**
 * 
 * @author 君易--鑨 2023年7月3日下午11:38:40
 *
 */
public class BookAction extends ActionSupport implements ModelDriver<Book> {
	private Book book = new Book();// 实例化实体对象
	private BookDao bookdao = new BookDao();// 实例化dao方法

	// 查询 bookList.jsp
	public String list(HttpServletRequest req, HttpServletResponse resp) {
		PageBean pageBean = new PageBean();// 实例化分页工具类
		pageBean.setRequest(req);// 初始化分页工具
		try {
			List<Book> lst = bookdao.list(book, pageBean);// 调用方法
			// 存储起来回显到界面上
			req.setAttribute("lst", lst);
			req.setAttribute("pageBean", pageBean);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "list";
	}

	// 编辑页面跳转 bookEdit.jsp
	public String toEdit(HttpServletRequest req, HttpServletResponse resp) {
		try {
			if (book.getBid() != 0) {
				List<Book> lst = bookdao.list(book, null);// 调用方法
				// 存储起来回显到界面上
				req.setAttribute("b", lst.get(0));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "toEdit";
	}

	// 增加
	public String add(HttpServletRequest req, HttpServletResponse resp) {
		try {
			bookdao.add(book);// 调用方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "toList";
	}

	// 删除
	public String del(HttpServletRequest req, HttpServletResponse resp) {
		try {
			bookdao.del(book);// 调用方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "toList";
	}

	// 修改
	public String edit(HttpServletRequest req, HttpServletResponse resp) {
		try {
			bookdao.edit(book);// 调用方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "toList";
	}

	@Override
	public Book getModel() {
		// TODO Auto-generated method stub
		return book;
	}

}

6. 前端代码

bookList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="/YX" prefix="yx"%>	
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>	
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link
	href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
	rel="stylesheet">
<script
	src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<title>书籍列表</title>
<style type="text/css">
.page-item input {
	padding: 0;
	width: 40px;
	height: 100%;
	text-align: center;
	margin: 0 6px;
}

.page-item input, .page-item b {
	line-height: 38px;
	float: left;
	font-weight: 400;
}

.page-item.go-input {
	margin: 0 10px;
}
</style>
</head>
<body>
	<form class="form-inline"
		action="${pageContext.request.contextPath }/book.action?methodName=list" method="post">
		<div class="form-group mb-2">
			<input type="text" class="form-control-plaintext" name="bname"
				placeholder="请输入书籍名称">
<!-- 			<input name="rows" value="20" type="hidden"> -->
<!-- 不想分页 -->
				<input name="pagination" value="false" type="hidden">
		</div>
		<button type="submit" class="btn btn-primary mb-2">查询</button>
		<a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/book.action?methodName=toEdit">新增</a>
	</form>

	<table class="table table-striped bg-success">
		<thead>
			<tr>
				<th scope="col">书籍ID</th>
				<th scope="col">书籍名</th>
				<th scope="col">价格</th>
				<th scope="col">操作</th>
			</tr>
		</thead>
		<tbody>
			<c:forEach  var="b" items="${lst }">
			<tr>
				<td>${b.bid }</td>
				<td>${b.bname }</td>
				<td>${b.price }</td>
				<td>
					<a href="${pageContext.request.contextPath }/book.action?methodName=toEdit&bid=${b.bid}">修改</a>
					<a href="${pageContext.request.contextPath }/book.action?methodName=delete&bid=${b.bid}">删除</a>
				</td>
			</tr>
			</c:forEach>
		</tbody>
	</table>
	<!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
<yx:page pageBean="${pageBean }"></yx:page>
</body>
</html>
bookEdit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="/YX" prefix="yx"%>	
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>	
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link
	href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
	rel="stylesheet">
<script
	src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<title>书籍列表</title>
<style type="text/css">
.page-item input {
	padding: 0;
	width: 40px;
	height: 100%;
	text-align: center;
	margin: 0 6px;
}

.page-item input, .page-item b {
	line-height: 38px;
	float: left;
	font-weight: 400;
}

.page-item.go-input {
	margin: 0 10px;
}
</style>
</head>
<body>
	<form class="form-inline"
		action="${pageContext.request.contextPath }/book.action?methodName=list" method="post">
		<div class="form-group mb-2">
			<input type="text" class="form-control-plaintext" name="bname"
				placeholder="请输入书籍名称">
<!-- 			<input name="rows" value="20" type="hidden"> -->
<!-- 不想分页 -->
				<input name="pagination" value="false" type="hidden">
		</div>
		<button type="submit" class="btn btn-primary mb-2">查询</button>
		<a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/book.action?methodName=toEdit">新增</a>
	</form>

	<table class="table table-striped bg-success">
		<thead>
			<tr>
				<th scope="col">书籍ID</th>
				<th scope="col">书籍名</th>
				<th scope="col">价格</th>
				<th scope="col">操作</th>
			</tr>
		</thead>
		<tbody>
			<c:forEach  var="b" items="${lst }">
			<tr>
				<td>${b.bid }</td>
				<td>${b.bname }</td>
				<td>${b.price }</td>
				<td>
					<a href="${pageContext.request.contextPath }/book.action?methodName=toEdit&bid=${b.bid}">修改</a>
					<a href="${pageContext.request.contextPath }/book.action?methodName=delete&bid=${b.bid}">删除</a>
				</td>
			</tr>
			</c:forEach>
		</tbody>
	</table>
	<!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
<yx:page pageBean="${pageBean }"></yx:page>
</body>
</html>
页面展示

在这里插入图片描述

结束语

这期博客给大家分享到这,希望大家能点击关注,后续会继续分享知识。

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

J2EE之自定义框架知识(下篇 综合运用增删改查) 的相关文章

  • MySQL 按主键排序

    某些 SQL 服务器允许使用通用语句 例如ORDER BY PRIMARY KEY 我不相信这适用于 MySQL 是否有任何此类解决方法可以允许跨多个表自动选择 或者是否需要查找查询来确定主键 我一直在研究的解决方法包括调用SHOW COL
  • mysql语句中的*星号是什么意思?

    Ex mysql query SELECT FROM members WHERE id id 这意味着选择表中的所有列
  • 通过连接从两个表中删除?

    我有两个表如下 tbl1 tbl2 id article id title image whole news tags author older datetime 其中 tbl1 id gt tbl2 article id 如何从两个表中删
  • MySQL 服务器未启动

    当我做 mysql u root p并输入my password这就是我得到的 错误 2002 HY000 无法通过套接字 var run mysqld mysqld sock 连接到本地 MySQL 服务器 2 所以我输入 systemc
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • 在 MacOSX10.6 上运行 python 服务器时 MySQLdb 错误

    运行我的服务器 python manage py runserver 产生以下错误 django core exceptions ImproperlyConfigured 加载 MySQLdb 模块时出错 没有名为 MySQLdb 的模块
  • 如何在 phpmyadmin 中创建 MySQL 触发器

    我想在 MySQL 中创建一个触发器 我运行以下命令 mysql gt delimiter mysql gt CREATE TRIGGER before insert money BEFORE INSERT ON money gt FOR
  • 为什么 MySQL 创建带有 _seq 后缀的表?

    我创建了一个 InnoDB 表 名为foo在 MySQL 中 一旦我对表执行插入操作 我就会看到另一个表foo seq被建造 如果我删除自动生成的表 它会在下一次插入后出现 是什么原因造成的 听起来像是正在创建一个序列 您是否有自动生成的主
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

    几天来 我在使用 Glassfish EJB3 和 Mysql InnoDB 的 Java 应用程序上遇到了死锁问题 配置 Mysql InnoDB Ver 14 12 Distrib 5 0 51a 适用于 debian linux gn
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 如何使用 vitess 仅对特定表进行分片

    我创建了一个包含三个表的未分片键空间 现在我想对前两个表的键空间进行分片 但不想对第三个表进行分片 如何才能做到这一点 Vitess 文档不包含任何与此相关的信息或示例 请帮忙 Thanks vitess 中的垂直分片与水平分片类似 您应该
  • 即使使用“autoReconnect=true”,MySql JDBC 也会超时[重复]

    这个问题在这里已经有答案了 有时 我的 Java Tomcat6 Debian Squeeze 应用程序无法与 MySql 服务器通信 Tomcat 应用程序位于前端服务器上 而 MySql 位于单独的 仅限 MySql 的机器上 一个典型
  • gem install mysql:无法构建 gem 本机扩展 (Mac Lion)

    我为 Mac OS X Lion 安装了 MySQL 5 5 27 来自 dmg 现在我尝试安装 mysql gem gem install mysql Building native extensions This could take
  • Mysql 将 int 转换为 MAC

    我有一些数据可以转换 其中有 2 列 其中一列有 IP 它包含整数值 我在 mysql 查询中使用了以下函数 是否有一个函数可以用来转换我的 mac 列 其中包含整数和数据类型是bigint to MAC地址 SELECT INET NTO
  • Flask-login:无法理解它是如何工作的

    我试图理解如何Flask Login https flask login readthedocs org en latest works 我在他们的文档中看到他们使用预先填充的用户列表 我想使用数据库存储的用户列表 但是 我不明白其中的一些
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex

随机推荐

  • 高并发高可用之ElasticSearch

    目录 ES对比MySql数据库 Docker下安装ES和kibana 增删改查操作 高级检索Query DSL 映射 安装中文IK分词器 SpringBoot整合ES 实战应用 ES集群 ES里面的数据怎么保持与mysql实时同步 都存内存
  • 报错: ‘XXXX‘ is declared but its value is never read.Vetur(6133)

    引入的路径本没有问题 结果确报错 解决方法如下 1 在VScode工具的设置中找到设置 2 在搜索栏输入 vetur 并找到Vertur gt Validation Script 在比较靠下多滑动页面哦 3 最后关闭项目重新打开即可 报错消
  • 二叉树前序,中序以及后序的非递归算法实现(外加层序)

    二叉树前序 中序以及后序的非递归算法实现 外加层序 最近在学数据结构里面的二叉树 就把三个遍历的非递归算法以及层序遍历写了一下hhh 感觉就是用栈模拟了一下递归算法 其实三种遍历的方法大体相似 主要就是在访问节点值的时候对代码进行了部分改动
  • 代码质量度量标准_Google研发度量改进实践

    Google改进过程 本文案例源自 Measuring Engineering Productivity 作者 Ciera Jaspen Google 前言 随着敏捷开发 DevOps等方法论在软件行业持续运用 各种用来提升组织研发效率和产
  • Jmeter性能测试3——JMETER-脚本优化

    断言 作用 用于检查检测在测试中得到的响应结果是否符合预期 用以保证性能测试过程中数据交互与预期一致 主要是用来调试 真正执行压力测试时候 断言禁用 目的 在request 请求 返回层面加一层判断机制 实现的过程 在请求下添加断言 请求不
  • 如何解决python安装模块是出现的 error: Unable to find vcvarsall.bat

    看了一圈网上的 觉得知乎里面的答案是最好的 我觉得大部分问题在于python版本和vs版本不配对的问题 例如 python2 7会默认配对msvs2008 python3 4 和3 5是默认配对msvs2010 所以我电脑上python3
  • 【软件测试常见Bug清单】

    软件测试中 bug的类型有很多种 比如 代码错误 界面优化 设计缺陷 需求补充和用户体验等 一般情况下 需求补充和设计缺陷比较好区分 但是代码错误 界面优化和用户体验区分不是很明显 下面我们就来说说这三者 顺带整理一些常见的这些类型的bug
  • 【操作系统】王道考研 p22-26 生产者消费者问题、多生产者多消费者问题、吸烟者问题、读者写者问题、哲学家进餐问题

    生产者消费者问题 多生产者多消费者问题 吸烟者问题 读者写者问题 哲学家进餐问题 生产者消费者问题 有同步和互斥 同步 缓冲区没满才能放产品 缓冲区不空才能取产品 互斥 各进程互斥访问 关于PV P是消耗 V是释放 或理解为P是进 V是出
  • PCB相关知识总结-(1)PCB工艺

    开关电源PCB相关知识总结 PCB工艺 1 前言 2 基础概念 2 1 基本介绍 2 1 1 PCB的基板 2 1 2 相关术语 2 2 分类 2 3 正片和负片 2 4 过孔工艺 2 5 PCB阻焊颜色 2 6 PCB验收标准 1 前言
  • 纳秒是10^(-9),代码写法是1.0e-9不是10.0e-9

    纳秒是10 9 代码写法是1 0e 9不是10 0e 9 参考System nanoTime 简书
  • API 自动化测试难点总结与分享

    API自动化测试的难点包括 接口的参数组合较多 需要覆盖各种可能的情况 接口的状态和数据关联较多 需要验证返回结果是否符合预期 接口的并发访问和性能测试较为复杂 需要合理规划和调度测试策略 接口的安全性和权限控制较为重要 需要针对不同的用户
  • qt中的frame设置边框和颜色,里面控件不变

    需要指定样式对象 比如我的QFrame的名称是frame 2output 那么在设置样式的时候 其代码就如下 frame 2output border radius 10px border 1px solid rgb 100 100 189
  • Mvc项目实例 MvcMusicStore

    原文链接 http www cnblogs com wenming205 archive 2010 08 08 1795341 html 文章不错 看完之后搭建项目就没什么问题了 其他很多就是经验问题了 做过webform的 其实也就需要知
  • Unity关键概念

    Unity是一款跨平台的游戏引擎和开发工具 用于创建2D和3D游戏 交互式内容和应用程序 它提供了一个强大的开发环境 使开发者能够轻松地设计 开发和部署高质量的游戏和应用程序 以下是Unity的几个关键概念 游戏对象 Game Object
  • ubuntu盒盖不睡眠

    修改配置文件里对应的参数即可 需要root权限 需要重启 1 打开文件 etc systemd logind conf 能看到三个控制盒盖后动作的选项 HandleLidSwitch suspend HandleLidSwitchExter
  • 公司现有一个工作组workgroup,需要添加samba服务器作为文件服务器,并发布共享目录

    需求 公司现有一个工作组workgroup 需要添加samba服务器作为文件服务器 并发布共享目录 share 共享名为public 此共享目录允许所有员工访问 samba服务器配置流程 强调 先关闭selinux和防火墙 1 安装samb
  • 【stm32疑难杂症】:Error: L6218E: Undefined symbol TIM_Cmd (referred from timer.o).

    项目场景 在使用工程是发现问题 OBJ OLED axf Error L6218E Undefined symbol TIM Cmd referred from timer o OBJ OLED axf Error L6218E Undef
  • Windows一键清空回收站

    作为一个重度整洁患者 虽然生活较为邋遢 但是 桌面一定是整理的干干净净 桌面上的快捷方式没有几个 甚至打开计算机用的也是快捷键 那么就碰到了一个问题 回收站 它既不美观 又放在桌面上 甚至连快捷键都没有 那我删除的文件那该怎么清理 大家可能
  • KCF目标跟踪方法分析与总结

    KCF目标跟踪方法分析与总结 两个竖杠是什么数学符号 就是这个 这个符号叫做范数 它事实上是由线性赋范空间到非负实数的映射 在线性赋范空间中 它可以表示空间中的点与原点间的距离 两点间的距离也是用两点之差的范数来表示的 范数所满足的条件有
  • J2EE之自定义框架知识(下篇 综合运用增删改查)

    J2EE之自定义框架知识 下篇 综合运用增删改查 文章目录 J2EE之自定义框架知识 下篇 综合运用增删改查 前言 所需文件 1 将框架打成jar包 然后导入新工程 并且把框架的依赖jar包导入进去 1 1将框架打成jar包 1 2 导入所