Servlet注解和可插拔性(第八篇)

2023-11-05

8.1、注解和可插拔性

  • WEB-INF/classes 目录 编译java类
  • WEB-INF/lib jar库
  • 兼容Servlet 3.0的注解

8.1.1、@WebServlet 注解

  • 支持web请求,被注释类必须实现javax.servlet.http.HttpServlet

  • 例子

  • // 拦截/foo 的URI
    @WebServlet("/foo")
    public class CalculatorServlet extends HttpServlet{
      // ...
    }
    
    // 注解属性, 拦截/foo 或 /bar,  实现doGet方法
    @WebServlet(name="MyServlet", urlPatterns={"/foo", "/bar"})
    public class SampleUsingAnnotationAttributes extends HttpServlet{
      public void doGet(HttpServletRequest req, HttpServletResponse res)	{
        
      }
    }
    

8.1.2、@WebFilter (web过滤器)

  • 不能同时配置value和urlPatterns属性

  • 被@WebFilter 必须要实现javax.servlet.Filter接口

  • 例子

    • @WebFilter("/foo")
      public class MyFilter implements Filter{
        public void doFilter(HttpServletRequest req, HttpServletResponse res){
          // 实现doFilter方法
        }
      }
      

8.1.3、@WebInitParam

  • 初始化参数,它是WebServlet 和WebFilter的参数

8.1.4、@WebListener

  • web监听器,监听某些特定事件

  • 被@WebListener修饰的类,必须实现其中一个接口

    • javax.servlet.ServletContextListener
    • javax.servlet.ServletContextAttributeListener
    • javax.servlet.ServletRequestListener
    • javax.servlet.ServletRequestAttributeListener
    • javax.servlet.http.HttpSessionListener
    • javax.servlet.http.HttpSessionAttributeListener
    • javax.servlet.http.HttpSessionIdListener
  • 例子

    • @WebListener
      public class MyListener implements ServletContextListener{
        public void contextInitialized(ServletContextEvent sce){
          ServletContext sc = sce.getServletContext();
          sc.addServlet("myServlet", "Sample servlet","foo.bar.MyServlet", null, -1);
          sc.addServletMapping("myServlet", new String[]{
            "/urlpattern/*"
          })
        }
      }
      

8.1.5、@MultipartConfig

  • 如果用这个注解,需要支持mime/multipart 类型, 同时Servlet必须实现getParts和getPart方法
  • 配置中属性是绝对路径,如果配置相对路径,是相对于javax.servlet.context.tempdir, 这些路径都是需要通过java.io.File.isAbsolute的方法测试。

8.1.6、其他注解和约定

  • 其他全部注解都在15章
  • 每个应用都有默认的首页(index.htm(1) 和 index.jsp) ,这个配置在welcome-file-list中

8.2、可插拔性

8.2.1、模块化web.xml

  • 多个web-fragment.xml 组成一个web.xml 模块化

  • web-fragment.xml需要在jar的WEB-INF/lib目录下

  • 例子

  • <web-fragment> 
      <servlet>
    		<servlet-name>welcome</servlet-name>
       	 	<servlet-class>WelcomeServlet </servlet-class>
       </servlet>
       <listener>
    			<listener-class> RequestListener</listener-class> 
      </listener>
    </web-fragment>
    
    

8.2.2、web.xml 和web-fragment.xml的顺序

  1. 绝对顺序 在web.xml 有且只有一个 元素

    • 通过name去确定web-fragment.xml, 就算name不存在,也会处理
    • 可以配置
    • 重复name异常
  2. 相对顺序:web-fragment.xml有且只有一个元素

    • web.xm. 和WEB-INF/classes 必须在web-fragment标识ordering元素之前执行
    • 重复的name异常,需要打印错误日志,报错,部署失败,提示修复,可以使用绝对路径排序
  3. 例子

    • //web-fragment.xml
      <web-fragment>
      	<name>MyFragment1</name>
        <ordering>
        	<after>
          	<name>MyFragment2</name>
          </after>
        </ordering>
        ....
      </web-fragment>
      
      
      // web-fragment.xml
      <web-fragment>
      	<name>MyFrament2</name>
        ...
      </web-fragment>
      
      // web-fragment.xml
      <web-fragment>
      	<name>MyFrament3</name>
        <ordering>
        	<before>
          	<others/>
          </before>
        </ordering>
      </web-fragment>
      
      // web.xml
      <web-app>
      	...
      </web-app>
      
    • 上面处理过程

    • web.xml
      MyFrament3
      MyFrament2
      MyFrament1
      
    • 这个例子阐释一些,但不是全部,还有一些规则

    • 在某个元素之前执行,如果others表示在web-fragment最新执行

    • 在某个元素之后执行

    • (可以包含在 和 )

      • 如果在包含 会排在所有元素之前,如果有多个包含,那么这些包含 顺序无法确定
      • 与刚刚相反, 如果包含会排到最后,但是如果有多个包含,那么这些包含 顺序无法确定
      • 在或元素中,如果存在元素,但不是其父元素中唯一的元素,则在排序过程中必须考虑该父元素中的其他元素
      • 如果元素直接出现在元素内,则运行时必须确保处理顺序中的该点包括未在部分中明确命名的任何Web片段。
    • 如果web-fragment.xml和web.xml 不存在或 表示元素没有顺序要求

    • 如果出现循环依赖时候,需要抛出异常,部署失败,可能需要提示用户配置绝对路径

    • 例子(absolute-ordering)

      • //例子1
        // web.xml
        <web-app>
        	<absolute-ordering>
          	<name>MyFragment3</name>
        		<name>MyFragment2</name>
          </absolute-ordering>
          ...
        </web-app>
        
        在这个例子中元素执行顺序
        web.xml
        MyFragment3
        MyFragment2
        
    • 其他场景例子

      • //例子2
        片段A
        <after>
        	<others/>
          <name>C</name>
        </after>
        
        片段B
        <before>
        	<others/>
        </before>
        
        //片段C
        <after>
        	<others/>
        </after>
        // 片段D 、E 没有顺序
        //片段F
        <before>
        	<others/>
          <name>B</name>
        </before>
        
        最后顺序为  web.xml, F、B、D、E、C,A
        
      • //例子3
        片段 <no id/>:
        <after>
        	<others/>
        </after>
        <before>
        	<name>
          	C
          </name>
        <before>
          
          片段B
          <before>
          	<others/>
          </before>
         片段 C : 没有顺序
         片段 D:
          <after>
          	<others/>
          </after>
         片段 E:
          <before>
          	<others/>
          </before>
          片段 F: 没有顺序
          
         // 结果可能如下其中一种 B和E顺序不稳定, C,D,<noid>不稳定, 只知道,<noid/>一定在C之前
        ■ B,E,F,<noid>,C,D
        ■ B,E,F,<noid>,D,C
        ■ E,B,F,<noid>,C,D 
        ■ E,B,F,<noid>,D,C
        ■ E,B,F,D,<noid>,C
        
      • //例子4
        片段 A
        <after>
        	<name> B</name>
        </after>
        
        片段 B:没有顺序
        片段 C 
        <before>
        	<others/>
        </before>
        片段 D: 没有顺序
        
        //可以结果 C B D A     或 C D B A 或 C B A D
        

8.2.3、web.xml 、web-fragment.xml和注释组装描述符

  • 在定义监听器、servlet、过滤器时候,需要定义加载顺序,如果没有定义将使用如下规则
  1. 需要指定web-fragment.xm.或web.xml顺序

  2. 如果在web.xml和web-fragment.xml存在

    • Filters链 匹配的顺序是按照web.xml的配置顺序
    • servlet可以延迟初始化或立即初始化,如果立即初始化,那么这个初始化的顺序是按照load-on-startup元素配置的
    • 监听器在web.xml配置的调用顺序
      1. 监听器实现javax.servlet.ServletContextListener的contextInitialized方法和销毁方法contextDestroyed方法
      2. 监听器实现javax.servlet.ServletRequestLIstener的requestInitialized方法和requestDestroyed方法
      3. 实现javax.servlet.http.HttpSessionListener的sessionCreated 和销毁方法sessionDestroyed方法
      4. 实现javax.servlet.ServletContextAttributeListener, javax.servlet.ServletRequestAttributeListener, javax.servlet.HttpSessionAttributeListener 调用它对应事件将会触发
  3. 如果一个servlet配置enabled元素是禁用状态,那么这个servlet对应url-pattern将不可用

  4. 当web.xml 和 web-fragment.xml 出现冲突的时候, web.xml中元素具有最高优先级(最终有效)

  5. 如果没有配置metadata-complete元数据, 或者在描述符设置它为false,然后只能通过合并注解和描述符获取元数据, 合并规则如下:

    • web-fragment.xml可以配置参数作为web.xml配置使用(也就可以将web.xml部分配置移动某个web-fragment.xml中)

    • web-fragment具体配置参考8.2.2

    • 如果在web.xml中设置metadata-complete = true, 那么web-fragment.xml配置将会被忽略,如果在某一个web-fragment.xml 的metadata-complete 设置为true, 那么将会忽略absolute-ordering和ordering元素,只会扫描特定的jar的注解

    • 在metadata-complete设置true之前,web 片段都会合并到web.xml文件

    • 在合并web片段时候,以下是认为冲突了

      • 多个 元素, 有相同的 但是不同
      • 多个 元素,有相同 但是有不同
    • 冲突解决原则

      • 如果在web.xml 和web-fragment.xml 发生冲突,那么web.xml具有更高的优先级
      • 如果两个web-fragment.xml发生冲突,需要解决,部署失败
    • 解决冲突之后应该采用如下附加规则

      • 在不同web-fragment.xml 可以添加不同

      • 元素可以声明多次,最终还是以web.xml为准

      • 如果某个Web片段中存在一个最小出现次数为零且最大出现为1的元素,而在主web.xml中丢失了,则主web.xml将从该Web片段继承设置。 如果主web.xml和Web片段中都存在该元素,则优先于主web.xml中的配置设置。 例如,如果主web.xml和一个Web片段都声明了相同的servlet,并且该Web片段中的servlet声明指定了元素,而主web.xml中的那个则没有, 那么来自Web片段的元素将在合并的web.xml中使用。

      • 如果web.xml定义一个servlet,并没有配置 ,在两个web-fragement分别定义一个相同的servlet,但是它们配置的是不同的,这个时候将会有一个错误抛出,不能抉择

      • 是附加的

      • 在web.xml 和web-fragment.xml都声明了相同的, 那么最终都以web.xml

      • 如果在web.xml和web-fragment.xml有多个相同 最后以web.xml的f为准

      • 如果使用同一配置多个元素,被作为一个listener对待

      • 合并产生的web.xml仅当其所有Web片段也都标记为时,才被视为。

      • web-fragment中配置的顶级的 和它包含内部元素 和 都会被忽略

      • jsp-property-group 额外添加的,在配置静态资源(META-INF/resources目录下),推荐使用jsp-config 使用url-pattern元素,其web-fragment.xml建一个子目录,防止jsp-property-group影响根目录的jsp

    • 对于(env-entry, ejb-ref, ejb-local-ref, service-ref, resource-ref, resource-env-ref, message-destination-ref, persistence-context-ref 和 persistence-unit-ref) 引用遵循如下规则:

      • 简单来在web.xml和web-fragment.xml相同元素,以web.xml为主,例如web.xml和web-fragment.xml都声明 使用相同, 那么最终生效是web.xml中的的元素
      • 如果两个web-fragment.xml定义相同元素,只能抛出异常,不能确定那个生效
      • 对于web-fragment.xml的元素,这些元素会合并到web.xml
    • 在web-fragment.xml的其他注解合并规则(@Resource, @Resources, @EJB, @EJBs, @WebServiceRef, @WebServiceRefs, @PersistenceContext, @PersistenceContexts, @PersistenceUnit, 和 @PersistenceUnits)

      • 如果将资源引用注释应用于类,则它等同于定义资源,但是不等同于定义注入目标。 在这种情况下,以上规则适用于注入目标元素。
      • 如果在字段上使用资源引用注释,则等效于在web.xml中定义注入目标元素。 但是,如果描述符中没有注入目标元素,则来自片段的注入目标仍将合并到上述的web.xml中。
      • 另一方面,如果主web.xml中有一个注入目标,并且有一个具有相同资源名称的资源引用注释,则将其视为资源引用注释的替代。 在这种情况下,由于在描述符中指定了注入目标,因此除了覆盖资源引用注释的值之外,还将应用上面定义的规则。
    • 如果data-source 元素被定义到两个fragment中,不存在于web.xml中,这个时候抛出异常、部署失败。

      • 例子

      • web.xml 没有资源引用定义
        
        web-fragment.xml
        <resource-ref>
        	<resource-ref-name="foo">
          	...
            <injection-target>
            	<injection-target-class>
              	com.foo.Bar.class
              </injection-target-class>
              <injection-target-name>
              	baz
              </injection-target-name>
            </injection-target>
          </resource-ref-name>
        </resource-ref>
        
        // 最终结果
        <resource-ref>
        	<resource-ref-name="foo">
          	...
            <injection-target>
            	<injection-target-class>
              	com.foo.Bar.class
              </injection-target-class>
              <injection-target-name>
              	baz
              </injection-target-name>
            </injection-target>
          </resource-ref-name>
        </resource-ref>
      • web.xml
        <resource-ref>
        	<resource-ref-name="foo">
          </resource-ref-name>
          ...
        </resource-ref>
        
        片段1(web-fragment.xml)
        <resource-ref>
        	<resource-ref-name="foo">
          	
          </resource-ref-name>
          <injection-target>
          	<injection-target-class>
            	com.foo.Bar.class
            </injection-target-class>
            <injection-target-name>
            	baz
            </injection-target-name>
          </injection-target>
        </resource-ref>
        
        片段2(web-fragment.xml)
        <resource-ref>
        	<resource-ref-name="foo"></resource-ref-name>
          <injection-target>
          	<injection-target-class>
            	com.foo.Bar2.class
            </injection-target-class>
            <injection-target-name>
            	baz2
            </injection-target-name>
          </injection-target>
        </resource-ref>
        
        //最终结果
        <resource-ref>
        	<resource-ref-name="foo"></resource-ref-name>
          <injection-target>
          	<injection-target-class>
            	com.foo.Bar2.class
            </injection-target-class>
            <injection-target-name>
            	baz2
            </injection-target-name>
          </injection-target>
           <injection-target>
          	<injection-target-class>
            	com.foo.Bar.class
            </injection-target-class>
            <injection-target-name>
            	baz
            </injection-target-name>
          </injection-target>
        </resource-ref>
        
        
        
  • 例子

    • @WebServlet(urlPatterns="/MyPattern", initParams={@WebInitParam(name="ccc", value="333")})
      public class com.acme.Foo extends HttpServlet{
        ....
      }
      
      
      web.xml 
      <servlet>
      	<servlet-class>com.acme.Foo</servlet-class>
        <servlet-name>Foo</servlet-name>
        <init-param>
        	<param-name>aaa</param-name>
          <param-value>111</param-value>
        </init-param>
      </servlet>
      
      <servlet>
      	<servlet-class>com.acme.Foo</servlet-class>
        <servlet-name>Fum</servlet-name>
        <init-param>
        	<param-name>bbb</param-name>
          <param-value>222</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
      	<servlet-name>Foo</servlet-name>
        <url-pattern>/foo/*</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
      	<servlet-name>Fum</servlet-name>
        <url-pattern>/fum/*</url-pattern>
      </servlet-mapping>
      //因为使用注解没有与web.xml的servlet-name 的名称相同,相等于新增一个servlet,如下xml格式
      <servlet>
      	<servlet-class>com.acme.Foo</servlet-class>
        <servlet-name>com.acme.Foo</servlet-name>
        
       	<init-param>
        	<param-name>ccc</param-name>
          <param-value>333</param-value>
        </init-param>
      </servlet>
      
      
      //如果上面web.xml用如下替换
      <servlet>
      	<servlet-class>com.acme.Foo</servlet-class>
        <servlet-name>com.acme.Foo</servlet-name>
        <init-param>
        	<param-name>aaa</param-name>
          <param-value>111</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
      	<servlet-name>com.acme.Foo</servlet-name>
        <url-pattern>/foo/*</url-pattern>
      </servlet-mapping>
      与注解class WebServlet 组成最终有效的文件
      
      <servlet>
      	<servlet-class>com.acme.Foo</servlet-class>
        <servlet-name>com.acme.Foo</servlet-name>
        <init-param>
        	<param-name>aaa</param-name>
          <param-value>111</param-value>
        </init-param>
        <init-param>
        	<param-name>ccc</param-name>
          <param-value>333</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
      	<servlet-name>com.acme.Foo</servlet-name>
        <url-pattern>/foo/*</url-pattern>
      </servlet-mapping>
      
      

8.2.4、共享库/运行时可拔插性

  • HandlesTypes
  • ServletContainerInitializer

8.3、JSP容器插拔性

  • JSP容器处理jsp数据和TLD资源
  • servlet处理请求

8.4、处理注解和片段

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

Servlet注解和可插拔性(第八篇) 的相关文章

  • 02-JavaWeb之Servlet及相关知识点

    一 Servlet 简介 Java Servlet 是运行在 Web 服务器 tomcat 或应用服务器上的程序 它可以接收来自 Web 浏览器或其他 HTTP 客户端的请求 并进行结果的响应 使用 Servlet 可以收集来自网页表单的用
  • C++异常

    全文目录 概念 异常的抛出 在函数调用链中异常栈展开匹配原则 异常的重新抛出 异常安全 异常规范 C 标准库的异常体系 异常的优缺点 概念 C语言处理异常的方式 终止程序 返回错误码 很多系统的库函数就是使用这中方式 C 异常 异常是一种处
  • Java异常和处理机制

    棒棒有言 追逐梦想的过程就像是一个人在走一条黑暗 幽深而又漫长的隧道 多少次跌倒又爬起 经历了多少个暗无天日的黑夜与白天 一路上沉淀着难以计数的汗水与泪水 不断地自我暗示 只要自己坚持 只要勇敢地一向往前走 就必须能找到出口 必须会看到光明
  • 定时器:Quartz框架

    文章目录 简介 简单Demo cron 规则 参考 简介 Quartz是 OpenSymphony 开源组织在 Job scheduling 领域的开源项目 是由 java 开发的一个开源的任务日程管理系统 Quartz 是一个功能丰富的开
  • 如何创建HttpServletRequest对象

    我们常用的就是在Controller层的接口入参时定义 这样我们就能直接用了 如下图 但是某些情况 我们需要传递这个request 到各种工具类中 传递这个request 相对要麻烦一些 我们可以不用传递 在需要用到request的地方 通
  • @Configuration和@Bean

    spring Boot提倡约定优于配置 如何将类的生命周期交给spring 1 第一种自己写的类 Controller Service 用 controller service即可 2 第二种 集成其它框架 比如集成shiro权限框架 集成
  • Cookie 和 Session、实现用户登录逻辑

    Cookie 和 Session 一 回忆 Cookie 二 理解会话机制 Session 三 Cookie 和 Session 的区别 四 核心方法 4 1 HttpServletRequest 类中的相关方法 4 2 HttpServl
  • idea中Java Web项目的访问路径问题

    说明 这里只以 servlet 为例 没有涉及到框架 但其实路径的基本原理和框架的关系不大 所以学了框架的同学如果对路径有疑惑的也可以阅读此文 项目结构 在 idea 中新建一个 Java Web 项目 项目的初始结构如下 不同版本的 id
  • mysql 5.6 安装流程

    一 首先解压安装包到指定路径 解压路径不可为中文 二 配置环境变量 我是windows11 1 1 2 3 4 5 6 6 全部点击确定 三 更改my ini 这两条路径更改为与环境变量相同路径 四 运行cmd 1 2 输入mysqld i
  • servlet实现文件上传

    上传文件满足条件 1 需要有个表单 表单里面有个input类型为file的上传域 2 请求方法必须是POST 3 表单需要添加enctype属性 Content Type multipart form data 告知服务器提交数据的MIME
  • Servlet+JDBC实战开发书店项目讲解第五篇:购物车实现

    Servlet JDBC实战开发书店项目讲解第五篇 购物车实现 引言 在之前的几篇博客中 我们讲解了如何使用Servlet和JDBC开发一个简单的书店管理系统 在本文中 我们将深入探讨购物车的实现 这是一个关键功能 允许用户将所需图书添加到
  • Java代码判断当前操作系统是Windows或Linux或MacOS

    package com magic system public class SystemUtils 判断操作系统是否是 Windows return true 操作系统是 Windows false 其它操作系统 public static
  • JavaWeb05(删除&增加&修改功能实现&连接数据库)

    目录 一 实现删除功能 1 1 url如何传参 xx do 参数 参数值 参数名 参数值 1 2 servlet如何拿对应值 根据参数名拿到对应的参数值 String str req getParameter 参数名 1 3 如何询问 nc
  • UML类图小结

    类与类之间的关系 1 关联关系 关联 Association 关系是类与类之间最常用的一种关系 它是一种结构化关系 用于表示一类对象与另一类对象之间有联系 如汽车和轮胎 师傅和徒弟 班级和学生等等 图1 关联关系实例 1 双向关联 默认情况
  • java复制文件后保持文件的创建时间不变

    复制后保持文件的创建时间不变 File oldFile new File E test old png File newFile new File E test new png FileCopyUtils copy oldFile newF
  • Spring中的监听器与SpringMVC简述

    目录 Spring中的监听器 SpringMVC概述 web层的框架完成的相应的操作图示 SpringMVC开发使用步骤 SpringMVC流程图示 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转
  • 什么是Servlet容器?

    在本文中 我写了一些关于Web服务器 Servlet容器以及它与JVM的关系的基本概念 我想表达的是 Servlet容器也仅仅不过是一个Java程序 1 什么是Web服务器 想要知道什么是Servlet容器 我们首先要知道什么是Web服务器
  • Java工具类之SFTP遍历查找指定目录下包含关键字的的所有文件

    一 工具类代码 public class SFTPUtil private transient Logger logger LoggerFactory getLogger this getClass private ChannelSftp
  • Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web

    文章目录 前言 为何要写 目录结构 1 依赖配置 1 1 创建一个web项目 1 2 依赖需求分析 1 3 pom xml 2 配置Mybatis 2 1 mybatis config xml 2 2 UserMapper xml 2 3
  • SpringBoot:多数据源配置——注解+AOP

    maven依赖

随机推荐

  • shell脚本-1

    0 狂降 变量 1 标识符 2 数据类型 运算符 让多个变量产生关系 逻辑语句 1 顺序 2 分支 3 循环 方法 函数 将实现某一功能的代码封装 1 变量 定义变量时 变量名不加 基本都当成文本处理 bash 4 2 a 10 bash
  • 腾讯一面!说说ArrayList的遍历foreach与iterator时remove的区别,我一脸懵逼

    1 简介 ArrayList作为最基础的集合类 其底层是使用一个动态数组来实现的 这里 动态 的意思是可以动态扩容 虽然ArrayList可以动态扩容 但却不会动态缩容 但是与HashMap不同的是 ArrayList使用的是1 5的扩容策
  • VScode如何自动换行设置

    VScode安装完默认不能自动换行 需要我们手动配置 文本超出显示时 会溢出 如图 进入文件 gt 首选项 gt 设置 打开设置界面 在常用设置下找到Editor Word Wrap选项 默认为off 设置为on即可 如图所示 设置完成 即
  • STM32CubeMX基础例程(小熊派):09.厨房烟雾监测系统加强版

    1 准备开发板 这里我选用了一块网红开发板 小熊派 这款板子的人气比较高 还是全国大学生物联网设计竞赛 华为杯 的华为竞赛开发板 我个人也比较喜欢用这款板子 这款板子在放在纸箱吃灰半年之后 被我重新拿了起来 并想借此写博客的机会 整理一下自
  • 简单粗暴的分布式定时任务解决方案

    分布式定时任务 1 为什么需要定时任务 2 数据库实现分布式定时任务 3 基于redis实现 1 为什么需要定时任务 因为有时候我们需要定时的执行一些操作 比如业务中产生的一些临时文件 临时文件不能立即删除 因为不清楚用户是否操作完毕 不能
  • 通过FTP进行文件的上传和下载

    目录 一 FTP服务器展示文件列表 第一步 创建FTPClient 第二步 连接FTP服务器并验证用户名密码 第三步 切换到目标文件夹 第四步 切换成功后 显示所有该目录下的所有文件 第五步 最后关闭FTPClient对象 要处理异常 整理
  • 算法题-员工工号问题

    题目 公司员工的工号规则为 小写字母 数字 总长度不能超过8位 x表示该工号类型可以容纳的员工人数 y表示字母的个数 请确定数字的最小个数 例如 输入 260 1 输出 1 自己做的 不知道对不对 附上代码 import math def
  • c语言分数等级switch,用switch输出分数等级

    include int main float score 分数 用浮点数表示 int text printf n请输入你所得的分数 scanf f score 输入分数 下面用switch循环 text int score 10 强制转换为
  • 小红书“不误正夜”指南丨2023夜间营销数据报告

    对于当代年轻人来说 白天的 8 小时需要献给工作 学习和社交 夜晚时光才真正属于自己 下班后开始新的一天 越来越多人开始认同这个概念 告别 报复性熬夜 重新掌握晚间生活的方向盘 多样化的生活方式也因此孕育出了庞大的夜经济市场 千瓜数据显示
  • Qt之Http:4 利用QTcpSock访问HTTP

    QTcpSocket Class 利用 QTcpSocket 来实现一个界面 模仿 Telnet 的功能 访问HTTP服务器 QTcpSocket是QAbstractSocket的一个方便的子类 它允许您建立TCP连接并传输数据流 1 主要
  • 数据挖掘导论课后习题答案-第二章

    最近在读 Introduction to Data Mining 这本书 发现课后答案只有英文版 于是打算结合自己的理解将答案翻译一下 其中难免有错误 欢迎大家指正和讨论 侵删 第二章 字段3 3 字段2 字段2和字段3很有可能包含相同的信
  • 新冠疫情实时数据获取 python

    用到的工具 python pycham 模块 import requests import time import pandas as pd 目标网站 实时更新 新冠肺炎疫情最新动态 qq com 打开网站 F12 通过打开开发者工具 找到
  • SCI论文写作引导

    1 论文Introduction怎么写 a 背景介绍 现状 介绍别人研究 存在问题 怎样解决 你的做法 有何亮点 b 研究背景和重要性 引出该领域科研空白 点题 指出本文的研究课题 概述文章的核心方法论和主要发现 提出猜想和研究目的 c 最
  • 区块链入门学习笔记(一)

    比特币的原理和运行机制 1 比特币产生的动机 以物易物 实物货币 黄金 符号货币 纸币 中央系统虚拟货币 分布式虚拟货币 中本聪 2 基础设施搭建 1 账簿公开机制 账簿不记录余额 只记录交易 账簿由私有改为公开 2 身份与签名机制 公钥加
  • 软件架构概

    一 软件架构的概念 1 组成派认为 1 软件系统的架构将系统描述为计算机组件及组件之间的交互 其中 计算机组件是泛指 计算机组件可以进一步细分为处理组件 数据组件 连接组件等 组件可以指子系统 框架 模块 类等不同粒度的软件单元 2 组成派
  • 分布式操作系统在服务器上吗,什么是分布式操作系统?

    什么叫分布式操作系统 要想掌握的盆友看一下以下几点吧 分布式操作系统归属于分布式手机软件系统在其中的一部分 关键承担部门管理分布式解决系统資源和操纵分布式程序执行 分布式操作系统是传统式操作系统观念的转型 就例如 传统式营销方式和新起的互联
  • 【Docker】离线安装、普通用户执行docker命令、镜像归档打tar包,及加载tar包镜像

    离线安装 1 下载docker官方离线包 在有外网的环境中先把离线包下载下来 安装包官方地址 https download docker com linux static stable x86 64 2 上传离线包到服务器 使用scp命令或
  • Java 变量的作用域

    在Java中 变量的作用域分为四个级别 类级 类级变量又叫全局级变量或静态变量 需要使用static关键字修饰 类级变量在类定义后就已经存在 占用内存空间 可以通过类名来访问 不需要实例化 对象实例级 对象实例级变量就是成员变量 实例化后才
  • 如何做网络通信的项目?

    http blog csdn net clarkcc1988 article details 8825106 JAVA TCP SOCKET MINA 什么是Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换 这个双向链路的
  • Servlet注解和可插拔性(第八篇)

    文章目录 8 1 注解和可插拔性 8 1 1 WebServlet 注解 8 1 2 WebFilter web过滤器 8 1 3 WebInitParam 8 1 4 WebListener 8 1 5 MultipartConfig 8