☀️苏州程序大白一文让你学会Java Servlet基础☀️《❤️记得收藏❤️》

Java 专栏收录该内容
9 篇文章 15 订阅

目录

🏳️‍🌈开讲啦!!!!🏳️‍🌈苏州程序大白🏳️‍🌈

🌟博主介绍

💂 个人主页:苏州程序大白

🤟作者介绍:中国DBA联盟(ACDU)成员,CSDN全国各地程序猿(媛)聚集地管理员。目前从事工业自动化软件开发工作。擅长C#、Java、机器视觉、底层算法等语言。2019年成立柒月软件工作室。

💬如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)和C#、Halcon、python+opencv、VUE、各大公司面试等一些订阅专栏哦

🎗️ 承接各种软件开发项目

💅 有任何问题欢迎私信,看到会及时回复

👤 微信号:stbsl6,微信公众号:苏州程序大白

🎯 想加入技术交流群的可以加我好友,群里会分享学习资料

在这里插入图片描述

🍇1、前言

Java Web 程序中,Servlet 主要负责接受用户请求 HttpServletRequest,在 doget ()doPost ()中做相应的处理,并将回应 HttpServletResponse反馈给用户。

Servlet可以设置初始化参数,供 Servlet 内部使用。

一个Servlet 类只会有一个实例,在它的初始化时调用init () 方法,销毁时调用destroy () 方法

Servlet需要在 web.xml 中配置(MyEclipse 中创建 Servlet 会自动配置),一个 Servlet 可以设置多个 URL 访问

Servlet 不是线程安全,因此要谨慎使用类变量。

🍈2、阐述 Servlet 和 CGI 的区别?

CGI 的不足之处:

1、需要为每个请求启动一个操作 CGI 程序的系统进程。如果请求频繁,这将会带来很大的开销。

2、需要为每个请求加载和运行一个 CGI 程序,这将带来很大的开销.

3、需要重复编写处理网络协议的代码以及编码,这些工作都是非常耗时的。

Servlet 的优点:

1、只需要启动一个操作系统进程以及加载一个 JVM,大大降低了系统的开销。

2、如果多个请求需要做同样处理的时候,这时候只需要加载一个类,这也大大降低了开销。

3、所有动态加载的类可以实现对网络协议以及请求解码的共享,大大降低了工作量。

4、Servlet 能直接和 Web 服务器交互,而普通的 CGI 程序不能。Servlet 还能在各个程序之间共享数据,使数据库连接池之类的功能很容易实现。

补充:Sun Microsystems 公司在 1996 年发布 Servlet 技术就是为了和 CGI 进行竞争,Servlet 是一个特殊的 Java 程序,一个基于 Java 的 Web 应用通常包含一个或多个 Servlet 类 。Servlet 不能够自行创建并执行,它是在 Servlet 容器中运行的,容器将用户的请求传递给 Servlet 程序,并将 Servlet 的响应回传给用户。通常一个 Servlet 会关联一个或多个 JSP 页面。以前 CGI 经常因为性能开销上的问题被诟病,然而 Fast CGI 早就已经解决了 CGI 效率上的问题,所以面试的时候大可不必信口开河的诟病 CGI,事实上有很多你熟悉的网站都使用了 CGI 技术。

🍉3、Servlet 接口中有哪些方法及 Servlet 生命周期探秘

Servlet 接口定义了 5 个方法,其中前三个方法与 Servlet 生命周期相关:

void init (ServletConfig config) throws ServletException
voio servivce (ServlerRequest req, ServletResponse resp ) throws ServletException,java.io.IoException
void destroy()
java.lang.String getServletInfo()
ServletConfing getServletConfing()

生命周期: Web 容器加载Servlet 并将其实例化后,Servlet 生命周期开始,容器运行其 init () 方法进行 Servlet 的初始化;

请求到达时调用 Servletservice() 方法 ,service () 方法会根据需要调用与请求对应的doGetdoPost 等方法;

当服务器关闭或项目被卸载时服务器会将 Servlet 实例销毁,此时会调用 Servlet 的 destroy () 方法。

init 方法和 destroy 方法只会执行一次,service 方法客户端每次请求 Servlet 都会执行。

ervlet 中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入 init 方法中,销毁资源的代码放入 destroy 方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。

🍊4、get 和 post 请求的区别

可以把 getpost 当作两个不同的行为,两者并没有什么本质区别,底层都是TCP 连接get 请求 用来从服务器上获得资源,而 post 是用来向服务器提交数据。比如你要获取人员列表可以用 get 请求 ,你需要创建一个人员可以用 post 。这也是 Restful API 最基本的一个要求。

最直观的区别就是 GET 把参数包含在 URL 中,POST 通过 request body 传递参数。

  • GET 在浏览器回退时是无害的,而 POST 会再次提交请求。

  • GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以。

  • GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。

  • GET 请求只能进行 url 编码,而 POST 支持多种编码方式。

  • GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。

  • GET 请求在 URL 中传送的参数是有长度限制的,而 POST 么有。

  • 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。

  • GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。

  • GET 参数通过 URL 传递,POST 放在 Request body 中。

其实,GET 和 POST 本质上没有区别:

GET 和 POST 是什么HTTP 协议 中的两种发送请求的方法。

HTTP 是什么HTTP 是基于 TCP/IP 的关于数据如何在万维网中如何通信的协议。

HTTP 的底层TCP/IP 。所以 GETPOST 的底层也是 TCP/IP ,也就是说,GET/POST 都是 TCP 链接。GET 和 POST 能做的事情是一样一样的。你要给 GET 加上request body ,给 POST 带上url 参数,技术上是完全行的通的。

在我大万维网世界中,TCP 就像汽车,我们用 TCP 来运输数据,它很可靠,从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则 HTTP 诞生了。

HTTP 给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE 等等 ,HTTP 规定,当执行 GET 请求的时候,要给汽车贴上 GET 的标签 (设置 method 为 GET) ,而且要求把传送的数据放在车顶上(url 中)以方便记录。如果是 POST 请求,就要在车上贴上 POST 的标签,并把货物放在车厢里。当然,你也可以在 GET 的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在 POST 的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP 只是个行为准则,而 TCP 才是 GET 和 POST 怎么实现的基本。

但是,我们只看到HTTPGETPOST 参数的传送渠道(url 还是 requrest body)提出了要求。“标准答案” 里关于参数大小的限制又是从哪来的呢?

在我大万网络世界中,还有另一个重要的角色:运输公司。不同的浏览器(发起 http 请求)和服务器(接受 http 请求)就是不同的运输公司。 虽然理论上,你可以在车顶上无限的堆货物(url 中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。业界不成文的规定是,(大多数)浏览器通常都会限制 url 长度在 2K 个字节,而(大多数)服务器最多处理 64K 大小的 url。超过的部分,恕不处理。如果你用 GET 服务,在request body 偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸载,读出数据,有些服务器直接忽略,所以,虽然 GET 可以带 request body,也不能保证一定能被接收到哦。

GET 和 POST 本质上就是 TCP 链接,并无差别。但是由于 HTTP 的规定和浏览器 / 服务器的限制,导致他们在应用过程中体现出一些不同。

GET 和 POST 还有一个重大区别,简单的说:

GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。

对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);
而对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 (返回数据)。

也就是说,GET 只需要汽车跑一趟就把货送到了,而 POST 得跑两趟,第一趟,先去和服务器打个招呼 “嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。

因为 POST 需要两步,时间上消耗的要多一点,看起来 GET 比 POST 更有效。因此 Yahoo 团队有推荐用 GET 替换 POST 来优化网站性能。但这是一个坑!为什么?

1、GET 与 POST 都有自己的语义,不能随便混用。

2、据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的 TCP 在验证数据包完整性上,有非常大的优点。

3、并不是所有浏览器都会在 POST 中发送两次包,Firefox 就只发送一次。

🍋5、什么情况下调用 doGet () 和 doPost ()?

Form 标签里的 method 的属性get 时调用 doGet (),为 post 时调用 doPost ()

🍌6、转发 (Forward) 和重定向 (Redirect) 的区别

在这里插入图片描述

转发是服务器行为,重定向是客户端行为。

转发(Forward)
通过 RequestDispatcher 对象的 forward(HttpServletRequest request,HttpServletResponse response)方法实现的。RequestDispatcher 可以通过 HttpServletRequestgetRequestDispatcher () 方法获得。

例如下面的代码就是跳转到 login_success.jsp 页面。

request.getRequeDispatcher("login_success.jsp").forward(request,response);

重定向(Redirect) 是利用服务器返回的状态码来实现的。

客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过 HttpServletResponsesetStatus (int status) 方法设置状态码。如果服务器返回 301 或者 302,则浏览器会到新的网址重新请求该资源。

1、从地址栏显示来说

  • forward 是服务器请求资源,服务器直接访问目标地址的 URL, 把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。

  • redirect 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。所以地址栏显示的是新的 URL。

2、从数据共享来说

  • forward: 转发页面和转发到的页面可以共享 request 里面的数据。

  • redirect: 不能共享数据。

3、从运用地方来说

  • forward: 一般用于用户登陆的时候,根据角色转发到相应的模块。

  • redirect: 一般用于用户注销登陆时返回主页面和跳转到其它的网站等。

4、从效率来说

  • forward: 高。

  • redirect: 低。

🍍7、自动刷新 (Refresh)

自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动刷新本页面。

Servlet 中通过 HttpServletResponse 对象设置 Header 属性实现自动刷新例如:

Response.setHeader("Refresh","5;" "URL=https://csdnimg.cn/release/blogv2/dist/pc/img/newCommentBlack.png");

其中 5 为时间,单位为秒。URL 指定就是要跳转的页面(如果设置自己的路径,就会实现每过 5 秒自动刷新本页面一次)

🍎8、Servlet 与线程安全

在这里插入图片描述

Servlet 不是线程安全的,多线程并发的读写会导致数据不同步的问题。

解决的办法是尽量不要定义 name 属性,而是要把 name 变量分别定义在 doGet ()doPost ()方法内。

虽然使用synchronized (name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。

注意:多线程的并发的读写 Servlet 类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此 Servlet 里的只读属性最好定义为 final 类型的。

🍏9、JSP 和 Servlet 是什么关系

其实这个问题在上面已经阐述过了,Servlet 是一个特殊的 Java 程序,它运行于服务器的 JVM 中,能够依靠服务器的支持向浏览器提供显示内容。

JSP 本质上是 Servlet的一种简易形式,JSP 会被服务器处理成一个类似于 Servlet 的 Java 程序,可以简化页面内容的生成。ServletJSP 最主要的不同点在于,Servlet的应用逻辑是在 Java 文件中,并且完全从表示层中的 HTML 分离开来。

JSP的情况是 JavaHTML可以组合成一个扩展名为.jsp 的文件

有人说,Servlet就是在 Java 中写 HTML,而 JSP 就是在 HTML 中写 Java 代码,当然这个说法是很片面且不够准确的。

JSP侧重于视图,Servlet更侧重于控制逻辑,在 MVC 架构模式中,JSP 适合充当视图(view)而 Servlet 适合充当控制器(controller)。

🍐10、JSP 工作原理

在这里插入图片描述
JSP 是一种 Servlet,但是与 HttpServlet的工作方式不太一样。HttpServlet是先由源代码编译为class 文件后部署到服务器下,为先编译后部署。而 JSP 则是先部署后编译。

JSP 会在客户端第一次请求 JSP 文件时被编译为 HttpJspPage 类(接口 Servlet 的一个子类)。该类会被服务器临时存放在服务器工作目录里面。

下面通过实例给大家介绍。 工程 JspLoginDemo 下有一个名为 login.jsp 的 Jsp 文件,把工程第一次部署到服务器上后访问这个 Jsp 文件,我们发现这个目录下多了下图这两个东东。 .class 文件便是 JSP 对应的 Servlet。编译完毕后再运行 class 文件来响应客户端请求。以后客户端访问 login.jsp 的时候,Tomcat 将不再重新编译 JSP 文件,而是直接调用 class 文件来响应客户端请求。

在这里插入图片描述
由于 JSP 只会在客户端第一次请求的时候被编译 ,因此第一次请求 JSP 时会感觉比较慢,之后就会感觉快很多。如果把服务器保存的 class 文件删除,服务器也会重新编译 JSP

开发 Web 程序时经常需要修改 JSP。Tomcat 能够自动检测到 JSP 程序的改动。如果检测到 JSP 源代码发生了改动。Tomcat会在下次客户端请求 JSP 时重新编译 JSP,而不需要重启 Tomcat。这种自动检测功能是默认开启的,检测改动会消耗少量的时间,在部署 Web 应用的时候可以在 web.xml 中将它关掉。

🍑11、JSP 有哪些内置对象、作用分别是什么?

在这里插入图片描述

JSP 有 9 个内置对象:

  • request:封装客户端的请求,其中包含来自 GET 或 POST 请求的参数。

  • response:封装服务器对客户端的响应。

  • pageContext:通过该对象可以获取其他对象。

  • session:封装用户会话的对象。

  • application:封装服务器运行环境的对象。

  • out:输出服务器响应的输出流对象。

  • config:Web 应用的配置对象。

  • page:JSP 页面本身(相当于 Java 程序中的 this)。

  • exception:封装页面抛出异常的对象。

🍒12、Request 对象的主要方法有哪些?

  • setAttribute (String name,Object):设置名字为 name 的 request 的参数值。

  • getAttribute (String name):返回由 name 指定的属性值。

  • getAttributeNames ():返回 request 对象所有属性的名字集合,结果是一个枚举的实例。

  • getCookies ():返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组。

  • getCharacterEncoding ():返回请求中的字符编码方式 = getContentLength () :返回请求的 Body 的长度。

  • getHeader (String name):获得 HTTP 协议定义的文件头信息。

  • getHeaders (String name):返回指定名字的 request Header 的所有值,结果是一个枚举的实例。

  • getHeaderNames ():返回所以 request Header 的名字,结果是一个枚举的实例。

  • getInputStream ():返回请求的输入流,用于获得请求中的数据。

  • getMethod ():获得客户端向服务器端传送数据的方法。

  • getParameter (String name) :获得客户端传送给服务器端的有 name 指定的参数值。

  • getParameterNames ():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例。

  • getParameterValues (String name):获得有 name 指定的参数的所有值。

  • getProtocol ():获取客户端向服务器端传送数据所依据的协议名称。

  • getQueryString () :获得查询字符串。

  • getRequestURI ():获取发出请求字符串的客户端地址。

  • getRemoteAddr ():获取客户端的 IP 地址。

  • getRemoteHost ():获取客户端的名字。

  • getSession ([Boolean create]):返回和请求相关 Session。

  • getServerName () :获取服务器的名字。

  • getServletPath ():获取客户端所请求的脚本文件的路径。

  • getServerPort ():获取服务器的端口号。

  • removeAttribute (String name):删除请求中的一个属性。

🍓13、request.getAttribute () 和 request.getParameter () 有何区别

1、从获取方向来看:

getParameter () 是获取 POST/GET 传递的参数值。

getAttribute () 是获取对象容器中的数据值。

2、从用途来看:

getParameter () 用于客户端重定向时,即点击了链接或提交按扭时传值用,即用于在用表单或 url 重定向传值时接收数据用。

getAttribute () 用于服务器端重定向时,即在 sevlet 中使用了 forward 函数,或 struts 中使用了 mapping.findForward

getAttribute 只能收到程序用 setAttribute 传过来的值。

另外,可以用 setAttribute () , getAttribute () 发送接收对象。而 getParameter () 显然只能传字符串。 setAttribute () 是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另一个页面时,应用服务器会把这块内存拷贝另一个页面所对应的内存中。这样 setAttribute () 就能取得你所设下的值,当然这种方法可以传对象。session 也一样,只是对象在内存中的生命周期不一样而已。getParameter () 只是应用服务器在分析你送上来的 request 页面的文本时,取得你设在表单或 url 重定向时的值。

3、最后总结:

getParameter () 返回的是 String, 用于读取提交的表单中的值;(获取之后会根据实际需要转换为自己需要的相应类型,比如整型,日期类型啊等等)getAttribute () 返回的是 Object,需进行转换,可用 setAttribute () 设置成任意对象,使用很灵活,可随时用。

🥝14、include 指令 include 的行为的区别

include 指令: JSP 可以通过 include 指令来包含其他文件。被包含的文件可以是 JSP 文件、HTML 文件或文本文件。包含的文件就好像是该 JSP 文件的一部分,会被同时编译执行。

语法格式如下:

 <%@ include file=” 文件相对 url 地址” %>

include 动作: 动作元素用来包含静态和动态的文件。该动作把指定文件插入正在生成的页面。

语法格式如下:

 <jsp:include page=” 相对 URL 地址” flush=”true” />

🍅15、讲解 JSP 中的四种作用域

JSP 中的四种作用域包括 page、request、session 和 application,具体来说:

1、page 代表与一个页面相关的对象和属性。

2、request 代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。

3、session 代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。

4、application 代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。

🥥16、如何实现 JSP 或 Servlet 的单线程模式

对于 JSP 页面,可以通过 page 指令进行设置。<%@page isTreadSafe=”false”%>

对于 Servlet,可以让自定义的 Servlet 实现 SingleThreadModel 标识接口。

说明:如果将 JSP 或 Servlet 设置成单线程工作模式,会导致每个请求创建一个 Servlet 实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。

🥑17、实现会话跟踪的技术有哪些

1、使用 Cookie

向客户端发送 Cookie

Cookie c=new Cookie ("name","value");
c.setMaxAge(60*60*24);
response.addCookie(c);

从客户端读取 Cookie

String name= "name";
Cookie[]cookies = request.getCookies();
if(cookies  ! = null){
for(int  i=0;i<cookies.length;i++){
Cookie cookie  =cookies[i];
if(name.equals(cookis.getName()))
ciikue.getValue();
}
}

优点:数据可以持久保存,不需要服务器资源,简单,基于文本的 Key-Value。

缺点:大小受到限制,用户可以禁用 Cookie 功能,由于保存在本地,有一定的安全风险。

2、URL 重写

在 URL 中添加用户会话的信息作为请求的参数,或者将唯一的会话 ID 添加到 URL 结尾以标识一个会话。

优点: 在 Cookie 被禁用的时候依然可以使用

缺点: 必须对网站的 URL 进行编码,所有页面必须动态生成,不能用预先记录下来的 URL 进行访问。

3、隐藏的表单域

< input  tupe="hidden"   name= " seeion"  value =" ..."/>

优点: Cookie 被禁时可以使用。

缺点: 所有页面必须是表单提交之后的结果。

4、HttpSession

在所有会话跟踪技术中,HttpSession 对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建 HttpSession,每个用户可以访问他自己的HttpSession

可以通过 HttpServletRequest 对象getSession 方法获得 HttpSession,通过 HttpSessionsetAttribute 方法可以将一个值放在HttpSession中,通过调用 HttpSession 对象getAttribute 方法,同时传入属性名就可以获取保存在 HttpSession 中的对象

与上面三种方式不同的 是,HttpSession放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的 Servlet 容器可以在内存将满时将HttpSession中的对象移到其他存储设备中,但是这样势必影响性能。

添加到 HttpSession中的值可以是任意 Java 对象,这个对象最好实现了 Serializable 接口,这样 Servlet 容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。

🍆18、Cookie 和 Session 的的区别

在这里插入图片描述
1、Cookie 和 Session 都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。

2、Cookie 一般用来保存用户信息 比如:

  • ①我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了。

  • ②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可 (为了安全考虑,重新登录一般要将 Token 重写)。

  • ③登录一次网站后访问网站其他页面不需要重新登录。Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。

3、Cookie 数据保存在客户端 (浏览器端),Session 数据保存在服务器端。

4、Cookie 存储在客户端中,而 Session 存储在服务器上,相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。

🌟作者相关的文章、资源分享🌟

🌟让天下没有学不会的技术🌟

学习C#不再是难问题

🌳《C#入门到高级教程》🌳

有关C#实战项目

👉C#RS232C通讯源码👈

👉C#委托数据传输👈

👉C# Modbus TCP 源代码👈

👉C# 仓库管理系统源码👈

👉C# 欧姆龙通讯Demo👈

👉C#+WPF+SQL目前在某市上线的车管所摄像系统👈

👉2021C#与Halcon视觉通用的框架👈

👉2021年视觉项目中利用C#完成三菱PLC与上位机的通讯👈

👉VP联合开源深度学习编程(WPF)👈

✨有关C#项目欢迎各位查看个人主页✨

🌟机器视觉、深度学习🌟

学习机器视觉、深度学习不再是难问题

🌌《Halcon入门到精通》🌌

🌌《深度学习资料与教程》🌌

有关机器视觉、深度学习实战

👉2021年C#+HALCON视觉软件👈

👉2021年C#+HALCON实现模板匹配👈

👉C#集成Halcon的深度学习软件👈

👉C#集成Halcon的深度学习软件,带[MNIST例子]数据集👈

👉C#支持等比例缩放拖动的halcon WPF开源窗体控件👈

👉2021年Labview联合HALCON👈

👉2021年Labview联合Visionpro👈

👉基于Halcon及VS的动车组制动闸片厚度自动识别模块👈

✨有关机器视觉、深度学习实战欢迎各位查看个人主页✨

🌟Java、数据库教程与项目🌟

学习Java、数据库教程不再是难问题

🍏《JAVA入门到高级教程》🍏

🍏《数据库入门到高级教程》🍏

有关Java、数据库项目实战

👉Java经典怀旧小霸王网页游戏机源码增强版👈

👉js+css类似网页版网易音乐源码👈

👉Java物业管理系统+小程序源码👈

👉JavaWeb家居电子商城👈

👉JAVA酒店客房预定管理系统的设计与实现SQLserver👈

👉JAVA图书管理系统的研究与开发MYSQL👈

✨有关Java、数据库教程与项目实战欢迎各位查看个人主页✨

🌟分享Python知识讲解、分享🌟

学习Python不再是难问题

🥝《Python知识、项目专栏》🥝

🥝《Python 检测抖音关注账号是否封号程》🥝

🥝《手把手教你Python+Qt5安装与使用》🥝

🥝《用一万字给小白全面讲解python编程基础问答》🥝

🥝《Python 绘制Android CPU和内存增长曲线》🥝

有关Python项目实战

👉Python基于Django图书管理系统👈

👉Python管理系统👈

👉2021年9个常用的python爬虫源码👈

👉python二维码生成器👈

✨有关Python教程与项目实战欢迎各位查看个人主页✨

🌟分享各大公司面试题、面试流程🌟

面试成功不是难事

🍏《2021年金九银十最新的VUE面试题☀️《❤️记得收藏❤️》》🍏

🍏《只要你认真看完一万字☀️Linux操作系统基础知识☀️分分钟钟都吊打面试官《❤️记得收藏❤️》》🍏

🍏《❤️用一万字给小白全面讲解python编程基础问答❤️《😀记得收藏不然看着看着就不见了😀》》🍏

✨有关各大公司面试题、面试流程欢迎各位查看个人主页✨

在这里插入图片描述

🏳️‍🌈关注苏州程序大白,持续更新技术分享。谢谢大家支持🏳️‍🌈

在这里插入图片描述

❤️关注苏州程序大白公众号❤️


👇 👇👇

  • 10
    点赞
  • 7
    评论
  • 9
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值