IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Java开发学习(二十五)----使用PostMan完成不同类型参数传递 -> 正文阅读

[开发工具]Java开发学习(二十五)----使用PostMan完成不同类型参数传递

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

一、请求参数

请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数?

关于请求参数的传递与接收是和请求方式有关系的,目前比较常见的两种请求方式为:

  • GET
  • POST

针对于不同的请求前端如何发送,后端如何接收?

1.1 环境准备

xml version="1.0" encoding="UTF-8"?
?
<project xmlns="http://maven.apache.org/POM/4.0.0" 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">
 ?<modelVersion>4.0.0modelVersion>
?
 ?<groupId>com.itheimagroupId>
 ?<artifactId>springmvc_03_request_mappingartifactId>
 ?<version>1.0-SNAPSHOTversion>
 ?<packaging>warpackaging>
?
 ?<dependencies>
 ? ?<dependency>
 ? ? ?<groupId>javax.servletgroupId>
 ? ? ?<artifactId>javax.servlet-apiartifactId>
 ? ? ?<version>3.1.0version>
 ? ? ?<scope>providedscope>
 ? ?dependency>
 ? ?<dependency>
 ? ? ?<groupId>org.springframeworkgroupId>
 ? ? ?<artifactId>spring-webmvcartifactId>
 ? ? ?<version>5.2.10.RELEASEversion>
 ? ?dependency>
 ?dependencies>
?
 ?<build>
 ? ?<plugins>
 ? ? ?<plugin>
 ? ? ? ?<groupId>org.apache.tomcat.mavengroupId>
 ? ? ? ?<artifactId>tomcat7-maven-pluginartifactId>
 ? ? ? ?<version>2.1version>
 ? ? ? ?<configuration>
 ? ? ? ? ?<port>80port>
 ? ? ? ? ?<path>/path>
 ? ? ? ?configuration>
 ? ? ?plugin>
 ? ?plugins>
 ?build>
project>
?
  • 创建对应的配置类
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
?
 ? ?protected Class[] getServletConfigClasses() {
 ? ? ? ?return new Class[]{SpringMvcConfig.class};
 ?  }
 ? ?protected String[] getServletMappings() {
 ? ? ? ?return new String[]{"/"};
 ?  }
 ? ?protected Class[] getRootConfigClasses() {
 ? ? ? ?return new Class[0];
 ?  }
}
?
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
?
  • 编写UserController
@Controller
public class UserController {
?
 ? ?@RequestMapping("/commonParam")
 ? ?@ResponseBody
 ? ?public String commonParam(){
 ? ? ? ?return "{'module':'commonParam'}";
 ?  }
}
  • 编写模型类,User和Address
public class Address {
 ? ?private String province;
 ? ?private String city;
 ? ?//setter...getter...略
}
public class User {
 ? ?private String name;
 ? ?private int age;
 ? ?//setter...getter...略
}

最终创建好的项目结构如下:

1.2 参数传递

GET发送单个参数

发送请求与参数:

http://localhost/commonParam?name=itcast

另外:对于PostMan如何觉得字小不好看,可以使用ctrl+=调大,ctrl+-调小。

接收参数:

@Controller
public class UserController {
?
 ? ?@RequestMapping("/commonParam")
 ? ?@ResponseBody
 ? ?public String commonParam(String name){
 ? ? ? ?System.out.println("普通参数传递 name ==> "+name);
 ? ? ? ?return "{'module':'commonParam'}";
 ?  }
}
GET发送多个参数

发送请求与参数:

http://localhost/commonParam?name=itcast&age=15

接收参数:

@Controller
public class UserController {
?
 ? ?@RequestMapping("/commonParam")
 ? ?@ResponseBody
 ? ?public String commonParam(String name,int age){
 ? ? ? ?System.out.println("普通参数传递 name ==> "+name);
 ? ? ? ?System.out.println("普通参数传递 age ==> "+age);
 ? ? ? ?return "{'module':'commonParam'}";
 ?  }
}
GET请求中文乱码

如果我们传递的参数中有中文,你会发现接收到的参数会出现中文乱码问题。

发送请求:http://localhost/commonParam?name=张三&age=18

控制台:

出现乱码的原因相信大家都清楚,Tomcat8.5以后的版本已经处理了中文乱码的问题,但是IDEA中的Tomcat插件目前只到Tomcat7,所以需要修改pom.xml来解决GET请求中文乱码问题

<build>
 ? ?<plugins>
 ? ? ?<plugin>
 ? ? ? ?<groupId>org.apache.tomcat.mavengroupId>
 ? ? ? ?<artifactId>tomcat7-maven-pluginartifactId>
 ? ? ? ?<version>2.1version>
 ? ? ? ?<configuration>
 ? ? ? ? ?<port>80port>
 ? ? ? ? ?<path>/path> 
 ? ? ? ? ?<uriEncoding>UTF-8uriEncoding>
 ? ? ? ?configuration>
 ? ? ?plugin>
 ? ?plugins>
 ?build>
POST发送参数

发送请求与参数:

接收参数:

和GET一致,不用做任何修改

@Controller
public class UserController {
?
 ? ?@RequestMapping("/commonParam")
 ? ?@ResponseBody
 ? ?public String commonParam(String name,int age){
 ? ? ? ?System.out.println("普通参数传递 name ==> "+name);
 ? ? ? ?System.out.println("普通参数传递 age ==> "+age);
 ? ? ? ?return "{'module':'commonParam'}";
 ?  }
}
POST请求中文乱码

form-data与x-www-form-urlencoded都可以post请求,区别在于form-data可以发送文件

发送请求与参数:

接收参数:

控制台打印,会发现有中文乱码问题。

解决方案:配置过滤器

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
 ? ?protected Class[] getRootConfigClasses() {
 ? ? ? ?return new Class[0];
 ?  }
?
 ? ?protected Class[] getServletConfigClasses() {
 ? ? ? ?return new Class[]{SpringMvcConfig.class};
 ?  }
?
 ? ?protected String[] getServletMappings() {
 ? ? ? ?return new String[]{"/"};
 ?  }
?
 ? ?//乱码处理
 ? ?@Override
 ? ?protected Filter[] getServletFilters() {
 ? ? ? ?CharacterEncodingFilter filter = new CharacterEncodingFilter();
 ? ? ? ?filter.setEncoding("UTF-8");
 ? ? ? ?return new Filter[]{filter};
 ?  }
}

CharacterEncodingFilter是在spring-web包中,所以用之前需要导入对应的jar包。

二、五种类型参数传递

前面我们已经能够使用GET或POST来发送请求和数据,所携带的数据都是比较简单的数据,接下来在这个基础上,我们来研究一些比较复杂的参数传递,常见的参数种类有:

  • 普通参数
  • POJO类型参数
  • 嵌套POJO类型参数
  • 数组类型参数
  • 集合类型参数

这些参数如何发送,后台改如何接收?

2.1 普通参数

  • 普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数。

如果形参与地址参数名不一致该如何解决?

发送请求与参数:

http://localhost/commonParamDifferentName?name=张三&age=18

后台接收参数:

@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(String userName , int age){
 ? ?System.out.println("普通参数传递 userName ==> "+userName);
 ? ?System.out.println("普通参数传递 age ==> "+age);
 ? ?return "{'module':'common param different name'}";
}

因为前端给的是name,后台接收使用的是userName,两个名称对不上,导致接收数据失败:

解决方案:使用@RequestParam注解

@RequestMapping("/commonParamDifferentName")
 ? ?@ResponseBody
 ? ?public String commonParamDifferentName(@RequestParam("name") String userName , int age){
 ? ? ? ?System.out.println("普通参数传递 userName ==> "+userName);
 ? ? ? ?System.out.println("普通参数传递 age ==> "+age);
 ? ? ? ?return "{'module':'common param different name'}";
 ?  }

注意:写上@RequestParam注解框架就不需要自己去解析注入,能提升框架处理性能

2.2 POJO数据类型

简单数据类型一般处理的是参数个数比较少的请求,如果参数比较多,那么后台接收参数的时候就比较复杂,这个时候我们可以考虑使用POJO数据类型。

  • POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数

此时需要使用前面准备好的POJO类,先来看下User

public class User {
 ? ?private String name;
 ? ?private int age;
 ? ?//setter...getter...略
}

发送请求和参数:

后台接收参数:

//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
 ? ?System.out.println("pojo参数传递 user ==> "+user);
 ? ?return "{'module':'pojo param'}";
}

注意:

  • POJO参数接收,前端GET和POST发送请求数据的方式不变。
  • 请求参数key的名称要和POJO中属性的名称一致,否则无法封装。

2.3 嵌套POJO类型参数

如果POJO对象中嵌套了其他的POJO类,如

public class Address {
 ? ?private String province;
 ? ?private String city;
 ? ?//setter...getter...略
}
public class User {
 ? ?private String name;
 ? ?private int age;
 ? ?private Address address;
 ? ?//setter...getter...略
}
  • 嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

发送请求和参数:

后台接收参数:

//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
 ? ?System.out.println("pojo参数传递 user ==> "+user);
 ? ?return "{'module':'pojo param'}";
}

注意:

请求参数key的名称要和POJO中属性的名称一致,否则无法封装

2.4 数组类型参数

举个简单的例子,如果前端需要获取用户的爱好,爱好绝大多数情况下都是多个,如何发送请求数据和接收数据呢?

  • 数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数

发送请求和参数:

后台接收参数:

 ?//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
 ? ?@RequestMapping("/arrayParam")
 ? ?@ResponseBody
 ? ?public String arrayParam(String[] likes){
 ? ? ? ?System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
 ? ? ? ?return "{'module':'array param'}";
 ?  }

2.5 集合类型参数

数组能接收多个值,那么集合是否也可以实现这个功能呢?

发送请求和参数:

后台接收参数:

//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(List<String> likes){
 ? ?System.out.println("集合参数传递 likes ==> "+ likes);
 ? ?return "{'module':'list param'}";
}

运行会报错,

错误的原因是:SpringMVC将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以报错。

解决方案是:使用@RequestParam注解

//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
 ? ?System.out.println("集合参数传递 likes ==> "+ likes);
 ? ?return "{'module':'list param'}";
}
  • 集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
  • 对于简单数据类型使用数组会比集合更简单些。

知识点1:@RequestParam

名称@RequestParam
类型形参注解
位置SpringMVC控制器方法形参定义前面
作用绑定请求参数与处理器方法形参间的关系
相关参数required:是否为必传参数 defaultValue:参数默认值

三、JSON数据传输参数

现在比较流行的开发方式为异步调用。前后台以异步方式进行交换,传输的数据使用的是JSON,所以前端如果发送的是JSON数据,后端该如何接收?

对于JSON数据类型,我们常见的有三种:

  • json普通数组([“value1”,“value2”,“value3”,…])
  • json对象({key1:value1,key2:value2,…})
  • json对象数组([{key1:value1,…},{key2:value2,…}])

对于上述数据,前端如何发送,后端如何接收?

JSON普通数组

步骤1:pom.xml添加依赖

SpringMVC默认使用的是jackson来处理json的转换,所以需要在pom.xml添加jackson依赖

<dependency>
 ? ?<groupId>com.fasterxml.jackson.coregroupId>
 ? ?<artifactId>jackson-databindartifactId>
 ? ?<version>2.9.0version>
dependency>
步骤2:PostMan发送JSON数据

Body->raw->JSON

步骤3:开启SpringMVC注解支持

在SpringMVC的配置类中开启SpringMVC的注解支持,这里面就包含了将JSON转换成对象的功能。

@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}
步骤4:参数前添加@RequestBody
//使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
 ? ?System.out.println("list common(json)参数传递 list ==> "+likes);
 ? ?return "{'module':'list common for json param'}";
}
步骤5:启动运行程序

JSON普通数组的数据就已经传递完成,下面针对JSON对象数据和JSON对象数组的数据该如何传递呢?

JSON对象数据

请求和数据的发送:

{
    "name":"itcast",
    "age":15
}

后端接收数据:

@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
 ? ?System.out.println("pojo(json)参数传递 user ==> "+user);
 ? ?return "{'module':'pojo for json param'}";
}

启动程序访问测试

说明:

address为null的原因是前端没有传递数据给后端。

如果想要address也有数据,我们需求修改前端传递的数据内容:

{
    "name":"itcast",
    "age":15,
 ? ?"address":{
 ? ? ? ?"province":"beijing",
 ? ? ? ?"city":"beijing"
 ?  }
}

再次发送请求,就能看到address中的数据

JSON对象数组

集合中保存多个POJO该如何实现?

请求和数据的发送:

[
 ?  {"name":"itcast","age":15},
 ?  {"name":"itheima","age":12}
]

后端接收数据:

@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List list){
 ? ?System.out.println("list pojo(json)参数传递 list ==> "+list);
 ? ?return "{'module':'list pojo for json param'}";
}

启动程序访问测试

小结

SpringMVC接收JSON数据的实现步骤为:

(1)导入jackson包

(2)使用PostMan发送JSON数据

(3)开启SpringMVC注解驱动,在配置类上添加@EnableWebMvc注解

(4)Controller方法的参数前添加@RequestBody注解

知识点1:@EnableWebMvc

名称@EnableWebMvc
类型配置类注解
位置SpringMVC配置类定义上方
作用开启SpringMVC多项辅助功能

知识点2:@RequestBody

名称@RequestBody
类型形参注解
位置SpringMVC控制器方法形参定义前面
作用将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次

@RequestBody与@RequestParam区别

  • 区别

    • @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
    • @RequestBody用于接收json数据【application/json】
  • 应用

    • 后期开发中,发送json格式数据为主,@RequestBody应用较广
    • 如果发送非json格式数据,选用@RequestParam接收请求参数

四、日期类型参数传递

前面我们处理过简单数据类型、POJO数据类型、数组和集合数据类型以及JSON数据类型,接下来我们还得处理一种开发中比较常见的一种数据类型,日期类型

日期类型比较特殊,因为对于日期的格式有N多中输入方式,比如:

  • 2088-08-18
  • 2088/08/18
  • 08/18/2088

针对这么多日期格式,SpringMVC该如何接收,它能很好的处理日期类型数据么?

步骤1:编写方法接收日期数据

在UserController类中添加方法,把参数设置为日期类型

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date)
 ? ?System.out.println("参数传递 date ==> "+date);
 ? ?return "{'module':'data param'}";
}

步骤2:启动Tomcat服务器

步骤3:使用PostMan发送请求

使用PostMan发送GET请求,并设置date参数

步骤4:查看控制台

通过打印,我们发现SpringMVC可以接收日期数据类型,并将其打印在控制台。

这个时候,我们就想如果把日期参数的格式改成其他的,SpringMVC还能处理么?

步骤5:更换日期格式

为了能更好的看到程序运行的结果,我们在方法中多添加一个日期参数

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,Date date1)
 ? ?System.out.println("参数传递 date ==> "+date);
    System.out.println("参数传递 date1 ==> "+date1);
 ? ?return "{'module':'data param'}";
}

使用PostMan发送请求,携带两个不同的日期格式,

http://localhost/dataParam?date=2088/08/08&date1=2088-08-08

发送请求和数据后,页面会报400,控制台会报出一个错误

Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type ‘java.lang.String’ to required type ‘java.util.Date’; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value ‘2088-08-08’; nested exception is java.lang.IllegalArgumentException]

从错误信息可以看出,错误的原因是在将2088-08-08转换成日期类型的时候失败了,原因是SpringMVC默认支持的字符串转日期的格式为yyyy/MM/dd,而我们现在传递的不符合其默认格式,SpringMVC就无法进行格式转换,所以报错。

解决方案也比较简单,需要使用@DateTimeFormat

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
 ? ? ? ? ? ? ? ? ? ? ? ?@DateTimeFormat(pattern="yyyy-MM-dd") Date date1)
 ? ?System.out.println("参数传递 date ==> "+date);
    System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
 ? ?return "{'module':'data param'}";
}

重新启动服务器,重新发送请求测试,SpringMVC就可以正确的进行日期转换了

步骤6:携带时间的日期

接下来我们再来发送一个携带时间的日期,看下SpringMVC该如何处理?

先修改UserController类,添加第三个参数

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
 ? ? ? ? ? ? ? ? ? ? ? ?@DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
 ? ? ? ? ? ? ? ? ? ? ? ?@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2)
 ? ?System.out.println("参数传递 date ==> "+date);
    System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
    System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
 ? ?return "{'module':'data param'}";
}

使用PostMan发送请求,携带两个不同的日期格式,

http://localhost/dataParam?date=2088/08/08&date1=2088-08-08&date2=2088/08/08 8:08:08

重新启动服务器,重新发送请求测试,SpringMVC就可以将日期时间的数据进行转换

知识点1:@DateTimeFormat

名称@DateTimeFormat
类型形参注解
位置SpringMVC控制器方法形参前面
作用设定日期时间型数据格式
相关属性pattern:指定日期时间格式字符串

内部实现原理

讲解内部原理之前,我们需要先思考个问题:

  • 前端传递字符串,后端使用日期Date接收
  • 前端传递JSON数据,后端使用对象接收
  • 前端传递字符串,后端使用Integer接收
  • 后台需要的数据类型有很多种
  • 在数据的传递过程中存在很多类型的转换

谁来做这个类型转换?答:SpringMVC

SpringMVC是如何实现类型转换的?SpringMVC中提供了很多类型转换接口和实现类

在框架中,有一些类型转换接口,其中有:

  • (1) Converter接口
/**
* S: the source type
* T: the target type
*/
public interface Converter<S, T> {
 ? ?@Nullable
 ? ?//该方法就是将从页面上接收的数据(S)转换成我们想要的数据类型(T)返回
 ? ?T convert(S source);
}

注意:Converter所属的包为org.springframework.core.convert.converter

Converter接口的实现类

框架中有提供很多对应Converter接口的实现类,用来实现不同数据类型之间的转换,如:

请求参数年龄数据(String→Integer)

日期格式转换(String → Date)

  • (2) HttpMessageConverter接口

该接口是实现对象与JSON之间的转换工作,了解一下即可

注意:SpringMVC的配置类把@EnableWebMvc当做标配配置上去,不要省略

@EnableWebMvc功能之一:根据类型匹配对应的类型转换器


如果您觉得阅读本文对您有帮助,请点一下“**推荐**”按钮,您的**“推荐”**将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后**必须在文章页面明显位置给出作者和原文连接**,否则保留追究法律责任的权利。
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:26:35  更:2022-08-19 19:29:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:32:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码