- 浏览: 489206 次
- 性别:
- 来自: 长沙
-
文章分类
最新评论
-
Source_野驴:
...
jsp静态化和伪静态化 -
zidanzzg:
很好的知识,找到了利用异或交换数值的理论支持,谢谢分享
XOR的性质和运算 -
ueseu:
引用(2) DomainDomain域名也是Cookie的一部 ...
Cookie的组成 -
ueseu:
引用Secure取true或者false值。如果为true,那 ...
Cookie的组成 -
liqi___123:
理解得很透彻,谢谢!!
ROLAP、MOLAP和HOLAP联机分析处理区别
RequestContext 这个类在 OSChina 中是非常重要的一个类,该类由全局 Filter 进行初始化,并传递给包括 Action 和 页面中直接使用,使用时通过 RequestContext.get() 来获取当前请求上下文实例。 这个方法主要的功能包括:自动转码、处理文件上传、登录信息处理,以及一些跟请求相关的常用方法封装。 如果你从中发现了什么问题,请不吝赐教。
package my.mvc; import java.io.*; import java.net.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import my.util.CryptUtils; import my.util.Multimedia; import my.util.RequestUtils; import my.util.ResourceUtils; import net.oschina.beans.User; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.Converter; import org.apache.commons.beanutils.converters.SqlDateConverter; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 请求上下文 * @author Winter Lau * @date 2010-1-13 下午04:18:00 */ public class RequestContext { private final static Log log = LogFactory.getLog(RequestContext.class); private final static int MAX_FILE_SIZE = 10*1024*1024; private final static String UTF_8 = "UTF-8"; private final static ThreadLocal<RequestContext> contexts = new ThreadLocal<RequestContext>(); private final static boolean isResin; private final static String upload_tmp_path; private final static String TEMP_UPLOAD_PATH_ATTR_NAME = "$OSCHINA_TEMP_UPLOAD_PATH$"; private static String webroot = null; private ServletContext context; private HttpSession session; private HttpServletRequest request; private HttpServletResponse response; private Map<String, Cookie> cookies; static { webroot = getWebrootPath(); isResin = _CheckResinVersion(); //上传的临时目录 upload_tmp_path = webroot + "WEB-INF" + File.separator + "tmp" + File.separator; try { FileUtils.forceMkdir(new File(upload_tmp_path)); } catch (IOException excp) {} //BeanUtils对时间转换的初始化设置 ConvertUtils.register(new SqlDateConverter(null), java.sql.Date.class); ConvertUtils.register(new Converter(){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); SimpleDateFormat sdf_time = new SimpleDateFormat("yyyy-M-d H:m"); @SuppressWarnings("rawtypes") public Object convert(Class type, Object value) { if(value == null) return null; if (value instanceof Date) return (value); try { return sdf_time.parse(value.toString()); } catch (ParseException e) { try { return sdf.parse(value.toString()); } catch (ParseException e1) { return null; } } }}, java.util.Date.class); } private final static String getWebrootPath() { String root = RequestContext.class.getResource("/").getFile(); try { root = new File(root).getParentFile().getParentFile().getCanonicalPath(); root += File.separator; } catch (IOException e) { throw new RuntimeException(e); } return root; } /** * 初始化请求上下文 * @param ctx * @param req * @param res */ public static RequestContext begin(ServletContext ctx, HttpServletRequest req, HttpServletResponse res) { RequestContext rc = new RequestContext(); rc.context = ctx; rc.request = _AutoUploadRequest(_AutoEncodingRequest(req)); rc.response = res; rc.response.setCharacterEncoding(UTF_8); rc.session = req.getSession(false); rc.cookies = new HashMap<String, Cookie>(); Cookie[] cookies = req.getCookies(); if(cookies != null) for(Cookie ck : cookies) { rc.cookies.put(ck.getName(), ck); } contexts.set(rc); return rc; } /** * 返回Web应用的路径 * @return */ public static String root() { return webroot; } /** * 获取当前请求的上下文 * @return */ public static RequestContext get(){ return contexts.get(); } public void end() { String tmpPath = (String)request.getAttribute(TEMP_UPLOAD_PATH_ATTR_NAME); if(tmpPath != null){ try { FileUtils.deleteDirectory(new File(tmpPath)); } catch (IOException e) { log.fatal("Failed to cleanup upload directory: " + tmpPath, e); } } this.context = null; this.request = null; this.response = null; this.session = null; this.cookies = null; contexts.remove(); } public Locale locale(){ return request.getLocale(); } public void closeCache(){ header("Pragma","No-cache"); header("Cache-Control","no-cache"); header("Expires", 0L); } /** * 自动编码处理 * @param req * @return */ private static HttpServletRequest _AutoEncodingRequest(HttpServletRequest req) { if(req instanceof RequestProxy) return req; HttpServletRequest auto_encoding_req = req; if("POST".equalsIgnoreCase(req.getMethod())){ try { auto_encoding_req.setCharacterEncoding(UTF_8); } catch (UnsupportedEncodingException e) {} } else if(!isResin) auto_encoding_req = new RequestProxy(req, UTF_8); return auto_encoding_req; } /** * 自动文件上传请求的封装 * @param req * @return */ private static HttpServletRequest _AutoUploadRequest(HttpServletRequest req){ if(_IsMultipart(req)){ String path = upload_tmp_path + RandomStringUtils.randomAlphanumeric(10); File dir = new File(path); if(!dir.exists() && !dir.isDirectory()) dir.mkdirs(); try{ req.setAttribute(TEMP_UPLOAD_PATH_ATTR_NAME,path); return new MultipartRequest(req, dir.getCanonicalPath(), MAX_FILE_SIZE, UTF_8); }catch(NullPointerException e){ }catch(IOException e){ log.fatal("Failed to save upload files into temp directory: " + path, e); } } return req; } public long id() { return param("id", 0L); } public String ip(){ return RequestUtils.getRemoteAddr(request); } @SuppressWarnings("unchecked") public Enumeration<String> params() { return request.getParameterNames(); } public String param(String name, String...def_value) { String v = request.getParameter(name); return (v!=null)?v:((def_value.length>0)?def_value[0]:null); } public long param(String name, long def_value) { return NumberUtils.toLong(param(name), def_value); } public int param(String name, int def_value) { return NumberUtils.toInt(param(name), def_value); } public byte param(String name, byte def_value) { return (byte)NumberUtils.toInt(param(name), def_value); } public String[] params(String name) { return request.getParameterValues(name); } public long[] lparams(String name){ String[] values = params(name); if(values==null) return null; return (long[])ConvertUtils.convert(values, long.class); } public String uri(){ return request.getRequestURI(); } public String contextPath(){ return request.getContextPath(); } public void redirect(String uri) throws IOException { response.sendRedirect(uri); } public void forward(String uri) throws ServletException, IOException { RequestDispatcher rd = context.getRequestDispatcher(uri); rd.forward(request, response); } public void include(String uri) throws ServletException, IOException { RequestDispatcher rd = context.getRequestDispatcher(uri); rd.include(request, response); } public boolean isUpload(){ return (request instanceof MultipartRequest); } public File file(String fieldName) { if(request instanceof MultipartRequest) return ((MultipartRequest)request).getFile(fieldName); return null; } public File image(String fieldname) { File imgFile = file(fieldname); return (imgFile!=null&&Multimedia.isImageFile(imgFile.getName()))?imgFile:null; } public boolean isRobot(){ return RequestUtils.isRobot(request); } public ActionException fromResource(String bundle, String key, Object...args){ String res = ResourceUtils.getStringForLocale(request.getLocale(), bundle, key, args); return new ActionException(res); } public ActionException error(String key, Object...args){ return fromResource("error", key, args); } /** * 输出信息到浏览器 * @param msg * @throws IOException */ public void print(Object msg) throws IOException { if(!UTF_8.equalsIgnoreCase(response.getCharacterEncoding())) response.setCharacterEncoding(UTF_8); response.getWriter().print(msg); } public void output_json(String[] key, Object[] value) throws IOException { StringBuilder json = new StringBuilder("{"); for(int i=0;i<key.length;i++){ if(i>0) json.append(','); boolean isNum = value[i] instanceof Number ; json.append("\""); json.append(key[i]); json.append("\":"); if(!isNum) json.append("\""); json.append(value[i]); if(!isNum) json.append("\""); } json.append("}"); print(json.toString()); } public void output_json(String key, Object value) throws IOException { output_json(new String[]{key}, new Object[]{value}); } public void error(int code, String...msg) throws IOException { if(msg.length>0) response.sendError(code, msg[0]); else response.sendError(code); } public void forbidden() throws IOException { error(HttpServletResponse.SC_FORBIDDEN); } public void not_found() throws IOException { error(HttpServletResponse.SC_NOT_FOUND); } public ServletContext context() { return context; } public HttpSession session() { return session; } public HttpSession session(boolean create) { return (session==null && create)?(session=request.getSession()):session; } public Object sessionAttr(String attr) { HttpSession ssn = session(); return (ssn!=null)?ssn.getAttribute(attr):null; } public HttpServletRequest request() { return request; } public HttpServletResponse response() { return response; } public Cookie cookie(String name) { return cookies.get(name); } public void cookie(String name, String value, int max_age, boolean all_sub_domain) { RequestUtils.setCookie(request, response, name, value, max_age, all_sub_domain); } public void deleteCookie(String name,boolean all_domain) { RequestUtils.deleteCookie(request, response, name, all_domain); } public String header(String name) { return request.getHeader(name); } public void header(String name, String value) { response.setHeader(name, value); } public void header(String name, int value) { response.setIntHeader(name, value); } public void header(String name, long value) { response.setDateHeader(name, value); } /** * 将HTTP请求参数映射到bean对象中 * @param req * @param beanClass * @return * @throws Exception */ public <T> T form(Class<T> beanClass) { try{ T bean = beanClass.newInstance(); BeanUtils.populate(bean, request.getParameterMap()); return bean; }catch(Exception e) { throw new ActionException(e.getMessage()); } } /** * 返回当前登录的用户资料 * @return */ public IUser user() { return User.GetLoginUser(request); } /** * 保存登录信息 * @param req * @param res * @param user * @param save */ public void saveUserInCookie(IUser user, boolean save) { String new_value = _GenLoginKey(user, ip(), header("user-agent")); int max_age = save ? MAX_AGE : -1; deleteCookie(COOKIE_LOGIN, true); cookie(COOKIE_LOGIN,new_value,max_age,true); } public void deleteUserInCookie() { deleteCookie(COOKIE_LOGIN, true); } /** * 3.0 以上版本的 Resin 无需对URL参数进行转码 * @return */ private final static boolean _CheckResinVersion() { try{ Class<?> verClass = Class.forName("com.caucho.Version"); String ver = (String)verClass.getDeclaredField("VERSION").get(verClass); String mainVer = ver.substring(0, ver.lastIndexOf('.')); /** float fVer = Float.parseFloat(mainVer); System.out.println("----------------> " + fVer); */ return Float.parseFloat(mainVer) > 3.0; }catch(Throwable t) {} return false; } /** * 自动解码 * @author liudong */ private static class RequestProxy extends HttpServletRequestWrapper { private String uri_encoding; RequestProxy(HttpServletRequest request, String encoding){ super(request); this.uri_encoding = encoding; } /** * 重载getParameter */ public String getParameter(String paramName) { String value = super.getParameter(paramName); return _DecodeParamValue(value); } /** * 重载getParameterMap */ @SuppressWarnings({ "unchecked", "rawtypes" }) public Map<String, Object> getParameterMap() { Map params = super.getParameterMap(); HashMap<String, Object> new_params = new HashMap<String, Object>(); Iterator<String> iter = params.keySet().iterator(); while(iter.hasNext()){ String key = (String)iter.next(); Object oValue = params.get(key); if(oValue.getClass().isArray()){ String[] values = (String[])params.get(key); String[] new_values = new String[values.length]; for(int i=0;i<values.length;i++) new_values[i] = _DecodeParamValue(values[i]); new_params.put(key, new_values); } else{ String value = (String)params.get(key); String new_value = _DecodeParamValue(value); if(new_value!=null) new_params.put(key,new_value); } } return new_params; } /** * 重载getParameterValues */ public String[] getParameterValues(String arg0) { String[] values = super.getParameterValues(arg0); for(int i=0;values!=null&&i<values.length;i++) values[i] = _DecodeParamValue(values[i]); return values; } /** * 参数转码 * @param value * @return */ private String _DecodeParamValue(String value){ if (StringUtils.isBlank(value) || StringUtils.isBlank(uri_encoding) || StringUtils.isNumeric(value)) return value; try{ return new String(value.getBytes("8859_1"), uri_encoding); }catch(Exception e){} return value; } } private static boolean _IsMultipart(HttpServletRequest req) { return ((req.getContentType() != null) && (req.getContentType() .toLowerCase().startsWith("multipart"))); } /** * 生成用户登录标识字符串 * @param user * @param ip * @param user_agent * @return */ public static String _GenLoginKey(IUser user, String ip, String user_agent) { StringBuilder sb = new StringBuilder(); sb.append(user.getId()); sb.append('|'); sb.append(user.getPwd()); sb.append('|'); sb.append(ip); sb.append('|'); sb.append((user_agent==null)?0:user_agent.hashCode()); sb.append('|'); sb.append(System.currentTimeMillis()); return _Encrypt(sb.toString()); } /** * 加密 * @param value * @return * @throws Exception */ private static String _Encrypt(String value) { byte[] data = CryptUtils.encrypt(value.getBytes(), E_KEY); try{ return URLEncoder.encode(new String(Base64.encodeBase64(data)), UTF_8); }catch(UnsupportedEncodingException e){ return null; } } /** * 解密 * @param value * @return * @throws Exception */ private static String _Decrypt(String value) { try { value = URLDecoder.decode(value,UTF_8); if(StringUtils.isBlank(value)) return null; byte[] data = Base64.decodeBase64(value.getBytes()); return new String(CryptUtils.decrypt(data, E_KEY)); } catch (UnsupportedEncodingException excp) { return null; } } /** * 从cookie中读取保存的用户信息 * @param req * @return */ public IUser getUserFromCookie() { try{ Cookie cookie = cookie(COOKIE_LOGIN); if(cookie!=null && StringUtils.isNotBlank(cookie.getValue())){ return userFromUUID(cookie.getValue()); } }catch(Exception e){} return null; } /** * 从cookie中读取保存的用户信息 * @param req * @return */ public IUser userFromUUID(String uuid) { if(StringUtils.isBlank(uuid)) return null; String ck = _Decrypt(uuid); final String[] items = StringUtils.split(ck, '|'); if(items.length == 5){ String ua = header("user-agent"); int ua_code = (ua==null)?0:ua.hashCode(); int old_ua_code = Integer.parseInt(items[3]); if(ua_code == old_ua_code){ return new IUser(){ public boolean IsBlocked() { return false; } public long getId() { return NumberUtils.toLong(items[0],-1L); } public String getPwd() { return items[1]; } public byte getRole() { return IUser.ROLE_GENERAL; } }; } } return null; } public final static String COOKIE_LOGIN = "oscid"; private final static int MAX_AGE = 86400 * 365; private final static byte[] E_KEY = new byte[]{'1','2','3','4','5','6','7','8'}; }
RequestContext的用例的全局过滤器源码:
package my.mvc; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import my.db.DBManager; /** * 全局过滤器 * @author Winter Lau * @date 2010-1-13 下午08:36:18 */ public class ControllerFilter implements Filter { private ServletContext context; /** * 过滤器初始化 */ public void init(FilterConfig cfg) throws ServletException { this.context = cfg.getServletContext(); } /** * 执行过滤操作 */ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)res; RequestContext rc = RequestContext.begin(this.context, request, response); if(rc.uri().indexOf("/.svn/")>=0){ rc.forbidden(); return ; } try{ chain.doFilter(rc.request(), rc.response()); }finally{ if(rc!=null) rc.end(); DBManager.closeConnection(); } } /** * 过滤器释放资源 */ public void destroy() { } }
发表评论
-
消息中间件和JMS
2013-06-03 10:21 823当前,CORBA、DCOM、RMI等 ... -
失血模型-贫血模型-充血模型-胀血模型
2012-07-20 13:21 2137一、失血模型 失血模型简单来说,就是domain ob ... -
JSP中文验证码
2012-05-14 17:18 1251以上两篇文章的内容介绍了有关JSP中产生数字验证码跟中文验证 ... -
Javamail中的常见中文乱码问题与解决办法
2011-09-09 09:48 1702在使用javamail api开发邮件服务系统时,我们常常会碰 ... -
ZK框架简介
2011-07-21 08:08 13781、ZK框架简介 ZK框架是 ... -
Tiles使用简介
2011-06-23 14:32 1271最新喜欢看一看一些比较“老旧”的技术,感觉这些 ... -
Apache Commons DbUtils快速上手
2011-06-18 10:58 1384最近喜欢看一些技术比较“老旧”的东西,虽然所实现的技术老 ... -
Xdoclet用于servlet
2011-03-24 11:26 870web.xm和taglib 作servlet映射是个讨厌的工 ... -
JSF生命周期监听
2011-03-11 18:10 1277这里有一点代码, 一个 PhaseListener ... -
自定义jsp标记库简介
2011-03-11 18:08 8191. 基本步骤 实例-输出“hello,eking” 1) ... -
组合Servlet+Freemarker的两种方法
2011-03-06 12:52 1517Servlet的轻巧高效,Freemarker的强大简便 ... -
Apache开源项目分类列表
2011-01-12 15:45 1080分类 项目名 说明 开发 ... -
myeclipse快捷键
2010-11-26 09:45 780MyEclipse 快捷键[转载] ... -
MyEclipse Content Assist
2010-11-26 09:39 1064问题描述: 在使用MyEclipse 6中不能使用 al ... -
删除eclipse的configuration目录
2010-07-07 10:27 3148eclipse 3.4以前的版本,如果出现什么问题了, ... -
JasperReports和iReport制作报表
2010-06-25 13:40 1378最近使用了JasperReports ... -
Lucene版Hello world
2010-06-04 18:38 19701、首先从lucene官网上下载lucene2.4.0(也可以 ... -
用p6spy查看HIBERNATE生成的SQL
2010-06-02 15:52 2191P6Spy是一个可以用来在应用程序中拦截和修改数据操作 ... -
hibernate id Generator详解
2010-06-02 15:16 1346Hibernate中,<id>标签 ...
相关推荐
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
2024免费毕业设计成品,包括源码+数据库+往届论文资料 录屏:https://www.bilibili.com/video/BV19H4y1F77r 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
HarmonyOSNext元服务开发快速入门.docx
java java的课程作业,用swing写一个小游戏.zip
基于欧姆龙Omron PLC与MCGS技术的四层电梯控制仿真系统设计——精细掌控,安全可靠的高级方案,No.952 基于欧姆龙Omron PLC和MCGS的4层四层电梯控制仿真系统设计 ,基于欧姆龙Omron PLC; MCGS; 4层电梯控制; 仿真系统设计; 控制系统设计,欧姆龙PLC与MCGS协同的四层电梯控制仿真系统设计
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
基于S7-300 PLC与组态王的散装水泥生产线在线称重控制系统设计与实现,No.892 S7-300 PLC和组态王散装水泥生产线在线称重控制系统设计 ,核心关键词:S7-300 PLC; 组态王; 散装水泥生产线; 在线称重; 控制系设计; 892号。,"S7-300 PLC与组态王结合的散装水泥生产线称重控制系统设计"
【C#分布式】DTM分布式事务的示例代码
"深入探讨两阶段鲁棒优化指导:分布鲁棒性的挑战与KKT函数经典代码实现",两阶段鲁棒优化指导,分布鲁棒,kkt函数附带经典代码 ,两阶段鲁棒优化指导; 分布鲁棒; kkt函数; 经典代码;,两阶段鲁棒优化指导下的分布鲁棒KKT函数经典代码
一、项目简介 本项目是一套基于SpringBoot+mybatis+maven+mysql实现的医院挂号就诊管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值 二、技术实现 jdk版本:1.8 及以上 ide工具:IDEA或者eclipse 数据库: mysql5.5及以上 后端:spring+springboot+mybatis+maven+mysql 前端: vue , css,js , elementui 三、系统功能 1、系统角色主要包括:管理员、医生、用户 2、系统主要功能包括: 首页 个人中心 修改密码 个人信息 管理员管理 在线咨询管理 挂号管理 健康教育管理 健康教育类型管理 公告类型管理 可是管理 职位管理 公告信息管理 医生管理 用户管理 轮播图管理等功能 详见 https://flypeppa.blog.csdn.net/article/details/145483185
# 基于Arduino的超声波除垢系统 ## 项目简介 本项目是一个基于Arduino的超声波除垢系统,旨在通过超声波技术防止设备表面结垢。系统采用多个Arduino Pro Mini控制器,每个控制器负责一个超声波通道,并通过PWM信号驱动MOSFET来生成超声波输出。系统还具备电压监控和温度检测功能,以确保设备在安全条件下运行。 ## 项目的主要特性和功能 1. 多通道超声波驱动每个通道由一个独立的Arduino Pro Mini控制,通过PWM信号驱动MOSFET生成超声波输出。 2. 频率可调支持从200Hz到250KHz的频率范围,并可通过PWM控制输出功率。 3. 电压监控系统能够监控输入电压,根据电压水平自动调整超声波输出的功率。 4. 温度检测与保护内置温度传感器,当温度过高时,系统会自动进入休眠模式以防止过热。 5. LED状态指示通过LED闪烁模式指示系统状态,便于用户快速了解系统运行情况。
2024免费毕业设计成品,包括源码+数据库+往届论文资料 录屏:https://www.bilibili.com/video/BV1hi421h7bZ 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
基于spring boot的学生在线训练考试系统设计与实现_w8w5x0a2.zip
"基于电流矢量闭环控制的改进if控制策略研究:优化电机控制效率与抗扰动能力",改进的if控制策略研究,传统的if控制严重依赖于电机的机械特性,导致易失步,带载能力弱,抗负载扰动能力差,效率低下。 采用改进的电流矢量闭环控制策略,能将电流控制在最优角度上,大大提高控制效率,且转速和电流能跟随转速和负载自适应调节,抗扰动能力大幅提升,转速波动更小。 ,改进的if控制策略; 电流矢量闭环控制; 抗扰动能力; 转速波动,改进电流矢量控制策略提升电机性能
1、资源内容地址:https://blog.csdn.net/2301_79696294/article/details/145039101 2、数据特点:今年全新,手工精心整理,放心引用,数据来自权威,且标注《数据来源》,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题 3、适用对象:大学生,本科生,研究生小白可用,容易上手!!! 4、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理
【Python】基于python的名片管理系统项目_pgj