java的requestmapping_SpringMVC RequestMapping 详解

SpringMVC RequestMapping 详解

RequestMapping这个注解在SpringMVC扮演着非常重要的角色,可以说是随处可见。它的知识点很简单。今天我们就一起学习SpringMVC的RequestMapping这个注解。文章主要分为两个部分:RequestMapping 基础用法和RequestMapping 提升用法。

准备工作

pom.xml 这里是需要的jar包和相关的配置。这里设置了maven-compiler-plugin的java版本为1.7,避免打包出错和中文乱码的问题。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.springmvc

springmvc

0.0.1-SNAPSHOT

war

maven-compiler-plugin

1.7

1.7

UTF-8

4.1.3.RELEASE

org.springframework

spring-webmvc

${spring.version}

org.springframework

spring-context

${spring.version}

org.springframework

spring-aop

${spring.version}

org.springframework

spring-core

${spring.version}

org.springframework

spring-web

${spring.version}

javax.servlet

javax.servlet-api

4.0.0

provided

web.xml 设置字符拦截器,避免中文乱码

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID" version="3.0">

springmvc

dispatcher

org.springframework.web.servlet.DispatcherServlet

1

dispatcher

/

encodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

forceEncoding

true

encodingFilter

/*

SpringMVC的配置文件(dispatcher-servlet.xml)没有变,这里就不再贴出来了。可以去上一章找

RequestMapping 基础用法

核心类 ApiStudyController,这是重点需要看的java文件。里面主要介绍了@RequestMapping 的基础用法。

你需要重点学习的有: 获取请求参数值的@RequestParam注解;通过占位符获取参数值的@PathVariable注解;指定请求方式的method属性;用于将数据存储到作用域中返回给前端的Map,Model和ModelMap参数;以及如何使用POJO对象作为方法的参数。

import java.util.Map;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.CookieValue;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestHeader;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

@Controller

@RequestMapping("apiStudy")

public class ApiStudyController {

private static final String SUCCESS = "apistudy";

private static final String RESULT_KEY = "result";

/**

* 常用知识点:在类或者方法上使用 @RequestMapping 注解

* 若没有修饰类,则访问路径是: http://ip:port/项目名/方法的@RequestMapping值

* 若类有修饰类,则访问路径是: http://ip:port/项目名/类的@RequestMapping值/方法的@RequestMapping值

*/

/**

* 方法中用map作为参数,可以将数据存储到request作用域中,放回到页面上。

* 同样用法的有 Model 类型 和 ModelMap 类型

*/

@RequestMapping("/testMapResult")

public String testMapResult(Map map, Model model, ModelMap modelMap){

String apiDocs = "Map,Model,ModelMap (常用方法) : 在方法中添加Map的参数,可以将数据放到request 作用域中!";

map.put(RESULT_KEY, apiDocs);

model.addAttribute("model", "Model");

modelMap.addAttribute("modelMap", "ModelMap");

return SUCCESS;

}

/**

* 常用知识点:使用 method 属性来指定请求方式

* 若用GET方式请求,会提示:HTTP Status 405 - Request method 'GET' not supported 错误信息

*/

@RequestMapping(value = "/testRequestMethod", method=RequestMethod.POST)

public String testRequestMethod(Map map) {

String apiDocs = "RequestMethod (常用方法) : 若设置只有POST请求才能进入,则用GET方式请求,会报405的错误。反之亦然!";

map.put(RESULT_KEY, apiDocs);

return SUCCESS;

}

/**

* 常用知识点:使用注解 @PathVariable 映射 URL绑定占位,属于REST风格。

* 注意两点:

* 1. 严格用法: @PathVariable("arg") String arg; 前一个arg参数,必须要和占位参数{arg}保持一致。后面一个arg参数可以自定义。

* 2. 偷懒用法: @PathVariable String arg; 这里的参数名 arg 必须要和占位参数{arg}保持一致,不然会提示400的错误

*/

@RequestMapping("/testPathVariable/{arg}")

public String testPathVariable(@PathVariable("arg") String arg, Map map) {

String apiDocs = "PathVariable (常用方法) : 通过映射 URL绑定占位获取的值是 " + arg;

map.put(RESULT_KEY, apiDocs);

return SUCCESS;

}

/**

* 常用知识点:使用注解 @RequestParam 来映射请求参数

* 该注解有三个参数,

* value 请求的参数名,

* required 请求的参数是否必填 ,默认是true,

* defaultValue 请求的参数默认值.

* 参数的类型建议是封装数据类型,因为float默认值是0.0 ,若该参数是非必填,则会报错 HTTP Status 500

*/

@RequestMapping("/testRequestParam")

public String testRequestParam(@RequestParam("account") String account,

@RequestParam(value="password", required=true) String password,

@RequestParam(value="price", required=false, defaultValue="0.0") float price,

Map map) {

String apiDocs = "RequestParam (常用方法) : 获取映射请求参数的值有 account : " + account + " password : " + password + " price : " + price;

map.put(RESULT_KEY, apiDocs);

return SUCCESS;

}

/**

* 常用知识点:方法参数是POJO对象

* 前端的请求参数名一定要和POJO对象属性一致。支持级联

*/

@RequestMapping(value = "/testPojo", method = RequestMethod.POST)

public String testPojo(User user, Map map) {

map.put(RESULT_KEY, user);

return SUCCESS;

}

/**

* 不常用方法:params 和 headers

* @RequestMapping 注解中,除了常用的value和method外,还有两个较为常用的params和headers

* 他们可以是请求跟精确,制定那些参数的请求不接受,同时也可以指定那些参数的请求接收。

* params={param1,param2}

* param1 表示 请求必须包含名为param1的请求参数

* !param1 表示 请求不能包含名为param1的请求参数

* param1!=value1 表示请求包含param1的请求参数,但是其值不能是value1

*/

@RequestMapping(value="/testParamsAndHeaders", params={"itdragon"},

headers = { "Accept-Language=zh-CN,zh;q=0.8" })

public String testParamsAndHeaders(Map map) {

String apiDocs = "params,headers (了解用法) : 这里表示当请求参数中包含了itdragon的时候才能进来";

map.put(RESULT_KEY, apiDocs);

return SUCCESS;

}

/**

* 不常用方法:ant风格

* ?匹文件名中一个字

* *匹文件名中任意字

* ** 匹多 层径

*/

@RequestMapping("/*/testAntUrl")

public String testAntUrl(Map map) {

String apiDocs = "Ant风格 (了解用法) : ?匹文件名中一个字 ; *匹文件名中任意字 ; ** 匹多 层径 ";

map.put(RESULT_KEY, apiDocs);

return SUCCESS;

}

/**

* 不常用方法:@RequestHeader 注解获取请求头数据。

*/

@RequestMapping("/testRequestHeader")

public String testRequestHeader(@RequestHeader(value = "Accept-Language") String al,

Map map) {

String apiDocs = "@RequestHeader (了解用法) : 获取请求头数据的注解, 如Accept-Language 的值是 : " + al;

map.put(RESULT_KEY, apiDocs);

return SUCCESS;

}

/**

* 不常用方法:@CookieValue: 映射一个 Cookie值

*/

@RequestMapping("/testCookieValue")

public String testCookieValue(@CookieValue("JSESSIONID") String sessionId,

Map map) {

String apiDocs = "@CookieValue(了解用法) : 映射一个 Cookie值的注解, 如JSESSIONID 的Cookie值是 : " + sessionId;

map.put(RESULT_KEY, apiDocs);

return SUCCESS;

}

}

用于测试的前端页面 index.jsp

pageEncoding="UTF-8"%>

SpringMVC 快速入门

@RequestMapping 注解基本用法

史上最丑的HelloWorld

Map,Model,ModelMap的使用方法

用GET请求方式测试POST方法

@PathVariable获取占位数据

@RequestParam获取请求参数值

account:

level:

salary:


params 和 headers用法

Ant风格URL请求

@RequestHeader 注解获取请求头数据

@CookieValue 注解获取 Cookie值

方便查看结果的apistudy.jsp页面

pageEncoding="UTF-8"%>

SpringMVC 快速入门

@RequestMapping 注解基本用法

request 作用域 :

${requestScope.result}

${requestScope.model}

${requestScope.modelMap}


session 作用域 :

${sessionScope.result}

最后是两个用于测试的POJO对象,分别是User和Position

public class User {

private Integer id;

private String account;

private String password;

private Position position;

public User() {

}

public User(Integer id, String account, String password) {

this.id = id;

this.account = account;

this.password = password;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getAccount() {

return account;

}

public void setAccount(String account) {

this.account = account;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public Position getPosition() {

return position;

}

public void setPosition(Position position) {

this.position = position;

}

@Override

public String toString() {

return "User [id=" + id + ", account=" + account + ", password=" + password + ", position="

+ position + "]";

}

}

public class Position {

private Integer id;

private String level;

private Double salary;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getLevel() {

return level;

}

public void setLevel(String level) {

this.level = level;

}

public Double getSalary() {

return salary;

}

public void setSalary(Double salary) {

this.salary = salary;

}

@Override

public String toString() {

return "Position [level=" + level + ", salary=" + salary

+ "]";

}

}

测试的效果图

bVXbbu?w=1049&h=614

RequestMapping 提升用法

这里的知识点有:输出模型数据 ModelAndView类型,Map(Model,ModelMap),@ModelAttribute注解,@SessionAttributes注解的使用,和 原生的Servlet Api的使用。

ModelAndView数据类型:见名知意,即包含了模型数据,又包含了视图数据。设置模型数据有两种方式:modelAndView.addObject(String attributeName, Object attributeValue) 方分别表示Key和Value。modelAndView.addAllObjects(modelMap) 存的参数是一个Map(Model,ModelMap其实都是Map数据类型)。

设置视图数据常用方法也有两种方式:

ModelAndView modelAndView = new ModelAndView(viewName) 初始化ModelAndView的时候设置。

modelAndView.setViewName(viewName) 初始化后再she'zh

@ModelAttribute 注解:被该注解修饰的方法, 会在每个目标方法执行之前被 SpringMVC 调用。实际开发中其实用的并不是很多。在我们更新数据的时候,一般都会先查询,后更新。该注解就扮演督促查询的角色,在执行更新的方法前先执行该注解修饰的查询数据方法。

@SessionAttributes 注解:只能修饰在类上,将模型数据暂存到HttpSession中,从而使多个请求的数据共享。常用方法有@SessionAttributes(value={"obj1", "obj2"}, types={String.class, Obj1.class})。表示可以将数据类型是String或者是对象Obj1的模型数据放到HttpSession中。也可以将变量名是obj1,obj2的模型数据放到HttpSession中。用这个注解容易出一个问题。HttpSessionRequiredException 异常,原因在代码注释中。

原生的Servlet Api:如果发现不能引入javax.servlet.* 的文件,可能是因为项目里面中没有servlet-api.jar。

普通项目解决方法:右击项目工程名称 ---> Build Path ---> Configure Build Path... ---> 选择 Libraries 点击 Add External JARS ---> 在按照tomcat的里面下,找到lib目录,里面就有。

Maven项目解决方法:如果按照上面的方法处理,虽然引入文件,当打包的时候会提示"找不到符号",是因为servlet-api.jar 没有真正的加入到classpath下。最简单的方法就是在pom.xml加入servlet-api.jar。

看代码:

import java.io.IOException;

import java.io.Writer;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.SessionAttributes;

import org.springframework.web.servlet.ModelAndView;

@Controller

@RequestMapping("apiStudy")

@SessionAttributes(value={"user"}, types={String.class})

public class ApiStudyController {

private static final String SUCCESS = "apistudy";

private static final String RESULT_KEY = "result";

/**

* @SessionAttributes 将数据存储到session中,达到多个请求数据共享的目的。

* 只能修饰在类上的注解

* 通过属性名value,指定需要放到会话中的属性

* 通过模型属性的对象类型types,指定哪些模型属性需要放到会话中

*/

/**

* 常用方法:ModelAndView 方法的返回值设置为 ModelAndView 类型。

* ModelAndView 顾名思义,是包含视图和模型信息的类型。

* 其数据存放在 request 域对象中.

*/

@RequestMapping("/testModelAndView")

public ModelAndView testModelAndView() {

String viewName = SUCCESS; // 需要返回的视图名

String apiDocs = "ModelAndView(常用方法) : 之前学习的方法返回值是字符串,数据是通过Map返回到前端。现在可以通过ModelAndView类型直接完成。";

ModelAndView modelAndView = new ModelAndView(viewName);

modelAndView.addObject(RESULT_KEY, apiDocs); // 添加数据到model中

return modelAndView;

}

/**

* SpringMVC 确定目标方法 POJO 类型入参的过程

* 第一步: 确定一个 key

* 若方法形如 "testModelAttribute(User user)" , 则key为 user(POJO 类名第一个字母小写)

* 若方法形如"testModelAttribute(@ModelAttribute("userObj") User user)" ,则key为 userObj

* 第二步: 在 implicitModel 中查找 key 对应的对象

* 若 implicitModel 存在, 则作为入参传入

* 若 implicitModel 中不存在, 则检查当前Handler 是否使用 @SessionAttributes 注解

* 若使用了该注解, 且 @SessionAttributes 注解的 value 属性值中包含了 key, 则会从 HttpSession 中来获取 key 所对应的 value 值, 若存在则直接传入到目标方法的入参中. 若不存在则将抛出异常.

* 若 Handler 没有标识 @SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含 key, 则通过反射来创建 POJO 类型的参数, 传入为目标方法的参数

* implicitModel? SpringMVC 会把 key 和 POJO 类型的对象保存到 implicitModel 中, 进而会保存到 request 中.

*/

@RequestMapping("/testModelAttribute")

public ModelAndView testModelAttribute(User user){

ModelAndView modelAndView = new ModelAndView(SUCCESS);

modelAndView.addObject(RESULT_KEY, "update : " + user); // 添加数据到model中

return modelAndView;

}

/**

* 常用方法:@ModelAttribute 修饰方法。 被该注解修饰的方法, 会在每个目标方法执行之前被 SpringMVC 调用

* 运行流程:

* 第一步: 在执行 testModelAttribute(User user) 方法前,会先执行被@ModelAttribute 注解修饰的方法 getUser()

* 第二步: 执行getUser() 后,将执行放入到Map中,其中的key 必须和目标方法User对象的首字母小写user

* 第三步: SpringMVC 从 Map 中取出 User 对象,然后把对象传入目标方法的参数.

*

* 未使用 @ModelAttribute testModelAttribute方法 打印的信息 :

* update : User [id=1, account=itdragon, password=null, position=null]

* 使用@ModelAttribute testModelAttribute方法 打印的信息 :

* update : User [id=1, account=itdragon, password=zhangdeshuai, position=null]

*/

@ModelAttribute

public void getUser(@RequestParam(value="id",required=false) Integer id,

Map map){

if(id != null){

//模拟从数据库中获取对象

User user = new User(1, "itdragon", "zhangdeshuai");

map.put("user", user); // 这里的key 一定是该对象User的首字母小写user

}

}

/**

* 常用方法:可以使用 Serlvet 原生的 API 作为目标方法的参数 具体支持以下类型

*

* HttpServletRequest

* HttpServletResponse

* HttpSession

* InputStream

* OutputStream

* Reader

* Writer

*/

@RequestMapping("/testServletAPI")

public void testServletAPI(HttpServletRequest request,

HttpServletResponse response, Writer out) throws IOException {

response.setCharacterEncoding("utf-8");

response.setContentType("text/html;charset=utf-8");

out.write("Hello Servlet API,和用Servlet一样(0——0) ;
request : " + request + " ;
response : " + response);

}

}

一样的前端index.jsp

pageEncoding="UTF-8"%>

SpringMVC 快速入门

@RequestMapping 注解提升用法

ModelAndView的使用方法

account:

使用原生的Servlet API

两个实体类和查看结果的jsp页面没有变

效果图:

1c2e52c30bb8c56bfb63d13ba5f43849.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis查询所有key命令_想在生产搞事情?那试试这些 Redis 命令

作者:鸭血粉丝出自:Java极客技术原文:mp.weixin.qq.com/s/WeAamgYYGQfxlsppsn9_lg哎,最近阿粉又双叒叕犯事了。事情是这样的,前一段时间阿粉公司生产交易偶发报错,一番排查下来最终原因是因为 Redis 命令执…

PrintArea打印,@media screen解决移动web开发的多分辨率问题,@media print设置打印的样式...

PrintArea打印,局部DIV打印插件,依赖JQuery。 github:https://github.com/RitsC/PrintArea 当打印时需要临时改变页面布局,可以使用 media print{ /* * CSS */ } 打印时生效,打印完自动失效。 需要屏幕自适应,或多种分…

java arraycopyof_Java中System.arraycopy()和Arrays.copyOf()的区别

System.arraycopy()这是一个由java标准库提供的方法。用它进行复制数组比用for循环要快的多。arraycopy()需要的参数有:源数组,从源数组中的什么位置开始复制的偏移量,目标数组,从目标数组中的什么位置开始复制的偏移量&#xff0…

python 异步 生产者 消费者_python 线程通信 生产者与消费者

1 """2 线程通信的生产者与消费者3 python的queue模块中提供了同步的线程安全的队列类,都具有原子性,实现线程间的同步4 Queue (FIFO: fist in fist out)5 LifoQueue (LIFO: last in fist out)6 PriorityQueue (优先级队列)78…

3、C#面向对象:封装、继承、多态、String、集合、文件(下)

面向对象多态 一、装箱和拆箱 装箱:将值类型转换为引用类型。object o 1;值类型给引用类型赋值 拆箱:将引用类型转换为值类型。int n (int)o; 强制转换为值类型 满足条件:两种类型是否存在继承关系。 int n Convert.ToInt32(&q…

mysql gui 分区_一文彻底搞懂MySQL分区

一.InnoDB逻辑存储结构首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成。段段就是上图的segment区域,常见的段有数据段、索引段、回滚段等,在In…

js 获取域名_RapidDNS域名查询如何联动Goby

前言:http://RapidDNS.io 是一个秒级在线子域名和同IP域名的查询工具。目前拥有25亿条DNS记录,支持A、AAAA、CNAME、MX4种DNS记录类型。由于Goby程序对子域名收集方面不是很完善,这里特编写此插件作为其拓展。可以方便快速获取域名和ip地址信…

iOS 9应用开发教程之iOS 9新特性

iOS 9应用开发教程之iOS 9新特性 iOS 9开发概述 iOS 9是目前苹果公司用于苹果手机和苹果平板电脑的最新的操作系统。该操作系统于2015年6月8号(美国时间)被发布。本章将主要讲解iOS 9的新特性、以及使用Xcode 7.0如何编写一个简单的iOS 9的应用程序等内容…

python后端框架flask_Vue+Flask轻量级前端、后端框架,如何完美同步开发

导言我们的Vue2.0应用:简读-微信公众号RSS,即将进入后端开发。VueFlask作为轻量级前端、后端框架,非常适合组合起来快速开发。一个是js,一个是Python。Bonus:可以完美实现跨域调试,不需要JSONP,也不需要服务…

mysql查询错误_一个奇怪的MySQL查询错误

t_user表的phone_number字段是varchar(255)类型的,表示手机号,在查询某个手机号时,sql语句如下:SELECT phone_number FROM t_user WHERE phone_number 13400000000查询结果:phone_number---------------------------…

hdu 3308 线段树

输入一串数字&#xff0c;有两个操作&#xff1a;Q a b 查询a到b区间内严格递增子串的最大长度 &#xff1b; U a b 把第a位数字替换成b 。注意输入的编号是从0开始 解法&#xff1a;线段树维护区间的严格递增子串的最大长度即可。注意细节。 #include <iostream> #inclu…

kafka创建topic命令_0748-5.14.4-Kafka的扩容和缩容

​文档编写目的在Kafka集群资源使用已超出系统配置的资源时&#xff0c;或者有大量资源闲置造成资源浪费的时候&#xff0c;需要分别通过扩容Kafka和缩容Kafka来进行调整。本篇文章Fayson主要介绍如何进行Kafka的扩容和缩容&#xff0c;以及变更后的Kafka集群如何进行负载均衡的…

java 对话框 显示图片_Java对话框上显示图片

手掌心其实有很多种方法可以解决图片显示大小的问题:使用photoshop修改. 优点是可以节省系统资源, 显示图片的时候,不用做处理,缺点是需要了解ps的基本操作使用JDialog 自定义对话框. 优点 可以实现复杂的效果, 缺点,代码量比较多使用ImageIcon, Image 类 实现图片的缩放,. 优点…

class-dump获取iOS私有api

转自&#xff1a;http://blog.csdn.net/sunyuanyang625/article/details/41440167 获取各类iOS私有api 安装工具class&#xff0d;dump 资源地址http://download.csdn.net/detail/map625/8191343 运行class&#xff0d;dump并编译src项目 编译之后在produce中找到编译好的class…

python能开发什么产品_三周学 Python ?不,三周做个产品

我的同事在看到毫无开发经验的我用三周时间&#xff0c;不但从零基础用上了 Python&#xff0c;还做出了一个客户关系管理系统&#xff0c;强烈邀请我分享经验。惶恐&#xff0c;因为我并没有出色的智商&#xff0c;也没有觉得三周学 Python 是一个体现自己牛叉的事情(不少人可…

爬楼梯 java_Leetcode 70.爬楼梯(Java)

题目&#xff1a;假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f;注意&#xff1a;给定 n 是一个正整数。示例 1&#xff1a;输入&#xff1a; 2输出&#xff1a; 2解释&#xff1a; 有两种方法可以爬…

WebView之2

首先需要添加权限&#xff1a; <uses-permission android:name"android.permission.INTERNET"/>   MainActivity: package com.wyl.webview;import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.vie…

火星云分发全网视频_好用的短视频一键分发软件,让工作效率提高10倍

随着近几年新媒体行业的高速发展&#xff0c;新媒体行业的红利也越来越来&#xff0c;也有越来越多的人想要享受到这波红利&#xff0c;于是不管是个人是企业都纷纷开始进入这个市场。不过也随之诞生了一系列麻烦繁琐的问题&#xff0c;如怎么持续创作内容&#xff0c;怎么花费…

java 采样_Java编程实现beta分布的采样或抽样实例代码

本文研究的主要是Java编程实现beta分布的采样或抽样&#xff0c;具体如下。本文将使用math3提供的工具包&#xff0c;对beta分布进行采样。如下程序是对alpha81&#xff0c;beta219的beta分布函数&#xff0c;进行抽样&#xff0c;共采样10000次。package function;/*** author…

树莓派 蓝牙音响_你应该拥有一个树莓派

为什么你应该拥有一个树莓派树莓派并不是极客的玩具树莓派可以用来做什么?它能实现的实在是太多了,最常见的比如自动化脚本 各种机器人bot: QQ/wechat/微博/facebook/telegram,IM结合爬虫 telegram的bot如今被黑产们结合比特币,做成了交易系统 使用宝塔linux面板,一键安装word…