`

JSP复习笔记——第11章 JSP 构架和MVC设计模式

阅读更多
11.1 JSP Model I 体系结构  
11.2 JSP Model II 体系结构/MVC设计模式
11.3 使用MVC设计模式改写用户注册程序
    11.3.1 使用serlvet实现Controller层
    11.3.2 使用jsp实现表示层
    11.3.3 使用JavaBean实现模型层
11.3.4 使用JDBC和DAO模式实现数据库层
   11.4 本章小结


JSP + DAO设计模式

使用JSP+JavaBean开发速度快,有一个问题:JSP与JavaBean之间紧密耦合在一起,会对开发及维护造成麻烦。
使用JSP+JavaBean(模式1)开发适用于一次开发完成,而且团队成员较少是使用。
JSP + Servlet + JavaBean
对于模式一JSP与JavaBean之间紧密耦合在一起

分析:
JSP优点,开发前台界面方便,做UI开发容易
Servlet优点:是JAVA程序,安全性高,性能高
Servlet缺点:显示不方便

JavaBean优点:可重复调用,需要接受用户的请求参数,进行相应的处理

问题:
JSP跳转到Servlet可以通过表单或超链接
从Servlet跳转到JSP:使用response对象
<h1>MVCDEMO</h1>
<!--
<h1><%=request.getAttribute("name")%></h1>
-->
<h1><%=session.getAttribute("name")%></h1>
―――――――――

package org.sky.darkness.servlet ;

import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;

public class MVCServlet extends HttpServlet
{
	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		this.doPost(req,resp) ;
	}
	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		// 要传递一个值到mvcdemo.jsp中
    // 要传递的内容只使用一次
    // 一个页面跳转有用,request范围
    // 既然request无法传递,那就扩大范围-session
		// req.setAttribute("name","darkness") ;
req.getSession().setAttribute("name","darkness") ;
		resp.sendRedirect("mvcdemo.jsp");
	}
};

JSP中两种跳转语句:
四种属性范围:
现在从Servlet中要传递的值只使用一次,如果把此值存放在session范围之中,则此内容只要用户一直与服务器保持连接,则此块内存空间要一直被占用,那么性能会很低。

解决方法:RequestDispatcher接口,是用于由Servlet到JSP进行服务器端跳转的接口
req.setAttribute("name","darkness") ;
// 与<jsp:forward/>功能相同
req.getRequestDispatcher("mvcdemo.jsp").forward(req,resp);

-----------------mvc_login.jsp--------------------------------------
<form action="mvcdemo" method="POST">
输入姓名:<input type="text" name="uname">
<input type="submit" value="提交">
</form>

-----------------MVCServlet.java--------------------------------------
package org.sky.darkness.servlet ;

import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
import org.sky.darkness.bean.MVCCheck ;

public class MVCServlet extends HttpServlet
{
	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		this.doPost(req,resp) ;
	}
	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
	{
		String name = req.getParameter("uname") ;
		MVCCheck mc = new MVCCheck() ;
		// 将请求内容设置到mc对象之中
		mc.setName(name) ;
		String path = null ;
		if(mc.isValidate())
		{
			// 保存名字在request范围之中
			req.setAttribute("name",mc.getName()) ;
			path = "mvc_success.jsp" ;
		}
		else
		{
			path = "mvc_failure.jsp" ;
		}
		// 进行跳转
		req.getRequestDispatcher(path).forward(req,resp) ;
	}
};
/*
  <servlet>
	<servlet-name>mvc</servlet-name>
	<servlet-class>org.sky.darkness.servlet.MVCServlet</servlet-class>
  </servlet>
  <servlet-mapping>
	<servlet-name>mvc</servlet-name>
	<url-pattern>/mvcdemo</url-pattern>
  </servlet-mapping>
*/

------------------------------------- MVCCheck.java------------------------
package org.sky.darkness.bean ; 

public class MVCCheck
{
	private String name ;

	public void setName(String name)
	{
		this.name = name ;
	}
	public String getName()

	{
		return this.name ;
	}
	// 验证
	public boolean isValidate()
	{
		if(this.name==null||"".equals(this.name))
		{
			return false ;
		}
		else
		{
			return true ;
		}
	}
};

<%@page contentType="text/html;charset=gb2312"%>
<h1>输入成功!!!</h1>
<h2>欢迎:<%=request.getAttribute("name")%>光临!!!</h2>
<%@page contentType="text/html;charset=gb2312"%>
<h1>输入失败!!!</h1>
<h2><a href="mvc_login.htm">重新登陆</a></h2>



通过以上代码可以发现:
使用MVC开发程序,代码稍微复杂
JSP与JavaBean之间没有什么特别明显的直接关系
而Servlet根据JavaBean返回的内容进行跳转

Servlet中最好只有以下几种代码:
 接收参数
 调用JavaBean
 进行跳转
 有一些简单的逻辑判断


案例-使用mvc+DAO完成用户登陆
DROP TABLE person ;

CREATE TABLE person 
(
	id varchar(20) not null primary key ,
	name varchar(20) not null ,
	password varchar(20) 
) ;

INSERT INTO person (id,name,password) VALUES ('sky','darkness','wind') ;
INSERT INTO person (id,name,password) VALUES ('cloud','hacker','creaker') ;

-- 提交事务
commit ;


-----------------login.jsp--------------------------------------------------------------------
<%@page contentType="text/html;charset=gb2312"%>
<%@page import="java.util.*"%>
<html>
<head>
	<title>登陆</title>
</head>
<body>
<center>
	<h1>登陆范例——MVC实现</h1>
	<hr>
	<br>
	<br>
	<!-- 加入更加详细的错误提示 -->
	<%
		if(request.getAttribute("errors")!=null)
		{
			// 有错误,要进行打印输出
			List all = (List)request.getAttribute("errors") ;
			Iterator iter = all.iterator() ;
			while(iter.hasNext())
			{
	%>
				<li><%=iter.next()%>
	<%
			}
		}
	%>
	
	<form action="LoginServlet" method="post">
	<table>
		<tr>
			<td colspan="2">用户登陆</td>
		</tr>
		<tr>
			<td>用户名:</td>
			<td><input type="text" name="id" value="${person.id}"></td>
		</tr>
		<tr>
			<td>密&nbsp;&nbsp;码:</td>
			<td><input type="password" name="password" value="${person.password}"></td>
		</tr>
		<tr>
			<td colspan="2">
			<input type="submit" value="登陆">
			<input type="reset" value="重置">
			</td>
		</tr>
	</table>
	</form>
</center>
</body>
</html>
-------------------------LoginServlet.java---------------------------------------------
// 建立MVC中的C,完成JSP+Servlet+JavaBean的开发模式

package org.sky.darkness.servlet ;

import java.io.* ;
import java.util.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
import org.sky.darkness.factory.* ;
import org.sky.darkness.vo.* ;

public class LoginServlet extends HttpServlet
{
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
	{
		this.doPost(request,response) ;
	}
	public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
	{
		// 声明一个集合类,用于保存错误信息
		List errors = new ArrayList() ;
		// 完成登陆验证,替换掉login_conf.jsp
		String path = "login.jsp" ;
		// 1、接收请求内容
		String id = request.getParameter("id") ;
		String password = request.getParameter("password") ;
		// 2、进行数据合法性验证,包括是否为空,长度是否满足等
		// 要将接收到的内容设置给PersonVO对象
		PersonVo pv = new PersonVo() ;
		pv.setId(id) ;
		pv.setPassword(password) ;
		pv.setErrors(errors) ;
		// 3、如果合法,则进行数据库验证
		if(pv.invalidate())
		{
			// 数据合法,可以进行数据库验证
			if(DAOFactory.getPersonDAOInstance().isLogin(pv))
			{
				// 用户ID、密码合法
				// 修改跳转路径
				// 保存用户名到request范围之中
				// request.setAttribute("name",pv.getName()) ;
				path = "login_success.jsp" ;
			}
			else
			{
				// 用户ID、密码非法
				errors.add("错误的用户ID及密码!") ;
			}
		}
		// 将错误信息保存
		request.setAttribute("errors",errors) ;
		request.setAttribute("person",pv) ;
		request.getRequestDispatcher(path).forward(request,response) ;
	}
};
-------------------------login_success.jsp---------------------------
<%@page contentType="text/html;charset=gb2312"%>
<html>
<head>
	<title>登陆</title>
</head>
<body>
<center>
	<h1>登陆范例——MVC实现</h1>
	<hr>
	<br>
	<br>
	<h2>登陆成功</h2>
	<h3>欢迎<font color="red" size="15">
		${person.name}
	</font>光临!!!</h3>
</center>
</body>
</html>
-----------------------------PersonVo.java---------------------
// 只包含setter和getter方法的类

package org.sky.darkness.vo ;

import java.util.* ;
public class PersonVo
{
	// 表中所有字段
	private String id ;
	private String name ;
	private String password ;
	// 此属性用于保存全部错误信息
	private List errors ;

	public boolean invalidate()
	{
		boolean flag = true ;
		// 验证ID
		if(this.id==null||"".equals(this.id))
		{
			flag = false ;
			errors.add("ID不能为空!") ;
		}
		else
		{
			// 进行长度验证:3~10位
			if(this.id.length()<3||this.id.length()>10)
			{
				flag = false ;
				errors.add("ID的长度应为3~10位!") ;
			}
		}
		// 验证密码
		if(this.password==null||"".equals(this.password))
		{
			flag = false ;
			errors.add("密码不能为空!") ;
		}
		else
		{
			// 进行长度验证:3~10位
			if(this.password.length()<3||this.password.length()>10)
			{
				flag = false ;
				errors.add("密码的长度应为3~10位!") ;
			}
		}
		return flag ;
	}

	public void setErrors(List errors)
	{
		this.errors = errors ;
	}
	public List getErrors()
	{
		return this.errors ;
	}

	// 生成getter和setter方法
	public void setId(String id)
	{
		this.id = id ;
	}
	public void setName(String name)
	{
		this.name = name ;
	}
	public void setPassword(String password)
	{
		this.password = password ;
	}
	public String getId()
	{
		return this.id ;
	}
	public String getName()
	{
		return this.name ;
	}
	public String getPassword()
	{
		return this.password ;
	}
};
----------------------------------PersonDAO.java----------------------
// 本接口定义本项目中所操作person表的全部方法

package org.sky.darkness.dao ;

// 使用PersonVo类
import org.sky.darkness.vo.* ;

public interface PersonDAO
{
	// 需要一个登陆验证的方法
	public boolean isLogin(PersonVo pv) ;
}
---------------------PersonDAOImpl.java---------------------------------
// 具体实现DAO接口的类

package org.sky.darkness.daoimpl ;

// 需要连接数据库
// 需要对VO的内容进行具体的验证
import java.sql.* ;
import org.sky.darkness.dao.* ;
import org.sky.darkness.dbc.* ;
import org.sky.darkness.vo.* ;

public class PersonDAOImpl implements PersonDAO
{
	public boolean isLogin(PersonVo pv)
	{
		boolean flag = false ;
		// 在此处成具体的数据库验证

		// 声明一个数据库操作对象
		PreparedStatement pstmt	= null ;
		// 声明一个结果集对象
		ResultSet rs			= null ;
		// 声明一个SQL变量,用于保存SQL语句
		String sql				= null ;
		// DataBaseConnection为具体的数据库连接及关闭操作类
		DataBaseConnection dbc	= null ;
		// 连接数据库
		dbc = new DataBaseConnection() ;

		// 编写SQL语句
		sql = "SELECT name FROM person WHERE id=? and password=?" ;
		try
		{			
			// 实例化数据库操作对象
			pstmt = dbc.getConnection().prepareStatement(sql) ;

			// 设置pstmt的内容,是按ID和密码验证
			pstmt.setString(1,pv.getId()) ;
			pstmt.setString(2,pv.getPassword()) ;

			// 查询记录
			rs = pstmt.executeQuery() ;
			// 判断是否有记录
			if(rs.next())
			{
				// 如果有记录,则执行此段代码
				// 用户是合法的,可以登陆
				flag = true ;
				pv.setName(rs.getString(1)) ;
			}
			// 依次关闭
			rs.close() ;
			pstmt.close() ;
		}
		catch(Exception e)
		{
			System.out.println(e) ;
		}
		finally
		{
			// 最后一定要保证数据库已被关闭
			dbc.close() ;
		}
		return flag ;
	}
};
-------------------------DAOFactory.java---------------------
// 取得DAO实例的工厂类

package org.sky.darkness.factory ;

import org.sky.darkness.dao.* ;
import org.sky.darkness.daoimpl.* ;

public class DAOFactory
{
	public static PersonDAO getPersonDAOInstance()
	{
		return new PersonDAOImpl() ;
	}
};
---------------------DataBaseConnection.java------------------
// 本类只用于数据库连接及关闭操作
package org.sky.darkness.dbc ;

import java.sql.* ;

public class DataBaseConnection
{
	// 属性
	// 定义数据库操作的常量、对象
	// 数据库驱动程序
	private final String DBDRIVER	= "oracle.jdbc.driver.OracleDriver" ;
	// 数据库连接地址
	private final String DBURL		= "jdbc:oracle:thin:@localhost:1521:sky" ;
	// 数据库用户名
	private final String DBUSER		= "scott" ;
	// 数据库连接密码
	private final String DBPASSWORD	= "tiger" ;
	// 声明一个数据库连接对象
	private Connection conn			= null ;

	// 在构造方法之中连接数据库
	public DataBaseConnection()
	{
		try
		{
			// 加载驱动程序
			Class.forName(DBDRIVER) ; 
			// 连接数据库
			conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;	
		}
		catch (Exception e)
		{
			System.out.println(e) ;
		}
	}

	// 返回一个数据库连接
	public Connection getConnection()
	{
		/// 返回连接对象
		return this.conn ;
	}

	// 关闭数据库连接
	public void close()
	{
		try
		{
			this.conn.close() ;			
		}
		catch (Exception e)
		{
		}
	}
};

分享到:
评论

相关推荐

    基于小生境粒子群算法的配电网有功-无功协调优化MATLAB实现及光伏波动应对

    内容概要:本文介绍了一种基于小生境粒子群算法的配电网有功-无功协调优化方法,旨在解决传统粒子群算法易陷入局部最优的问题。文中详细展示了MATLAB代码实现,重点介绍了小生境机制的应用,如动态调整小生境半径、自适应变异概率以及跨小生境信息交换等策略。此外,针对光伏出力波动,提出了滑动时间窗和平滑因子的方法来优化储能调度,确保电压稳定并降低网损。实验结果显示,在33节点测试系统上,网损降低12.7%,电压合格率提高8.3%,收敛速度快且稳定。 适合人群:电力系统研究人员、智能电网开发者、MATLAB编程爱好者。 使用场景及目标:适用于配电网优化调度,特别是含有大量分布式能源接入的场景。主要目标是提高电网运行效率,降低网损,保持电压稳定,优化储能调度。 其他说明:文中提供了详细的代码实现和参数配置建议,便于读者复现实验结果。同时,作者还分享了一些调试经验和技巧,帮助读者更好地理解和应用该算法。

    Matlab实现K-Means聚类算法:从数据处理到结果可视化的全流程指南

    内容概要:本文详细介绍了如何使用Matlab实现K-Means聚类算法,涵盖从数据加载、标准化、聚类执行到结果保存和可视化的完整流程。文中提供了具体的Matlab代码示例,解释了关键参数如聚类个数K的选择方法,以及如何通过肘部法则确定最佳K值。同时,强调了数据标准化的重要性,并给出了处理高维数据和保存结果的最佳实践。此外,还讨论了一些常见的错误及其解决方案,如数据未标准化导致的距离计算偏差等问题。 适合人群:具有一定编程基础并希望通过Matlab实现K-Means聚类算法的研究人员、学生和工程师。 使用场景及目标:适用于需要对数据进行无监督分类的场景,如市场细分、图像压缩、异常检测等。通过学习本文,读者能够掌握K-Means聚类的基本原理和实现方法,从而应用于实际数据分析任务。 其他说明:本文不仅提供完整的代码实现,还附带了许多实用的小技巧,如如何避免局部最优解、如何选择合适的K值、如何处理高维数据等。对于初学者来说,是一份非常有价值的参考资料。

    MATLAB中使用CNN进行单变量时间序列预测的技术实现与优化

    内容概要:本文详细介绍了如何利用MATLAB及其内置的深度学习工具箱,采用一维卷积神经网络(CNN)构建单变量时间序列预测模型的方法。主要内容涵盖数据预处理(如标准化、滑动窗口构造)、模型架构设计(包括卷积层、池化层的选择)、训练参数设定以及结果可视化和性能评估等方面。文中特别强调了针对时间序列特性的优化措施,如调整卷积核大小、引入层标准化等,并提供了具体的代码示例。 适用人群:适用于具有一定MATLAB编程基础和技术背景的数据科学家、机器学习工程师或研究人员,尤其是那些希望探索除LSTM之外的时间序列预测方法的人群。 使用场景及目标:该方法可用于各种具有周期性特点的时间序列数据分析任务,如气象预报、能源消耗预测等领域。主要目标是提供一种高效、易实现的替代方案,在保证预测精度的同时提高模型训练效率。 其他说明:作者指出,虽然CNN在处理长时间依赖方面不如LSTM,但对于某些特定类型的短期时间序列预测任务,CNN能够取得令人满意的结果。此外,文中还分享了一些实践经验,如如何应对常见的预测误差问题,以及进一步提升模型性能的建议。

    集体招聘总结.xls

    集体招聘总结.xls

    基于SMIC 0.18μm工艺的简易锁相环电路设计与实现

    内容概要:本文详细介绍了基于SMIC 0.18μm工艺的简单锁相环(PLL)电路的设计与实现。作者通过搭建一个由五个核心模块组成的PLL结构,帮助新手理解锁相环的工作原理。文中具体讲解了环形VCO、电荷泵、环路滤波器和分频器的设计细节及其优化技巧。例如,环形VCO采用7级电流饥饿型反相器串联,电荷泵使用最小尺寸开关管,环路滤波器为简单的RC网络,分频器则采用了经典÷32结构。此外,文章还分享了一些实用的调试经验和常见问题解决方案,如温度补偿、锁定时间和相位噪声的优化。 适用人群:初学者和有一定模拟电路基础的研发人员。 使用场景及目标:适用于希望深入了解锁相环工作原理和技术细节的学习者。通过动手实践,掌握PLL的基本设计流程和调试技巧,能够独立完成类似项目的初步设计。 其他说明:本文不仅提供了理论指导,还结合了大量的实战经验和具体的代码示例,使读者能够在实践中更好地理解和应用所学知识。

    员工离职面谈记录表.doc

    员工离职面谈记录表.doc

    tesseract-langpack-chi-tra-4.0.0-6.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统tesseract-langpack-chi_tra-4.0.0-6.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf tesseract-langpack-chi_tra-4.0.0-6.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    海洋工程技术中AHC主动海浪补偿器的控制算法与程序实现

    内容概要:本文详细介绍了AHC主动海浪补偿器在海洋平台及其相关装备中的应用。AHC作为一种智能‘稳定器’,通过实时监测海浪运动,利用先进的控制算法(如PID控制算法)和机械装置,主动调整平台或装备的位置,以抵消海浪的影响,确保相对稳定的作业环境。文中不仅探讨了控制算法的核心原理,还展示了具体的应用实例,如波浪补偿舷梯的设计与实现。此外,文章还涉及了传感器数据处理、执行机构控制等方面的内容,强调了AHC在保障海上作业安全和提高工作效率方面的重要作用。 适合人群:从事海洋工程、自动化控制领域的研究人员和技术人员,以及对智能控制系统感兴趣的读者。 使用场景及目标:适用于需要在复杂海洋环境中保持稳定性的各种海洋平台和装备。目标是通过理解和应用AHC技术,提高海上作业的安全性和效率。 其他说明:文章提供了多个代码示例,帮助读者更好地理解控制算法的具体实现。同时,文中提到了一些实际应用中的挑战和解决方案,如传感器数据同步、执行机构的响应速度等问题。

    981ac-main.zip

    981ac-main.zip

    微电网领域中基于下垂控制和动态事件触发的孤岛微电网二次控制技术创新

    内容概要:本文探讨了孤岛微电网二次控制领域的创新技术,重点介绍了下垂控制和动态事件触发机制的应用。下垂控制通过模拟传统同步发电机的外特性,依据功率-频率、电压-无功的下垂关系,实现分布式电源(DG)间的有功和无功功率分配。然而,单纯依靠下垂控制可能导致频率和电压偏差,因此引入了二次控制来消除这些偏差并提高电能质量。文中还提出了一种基于动态事件触发的二次控制策略,该策略只在系统状态变化达到一定程度时进行通信和控制动作,从而减少通信负担,提升系统效率。此外,文章展示了如何通过动态事件触发机制实现有功功率均分以及处理异步通信一致性问题,确保微电网系统的稳定运行。 适用人群:从事微电网研究和技术开发的专业人士,尤其是关注分布式能源系统优化的研究人员和工程师。 使用场景及目标:适用于希望优化孤岛微电网性能的研究项目,旨在通过创新的二次控制技术提高系统的频率和电压稳定性、功率分配均匀性和通信效率。 其他说明:文中提到的相关研究成果已在多篇学术文献中得到验证,感兴趣的读者可以通过参考文献进一步了解技术细节。

    【制度】员工档案管理制度 (1).doc

    【制度】员工档案管理制度 (1).doc

    电镀生产线中西门子S7-300 PLC控制程序详解及其应用

    内容概要:本文详细介绍了应用于电镀生产线的西门子S7-300 PLC控制系统的程序设计、硬件配置以及调试过程中积累的实际经验。主要内容涵盖温度控制、条码记录、行车定位、故障排查等方面的技术细节。文中展示了多个关键功能模块的具体实现方法,如PID温度控制、条码数据处理、行车定位判断等,并分享了一些实用的调试技巧和注意事项。此外,还讨论了硬件配置中的重要细节,如模块地址分配、网络拓扑设计等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对PLC编程有一定基础的人群。 使用场景及目标:适用于需要深入了解和掌握电镀生产线自动化控制技术的专业人士。目标是帮助读者理解S7-300 PLC在电镀生产线中的具体应用,提高实际项目的开发效率和可靠性。 其他说明:文章不仅提供了详细的程序代码示例,还分享了许多来自一线的真实案例和实践经验,对于解决实际工程中的问题具有很高的参考价值。

    员工生日关怀方案.doc

    员工生日关怀方案

    工业自动化中基于Python的智能水泵控制系统设计与实现

    内容概要:本文详细介绍了如何利用Python实现一个智能水泵控制系统,涵盖模式切换、故障自动投入、定时轮换和压力调节四大核心功能。首先,通过设置不同模式(如先停后启或先启后停)来满足特定应用场景的需求。其次,在故障自动投入方面,系统能够检测到水泵故障并迅速切换到备用泵,确保连续供水。再次,为了均衡水泵的工作负荷,系统定期进行定时轮换操作。最后,根据管道内的实时压力情况,系统可以自动调整工作的水泵数量,保持恒定的压力水平。此外,文中还讨论了如何通过配置文件灵活调整系统参数,以及采用PID简化版算法进行压力控制的方法。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对水泵控制有一定了解并希望深入研究的人士。 使用场景及目标:适用于需要精确控制多台水泵协同工作的工业环境,旨在提高系统的可靠性和效率,延长设备使用寿命,节约能源成本。 其他说明:文中提供了详细的代码示例,帮助读者更好地理解和实施所介绍的技术方案。同时强调了实际应用中的注意事项,如压力传感器的正确安装和预防措施等。

    基于51单片机protues仿真的多功能万用表设计(仿真图、源代码、AD原理图、流程图)

    基于51单片机protues仿真的多功能万用表设计(仿真图、源代码、AD原理图、流程图) 数字多用表既可以测量电压,也可以测量电流、电阻,功能齐全,使用便捷。 本选题采用8位8路A/D转换器ADC0808和8051单片机设计一台数字多用表,能进行电压、电流和电阻的测量,测量结果通过LED数码管显示,通过安检进行测量功能转换。电压测量范围0~5V,测量误差约为±0.02V,电流测量范围为1~100mA,测量误差约为±0.5mA,电阻测量范围0~1000Ω,测量误差约为±2Ω。 1、通过按键设置测量模式; 2、电压采用直接测量方式;电流使用差压放大测量;电阻使用恒流源把阻值转换成电压。 预计难易程度:难度适中预计工作量大小:8周 1.熟练掌握单片机设计基本原理;熟悉8051单片机的工作原理; 2.熟练掌握Proteus软件的使用方法; 3.利用Proteus软件仿真实现数字多用表的测量功能。

    员工关怀服务建议方案.doc

    员工关怀服务建议方案.doc

    UniApp 开发教程、案例及相关项目资源

    UniApp 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一次代码,可发布到 iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。它结合了 Web 技术的开发便利性和原生应用的性能优势,是跨平台移动应用开发的热门选择。UniApp 是一个强大的跨平台开发框架,支持多种平台和设备。通过本文的介绍,你已经了解了 UniApp 的基本开发流程、开发技巧、实战案例以及常见问题的解决方案。希望这些内容能帮助你在 UniApp 开发中更加得心应手。

    tesseract-langpack-asm-4.0.0-6.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统tesseract-langpack-asm-4.0.0-6.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf tesseract-langpack-asm-4.0.0-6.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    基于S7-200 PLC与MCGS的恒压供水系统设计及优化

    内容概要:本文详细介绍了如何利用S7-200 PLC和MCGS组态软件构建并优化恒压供水系统。首先,作者讲述了系统的设计思路,包括选择合适的硬件设备(如S7-224XP)以及确定基本的控制逻辑(如压力闭环、泵组切换)。接着,深入探讨了具体的编程实现,如梯形图编程用于处理压力传感器信号、PID控制算法的应用及其参数调整。此外,还分享了一些实用的小技巧,例如通过HMI界面进行参数设置和故障排查的方法。最后,强调了系统在现场应用中的表现,特别是在面对突发状况时的有效应对措施。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和恒压供水系统感兴趣的从业者。 使用场景及目标:适用于中小型水厂或其他需要恒压供水系统的场合。主要目标是确保供水系统的稳定性和可靠性,减少因压力波动带来的设备损坏和水资源浪费。 其他说明:文中不仅提供了详细的理论讲解,还有丰富的实战经验和具体案例分析,有助于读者更好地理解和掌握相关技术和方法。

Global site tag (gtag.js) - Google Analytics