`
234390216
  • 浏览: 10191994 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460734
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771658
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395324
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393854
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678180
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529236
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178634
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461646
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150077
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66795
社区版块
存档分类
最新评论

Servlet3.0中Servlet的使用

阅读更多

Servlet3.0Servlet的使用

目录

1.注解配置

2.异步调用

3.文件上传

 

       相对于之前的版本,Servlet3.0中的Servlet有以下改进:

l  支持注解配置。

l  支持异步调用。

l  直接有对文件上传的支持。

 

       在这篇文章中我将主要讲这三方面的应用示例。

 

1.注解配置

       在以往我们的Servlet都需要在web.xml文件中进行配置(Servlet3.0同样支持),但是在Servlet3.0中引入了注解,我们只需要在对应的Servlet类上使用@WebServlet注解进行标记,我们的应用启动之后就可以访问到该Servlet。对于一个@WebServlet而言,有一个属性是必须要的,那就是它的访问路径。@WebServlet中有两个属性可以用来表示Servlet的访问路径,分别是valueurlPatternsvalueurlPatterns都是数组形式,表示我们可以把一个Servlet映射到多个访问路径,但是valueurlPatterns不能同时使用。如果同时使用了valueurlPatterns,我们的Servlet是无法访问到的。下面是一个使用@WebServlet的简单Servlet示例。

 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 *
 * Servlet3.0支持使用注解配置Servlet。我们只需在Servlet对应的类上使用@WebServlet进行标注,
 * 我们就可以访问到该Servlet了,而不需要再在web.xml文件中进行配置。@WebServlet的urlPatterns
 * 和value属性都可以用来表示Servlet的部署路径,它们都是对应的一个数组。
 */
@WebServlet(name="exampleServlet", urlPatterns="/servlet/example")
public class ExampleServlet extends HttpServlet {
 
   private static final long serialVersionUID = 1L;
 
   @Override
   protected void doGet(HttpServletRequest request,
         HttpServletResponse response) throws ServletException, IOException {
      this.doPost(request, response);
   }
 
   @Override
   protected void doPost(HttpServletRequest request,
         HttpServletResponse response) throws ServletException, IOException {
      response.getWriter().write("Hello User.");
   }
 
}

  

初始化参数

       使用@WebServlet时也可以配置初始化参数,它是通过@WebServletinitParams参数来指定的。initParams是一个@WebInitParam数组,每一个@WebInitParam代表一个初始化参数。

 
import java.io.IOException;
import java.util.Enumeration;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 带初始化参数的Servlet
 * WebServlet的属性initParams可以用来指定当前Servlet的初始化参数,它是一个数组,
 * 里面每一个@WebInitParam表示一个参数。
 */
@WebServlet(value="/servlet/init-param", initParams={@WebInitParam(name="param1", value="value1")})
public class WebInitParamServlet extends HttpServlet {
 
   /**
    *
    */
   private static final long serialVersionUID = 1L;
 
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      this.doPost(req, resp);
   }
 
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      Enumeration<String> paramNames = this.getServletConfig().getInitParameterNames();
      String paramName;
      while (paramNames.hasMoreElements()) {
         paramName = paramNames.nextElement();
         resp.getWriter().append(paramName + " = " + this.getServletConfig().getInitParameter(paramName));
      }
      resp.getWriter().close();
   }
  
}

 

2.异步调用

       Servlet3.0中,在Servlet内部支持异步处理。它的逻辑是当我们请求一个Servlet时,我们的Servlet可以先返回一部分内容给客户端。然后在Servlet内部异步处理另外一段逻辑,等到异步处理完成之后,再把异步处理的结果返回给客户端。这意味着当我们的Servlet在处理一段比较费时的业务逻辑时,我们可以先返回一部分信息给客户端,然后异步处理费时的业务,而不必让客户端一直等待所有的业务逻辑处理完。等到异步处理完之后,再把对应的处理结果返回给客户端。

       异步调用是通过当前HttpServletRequeststartAsync()方法开始的,它返回一个AsyncContext。之后我们可以调用AsyncContextstart()方法来新起一个线程进行异步调用。在新线程内部程序的最后我们最好是调用一下当前AsyncContextcomplete()方法,否则异步调用的结果需要等到设置的超时时间过后才会返回到客户端。另外当异步调用超时以后会接着调用异步任务,即新起的线程。

 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 支持异步返回的Servlet
 * 对于Servlet的异步返回,首先我们必须指定@WebServlet的asyncSupported属性为true(默认是false),同时在它之前的Filter
 * 的asyncSupported属性也必须是true,否则传递过来的request就是不支持异步调用的。
 *
 */
@WebServlet(value="/servlet/async", asyncSupported=true)
public class AsyncServlet extends HttpServlet {
 
   /**
    *
    */
   private static final long serialVersionUID = 1L;
 
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      this.doPost(req, resp);
   }
 
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      resp.setContentType("text/plain;charset=UTF-8");
      final PrintWriter writer = resp.getWriter();
      writer.println("异步之前输出的内容。");
      writer.flush();
      //开始异步调用,获取对应的AsyncContext。
      final AsyncContext asyncContext = req.startAsync();
      //设置超时时间,当超时之后程序会尝试重新执行异步任务,即我们新起的线程。
      asyncContext.setTimeout(10*1000L);
      //新起线程开始异步调用,start方法不是阻塞式的,它会新起一个线程来启动Runnable接口,之后主程序会继续执行
      asyncContext.start(new Runnable() {
 
         @Override
         public void run() {
            try {
                Thread.sleep(5*1000L);
                writer.println("异步调用之后输出的内容。");
                writer.flush();
                //异步调用完成,如果异步调用完成后不调用complete()方法的话,异步调用的结果需要等到设置的超时
                //时间过了之后才能返回到客户端。
                asyncContext.complete();
            } catch (Exception e) {
                e.printStackTrace();
            }
         }
        
      });
      writer.println("可能在异步调用前输出,也可能在异步调用之后输出,因为异步调用会新起一个线程。");
      writer.flush();
   }
 
}

 

       对于一个Servlet如果要支持异步调用的话我们必须指定其asyncSupported属性为true(默认是false)。使用@WebServlet注解标注的Servlet我们可以直接指定其asyncSupported属性的值为true,如:

@WebServlet(value=”/servlet/async”, asyncSupported=true)。而对于在web.xml文件中进行配置的Servlet来说,我们需要在配置的时候指定其asyncSupported属性为true

   <servlet>
      <servlet-name>xxx</servlet-name>
      <servlet-class>xxx</servlet-class>
      <async-supported>true</async-supported>
   </servlet>
   <servlet-mapping>
      <servlet-name>xxx</servlet-name>
      <url-pattern>xxx</url-pattern>
   </servlet-mapping>

 

       Servlet的异步调用程序的关键是要调用当前HttpServletRequeststartAsync()方法。至于利用返回的AsyncContext来新起一个线程进行异步处理就不是那么的必须了,因为在HttpServletRequest startAsync()之后,我们可以自己新起线程进行异步处理。

@WebServlet(value="/servlet/async", asyncSupported=true)
public class AsyncServlet extends HttpServlet {
 
   /**
    *
    */
   private static final long serialVersionUID = 1L;
 
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      this.doPost(req, resp);
   }
 
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      resp.setContentType("text/plain;charset=UTF-8");
      final PrintWriter writer = resp.getWriter();
      writer.println("异步之前输出的内容。");
      writer.flush();
      //开始异步调用,获取对应的AsyncContext。
      final AsyncContext asyncContext = req.startAsync();
      //设置超时时间,当超时之后程序会尝试重新执行异步任务,即我们新起的线程。
      asyncContext.setTimeout(10*1000L);
      Runnable r = new Runnable() {
         @Override
         public void run() {
            try {
                Thread.sleep(5*1000L);
                writer.println("异步调用之后输出的内容。");
                writer.flush();
                //异步调用完成
                asyncContext.complete();
            } catch (Exception e) {
                e.printStackTrace();
            }
         } 
      };
      Thread t = new Thread(r);
      //开启自己的线程进行异步处理
      t.start();
      writer.println("可能在异步调用前输出,也可能在异步调用之后输出,因为异步调用会新起一个线程。");
      writer.flush();
   }
  
}

 

异步调用监听器

       当我们需要对异步调用做一个详细的监听的时候,比如监听它是否超时,我们可以通过给AsyncContext设置对应的监听器AsyncListener来实现这一功能。AsyncListener是一个接口,里面定义了四个方法,分别是针对于异步调用开始、结束、出错和超时的。

import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 支持异步返回的Servlet
 * 对于Servlet的异步返回,首先我们必须指定@WebServlet的asyncSupported属性为true(默认是false),同时在它之前的Filter
 * 的asyncSupported属性也必须是true,否则传递过来的request就是不支持异步调用的。
 *
 */
@WebServlet(value="/servlet/async2", asyncSupported=true)
public class AsyncServlet2 extends HttpServlet {
 
   /**
    *
    */
   private static final long serialVersionUID = 1L;
 
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      this.doPost(req, resp);
   }
 
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      resp.setContentType("text/plain;charset=UTF-8");
      final PrintWriter writer = resp.getWriter();
      writer.println("异步之前输出的内容。");
      writer.flush();
      //开始异步调用,获取对应的AsyncContext。
      final AsyncContext asyncContext = req.startAsync();
      //设置当前异步调用对应的监听器
      asyncContext.addListener(new MyAsyncListener());
      //设置超时时间,当超时之后程序会尝试重新执行异步任务,即我们新起的线程。
      asyncContext.setTimeout(10*1000L);
      //新起线程开始异步调用,start方法不是阻塞式的,它会新起一个线程来启动Runnable接口,之后主程序会继续执行
      asyncContext.start(new Runnable() {
 
         @Override
         public void run() {
            try {
                Thread.sleep(5*1000L);
                writer.println("异步调用之后输出的内容。");
                writer.flush();
                //异步调用完成
                asyncContext.complete();
            } catch (Exception e) {
                e.printStackTrace();
            }
         }
        
      });
      writer.println("可能在异步调用前输出,也可能在异步调用之后输出,因为异步调用会新起一个线程。");
      writer.flush();
   }
 
   /**
    * 异步调用对应的监听器
    * @author Yeelim
    * @date 2014-2-8
    * @mail yeelim-zhang@todaytech.com.cn
    */
   private class MyAsyncListener implements AsyncListener {
 
      @Override
      public void onComplete(AsyncEvent event) throws IOException {
         System.out.println("异步调用完成……");
         event.getSuppliedResponse().getWriter().println("异步调用完成……");
      }
 
      @Override
      public void onError(AsyncEvent event) throws IOException {
         System.out.println("异步调用出错……");
         event.getSuppliedResponse().getWriter().println("异步调用出错……");
      }
 
      @Override
      public void onStartAsync(AsyncEvent event) throws IOException {
         System.out.println("异步调用开始……");
         event.getSuppliedResponse().getWriter().println("异步调用开始……");
      }
 
      @Override
      public void onTimeout(AsyncEvent event) throws IOException {
         System.out.println("异步调用超时……");
         event.getSuppliedResponse().getWriter().println("异步调用超时……");
      }
     
   }
  
}

  

注:

       对于正常执行的异步调用而言上述代码中开始是没有监听到的,只有在异步调用超时,重新执行异步任务的时候才有监听到异步调用的开始。不过如果需要监听异步第一次开始的话,我们可以在异步调用开始的时候做相应的监听器监听到异步调用开始时需要做的内容。

 

3.文件上传

       Servlet3.0中上传文件变得非常简单。我们只需通过requestgetPart(String partName)获取到上传的对应文件对应的Part或者通过getParts()方法获取到所有上传文件对应的Part。之后我们就可以通过partwrite(String fileName)方法把对应文件写入到磁盘。或者通过partgetInputStream()方法获取文件对应的输入流,然后再对该输入流进行操作。要使用requestgetPart()getParts()方法对上传的文件进行操作的话,有两个要注意的地方。首先,用于上传文件的form表单的enctype必须为multipart/form-data;其次,对于使用注解声明的Servlet,我们必须在其对应类上使用@MultipartConfig进行标注,而对于在web.xml文件进行配置的Servlet我们也需要指定其multipart-config属性,如:

   <servlet>
      <servlet-name>xxx</servlet-name>
      <servlet-class>xxx.xxx</servlet-class>
      <multipart-config></multipart-config>
   </servlet>
   <servlet-mapping>
      <servlet-name>xxx</servlet-name>
      <url-pattern>/servlet/xxx</url-pattern>
   </servlet-mapping>

 

       不管是基于注解的@MultipartConfig,还是基于web.xml文件配置的multipart-config,我们都可以给它们设置几个属性。

l  file-size-threshold:数字类型,当文件大小超过指定的大小后将写入到硬盘上。默认是0,表示所有大小的文件上传后都会作为一个临时文件写入到硬盘上。

l  location:指定上传文件存放的目录。当我们指定了location后,我们在调用Partwrite(String fileName)方法把文件写入到硬盘的时候可以,文件名称可以不用带路径,但是如果fileName带了绝对路径,那将以fileName所带路径为准把文件写入磁盘。

l  max-file-size:数值类型,表示单个文件的最大大小。默认为-1,表示不限制。当有单个文件的大小超过了max-file-size指定的值时将抛出IllegalStateException异常。

l  max-request-size:数值类型,表示一次上传文件的最大大小。默认为-1,表示不限制。当上传时所有文件的大小超过了max-request-size时也将抛出IllegalStateException异常。

 

上面的属性是针对于web.xml中配置Servlet而言的,其中的每一个属性都对应了multipart-config元素下的一个子元素。对于基于注解配置的Servlet而言,@MultipartConfig的属性是类型的,我们只需把上述对应属性中间的杠去掉,然后把对应字母大写即可,如maxFileSize

 

       下面给出Servlet3.0中文件上传的一个示例。

Html

<form method="post" action="servlet/upload" enctype="multipart/form-data">
   <input type="file" name="upload"/>
   <input type="submit" value="upload"/>
</form>

 

对应Servlet

@WebServlet("/servlet/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
 
   /**
    *
    */
   private static final long serialVersionUID = 1L;
 
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      req.setCharacterEncoding("UTF-8");
      Part part = req.getPart("upload");
      //格式如:form-data; name="upload"; filename="YNote.exe"
      String disposition = part.getHeader("content-disposition");
      System.out.println(disposition);
      String fileName = disposition.substring(disposition.lastIndexOf("=")+2, disposition.length()-1);
      String fileType = part.getContentType();
      long fileSize = part.getSize();
      System.out.println("fileName: " + fileName);
      System.out.println("fileType: " + fileType);
      System.out.println("fileSize: " + fileSize);
      String uploadPath = req.getServletContext().getRealPath("/upload");
      System.out.println("uploadPath" + uploadPath);
      part.write(uploadPath + File.separator +fileName);
   }
  
}

 

       对于Servlet3.0中的文件上传还有一个需要注意的地方,当我们把Part写入到硬盘以后,我们原先的Part(也就是之前的临时文件)可能已经删了,这个时候如果我们再次去访问Part的内容的话,那它就是空的,系统会抛出异常说找不到对应的文件。

 

 

 

17
0
分享到:
评论
8 楼 masuweng 2018-03-08  
      
7 楼 darren_nizna 2016-09-08  
http://gitlore.com/darren/servlet/    Java Servlet 3.1 规范
6 楼 haiyulaoren 2015-11-13  
四、五楼都不对
5 楼 cjylnux 2015-09-15  
同意四楼的说法,博主的例子很不错,但是对servlet的异步机制理解是错的。
servlet异步核心内容是servlet外加了一个线程调度器,servlet是线程化的,不再阻塞,线程调度器不用等待其执行完成再处理下一个线程。这样的好处是同一个servlet同时处理多个请求时,不会排队,而是分身出多个servlet同时进行处理。
我的比喻有瑕疵,但绝对不是楼主所说的那样。
4 楼 haiquancai 2015-04-01  
"它的逻辑是当我们请求一个Servlet时,我们的Servlet可以先返回一部分内容给客户端。然后在Servlet内部异步处理另外一段逻辑,等到异步处理完成之后,再把异步处理的结果返回给客户端。这意味着当我们的Servlet在处理一段比较费时的业务逻辑时,我们可以先返回一部分信息给客户端,然后异步处理费时的业务,而不必让客户端一直等待所有的业务逻辑处理完。等到异步处理完之后,再把对应的处理结果返回给客户端。" 楼主这段是自己总结的?这个理解是完全错误的。异步调用类似NIO,servlet接受请求,worker在一个线程中处理请求。
3 楼 antique 2014-02-12  
写的很明了。谢谢啦
2 楼 sbpcx 2014-02-11  
谢谢分享。
1 楼 宋建勇 2014-02-11  
相当不错啊!

相关推荐

    一个用于配置移动应用开发环境的自动化脚本

    可以帮助开发者自动安装Android SDK、Android NDK、Java开发工具包(JDK)以及Flutter SDK,这些都是移动应用开发(特别是Android和Flutter应用)所必需的。 脚本首先定义了一些变量,用于存储工具的安装路径和版本。然后,定义了一个install_tool函数,用于检查工具是否已安装,如果没有安装则执行安装命令。 接着,脚本定义了install_android_sdk、install_android_ndk、install_java_jdk、set_java_env和install_flutter_sdk等函数,分别用于安装Android SDK、Android NDK、Java JDK、设置Java环境变量以及安装Flutter SDK。 在主程序部分,脚本按照顺序调用这些函数来安装和配置各个工具。安装完成后,脚本会输出一条消息表示配置已完成。

    AI Agent智能应用从0到1定制开发

    AI Agent智能应用从0到1定制开发 关键特点: 自动化:AI Agent可以自动执行重复性任务,提高效率并减少人力成本。 智能决策:基于复杂的算法,AI Agent能够进行决策支持,分析数据并提供洞察。 自然语言处理:许多AI Agent具备理解和生成自然语言的能力,使其能够与人类用户进行交流。 机器学习:AI Agent可以利用机器学习技术从经验中学习,不断优化其性能。 个性化:AI Agent能够根据用户的行为和偏好提供个性化的体验。 可扩展性:AI Agent可以设计成模块化,方便扩展新功能或适应不同规模的需求。 实时响应:AI Agent能够提供快速的实时响应,满足紧急任务的需求。

    魔方PPT模板04_动态清新绿色学术答辩模板.pptx.zip

    魔方PPT模板04_动态清新绿色学术答辩模板.pptx

    tomcat概述.pdf

    Tomcat是一个广泛使用的开源Web服务器和Servlet容器,它是由Apache软件基金会(ASF)主持的一个项目。Tomcat实现了Java Servlet、JavaServer Pages(JSP)、Java Expression Language(JSTL)和WebSocket等技术规范,并提供了一个用于运行Java Web应用程序的运行时环境。由于其稳定性、可扩展性和灵活性,Tomcat已成为许多企业级Java Web应用程序的首选服务器。 Tomcat最初是由Sun Microsystems在1999年作为Servlet API 2.2和JSP 1.1规范的参考实现而开发的。自那时以来,Tomcat不断发展壮大,成为了一个功能强大且易于使用的Web服务器和Servlet容器。Tomcat的开源性质和广泛的支持使得它成为了许多开发者和企业的首选。

    基于Qt+C++实现的各种炫酷的样式表+源码

    用法链接:https://menghui666.blog.csdn.net/article/details/137888208?spm=1001.2014.3001.5502 基于Qt+C++实现的各种炫酷的样式表,如单选、多选、按钮、日历、表格、下拉框、滚轮等,+源码 基于Qt+C++实现的各种炫酷的样式表,如单选、多选、按钮、日历、表格、下拉框、滚轮等,+源码 基于Qt+C++实现的各种炫酷的样式表,如单选、多选、按钮、日历、表格、下拉框、滚轮等,+源码

    罗茨泵设计sw17可编辑含工程图设计图纸.7z

    罗茨泵设计sw17可编辑含工程图设计图纸.7z

    计算机思维训练+C语言

    计算机思维训练+C语言

    基于JAVA毕业设计-JAVA基于遗传算法的中药药对挖掘系统的设计与实现(源代码+论文).rar

    基于JAVA毕业设计-JAVA基于遗传算法的中药药对挖掘系统的设计与实现(源代码+论文).rar 用数据挖掘技术研究了中药方剂配伍的规律。主要工作:分析了关联规则存在的问题,引入双向关联规则的概念;介绍了遗传算法的基本原理,研究了遗传算法在数据挖掘中的应用;将方剂库转换为位图矩阵,大大提高搜索效率;开发了一个基于遗传算法的中药药对药组挖掘系统。论文组织如下:介绍了研究背景和意义;阐述了相关的理论基础;提出了系统的设计方案;详细展示了基于遗传算法的双向关联规则挖掘系统的实现过程,包括位图矩阵的实现,个体的编码方法,适应度函数的设计,规则的提取,选择、交叉、变异等遗传操作的实现等;利用脾胃类方剂库对系统进行了测试,并对测试结果进行了分析。结果证明:该系统能够快速高效地从方剂库中找出具有重要意义的药对药组,对中医药的研究发展有一定意义。

    C常用算法程序集数值计算数值积分

    C常用算法程序集数值计算数值积分提取方式是百度网盘分享地址

    raun内外盒组装包装设备含工程图sw17可编辑设计图纸.7z

    raun内外盒组装包装设备含工程图sw17可编辑设计图纸.7z

    四路仿PLC继电器控制板原理图+教程+源代码+下位机源代码+上位机源代码+其它技术资料.7z

    四路仿PLC继电器控制板原理图+教程+源代码+下位机源代码+上位机源代码+其它技术资料.7z

    北京天津上海重庆市直辖市的区县财政收入一般公共预算收入税收收入2000-2023.xls

    数据来源:中经数据库 数据范围:各个省份的区县财政收入即一般公共预算收入、税收收入 (一般财政收入即一般公共预算收入的完整度较高。税收收入一般50%的区县会有数据) 数据年度区间:2000-2023(具体看文件名上的年度区间) 珍贵数据,包含了各省所有的区、县、县级市哦,很难找到的哦

    2021年全国职业院校技能大赛模块ALinux评分标准

    2021年全国职业院校技能大赛模块ALinux评分标准

    Centos7下tomcat的安装.zip

    tomcatCentos7下tomcat的安装.zip

    绚彩小清新毕业答辩模板.ppt.zip

    绚彩小清新毕业答辩模板.ppt

    毕业设计-微信小程序选座系统源码.zip

    毕业设计-微信小程序选座系统源码.zip文件 毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系统源码.zip文件毕业设计-微信小程序选座系

    Android Studio移动应用开发PPT详解《微课版》

    Android Studio移动应用开发PPT详解《微课版》

    DataV Utils 文件

    DataV Utils 文件

    asp.net基于BS在线考试统(源代码+论文).rar

    计算机毕业设计,含源码

    依照sklearn标准,对一些机器学习算法自行封装..zip

    机器学习是一种人工智能(AI)的子领域,致力于研究如何利用数据和算法让计算机系统具备学习能力,从而能够自动地完成特定任务或者改进自身性能。机器学习的核心思想是让计算机系统通过学习数据中的模式和规律来实现目标,而不需要显式地编程。 机器学习应用非常广泛,包括但不限于以下领域: 图像识别和计算机视觉: 机器学习在图像识别、目标检测、人脸识别、图像分割等方面有着广泛的应用。例如,通过深度学习技术,可以训练神经网络来识别图像中的对象、人脸或者场景,用于智能监控、自动驾驶、医学影像分析等领域。 自然语言处理: 机器学习在自然语言处理领域有着重要的应用,包括文本分类、情感分析、机器翻译、语音识别等。例如,通过深度学习模型,可以训练神经网络来理解和生成自然语言,用于智能客服、智能助手、机器翻译等场景。 推荐系统: 推荐系统利用机器学习算法分析用户的行为和偏好,为用户推荐个性化的产品或服务。例如,电商网站可以利用机器学习算法分析用户的购买历史和浏览行为,向用户推荐感兴趣的商品。 预测和预测分析: 机器学习可以用于预测未来事件的发生概率或者趋势。例如,金融领域可以利用机器学习算法进行股票价格预测、信用评分、欺诈检测等。 医疗诊断和生物信息学: 机器学习在医疗诊断、药物研发、基因组学等领域有着重要的应用。例如,可以利用机器学习算法分析医学影像数据进行疾病诊断,或者利用机器学习算法分析基因数据进行疾病风险预测。 智能交通和物联网: 机器学习可以应用于智能交通系统、智能城市管理和物联网等领域。例如,可以利用机器学习算法分析交通数据优化交通流量,或者利用机器学习算法分析传感器数据监测设备状态。 以上仅是机器学习应用的一部分,随着机器学习技术的不断发展和应用场景的不断拓展,机器学习在各个领域都有着重要的应用价值,并且正在改变我们的生活和工作方式。

Global site tag (gtag.js) - Google Analytics