当前位置:首页 > Java技术文章 > spring4新特性之web开发增强

spring4中web开发增强知识点分享

  • 发布时间:
  • 作者:码农之家原创
  • 点击:105

spring4新特性之web开发增强

从Spring4开始,Spring以Servlet3为进行开发,如果用Spring MVC 测试框架的话需要指定Servlet3兼容的jar包(因为其Mock的对象都是基于Servlet3的)。另外为了方便Rest开发,通过新的@RestController指定在控制器上,这样就不需要在每个@RequestMapping方法上加 @ResponseBody了。而且添加了一个AsyncRestTemplate ,支持REST客户端的异步无阻塞支持。 

1、@RestController

Java代码  

@RestController 
public class UserController { 
  private UserService userService; 
  @Autowired 
  public UserController(UserService userService) { 
    this.userService = userService; 
  } 
  @RequestMapping("/test") 
   public User view() { 
    User user = new User(); 
    user.setId(1L); 
    user.setName("haha"); 
    return user; 
  } 
  @RequestMapping("/test2") 
  public String view2() { 
    return "{\"id\" : 1}"; 
  } 
} 

 其实现就是在@@RestController中加入@ResponseBody:

Java代码 

@org.springframework.stereotype.Controller 
@org.springframework.web.bind.annotation.ResponseBod 
public @interface RestController { 
} 

这样当你开发Rest服务器端的时候,spring-mvc配置文件需要的代码极少,可能就仅需如下一行:

Java代码  

<context:component-scan base-package="com.bjpowernode.spring4"/> 
<mvc:annotation-driven/>  

2、mvc:annotation-driven配置变化

统一风格;将 enableMatrixVariables改为enable-matrix-variables属性;将ignoreDefaultModelOnRedirect改为ignore-default-model-on-redirect。

3、提供AsyncRestTemplate用于客户端非阻塞异步支持。

3.1、服务器端

Java代码  

@RestController 
public class UserController { 
  private UserService userService; 
  @Autowired 
  public UserController(UserService userService) { 
    this.userService = userService; 
  } 
  @RequestMapping("/api") 
   public Callable<User> api() { 
    System.out.println("=====hello"); 
    return new Callable<User>() { 
      @Override 
      public User call() throws Exception { 
        Thread.sleep(10L * 1000); //暂停两秒 
        User user = new User(); 
        user.setId(1L); 
        user.setName("haha"); 
        return user; 
      } 
    }; 
  } 
} 

非常简单,服务器端暂停10秒再返回结果(但是服务器也是非阻塞的)。具体参考我github上的代码。 

3.2、客户端

Java代码  

public static void main(String[] args) { 
  AsyncRestTemplate template = new AsyncRestTemplate(); 
  //调用完后立即返回(没有阻塞) 
  ListenableFuture<ResponseEntity<User>> future = template.getForEntity("http://localhost:9080/spring4/api", User.class); 
  //设置异步回调 
  future.addCallback(new ListenableFutureCallback<ResponseEntity<User>>() { 
    @Override 
    public void onSuccess(ResponseEntity<User> result) { 
      System.out.println("======client get result : " + result.getBody()); 
    } 
    @Override 
    public void onFailure(Throwable t) { 
      System.out.println("======client failure : " + t); 
    } 
  }); 
  System.out.println("==no wait"); 
} 

 此处使用Future来完成非阻塞,这样的话我们也需要给它一个回调接口来拿结果; Future和Callable是一对,一个消费结果,一个产生结果。调用完模板后会立即返回,不会阻塞;有结果时会调用其回调。

 AsyncRestTemplate默认使用SimpleClientHttpRequestFactory,即通过java.net.HttpURLConnection实现;另外我们也可以使用apache的http components;使用template.setAsyncRequestFactory(new HttpComponentsAsyncClientHttpRequestFactory());设置即可。

另外在开发时尽量不要自己注册如:

Java代码 

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 

尽量使用

Java代码  

<mvc:annotation-driven/>  

它设计的已经足够好,使用子元素可以配置我们需要的配置。

且不要使用老版本的:

Java代码  

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 

否则可能得到如下异常:

写道

Circular view path [login]: would dispatch back to the current handler URL [/spring4/login] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

总结

以上所述是小编给大家介绍的spring4新特性之web开发增强,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

Spring Boot Web 开发注解篇

一、spring-boot-starter-web 依赖概述

在 Spring Boot 快速入门中,只要在 pom.xml 加入了 spring-boot-starter-web 依赖,即可快速开发 web 应用。可见,Spring Boot 极大地简化了 Spring 应用从搭建到开发的过程,做到了「开箱即用」的方式。Spring Boot 已经提供很多「开箱即用」的依赖,如上面开发 web 应用使用的 spring-boot-starter-web ,都是以 spring-boot-starter-xx 进行命名的。

Spring Boot 「开箱即用」 的设计,对开发者非常便利。简单来说,只要往 Spring Boot 项目加入相应的 spring-boot-starter-xx 依赖,就可以使用对应依赖的功能,比如加入 spring-boot-starter-data-jpa 依赖,就可以使用数据持久层框架 Spring Data JPA 操作数据源。相比 Spring 以前需要大量的XML配置以及复杂的依赖管理,极大的减少了开发工作量和学习成本。

当开发一个特定类型的应用程序时,特定的 Starter 提供所需的依赖关系,并且将对应的 Bean 注册到 Spring 容器中。spring-boot-starter-web 依赖就是提供开发 Web 应用的。

1.1 spring-boot-starter-web 职责

spring-boot-starter-web 是一个用于构建 Web 的 Starter ,包括构建 RESTful 服务应用、Spring MVC 应用等。并且不需要额外配置容器,默认使用 Tomcat 作为嵌入式容器。

1.2 spring-boot-starter-web 依赖关系

spring-boot-starter-web 这么强大,它的组成如下表:

spring-boot-starter  核心包,包括了自动化配置支持、日志、YAML 文件解析的支持等。

spring-boot-starter-json 读写 JSON 包

spring-boot-starter-tomcat Tomcat 嵌入式 Servlet 容器包

hibernate-validator Hibernate 框架提供的验证包

spring-web Spring 框架的 Web 包

spring-webmvc Spring 框架的 Web MVC 包

Spring Boot Web 开发注解篇

spring-boot-starter-web 包含了 Tomcat 和 Spring MVC ,那启动流程是这样的。 标识 @SpringBootApplication 的应用,初始化经过 spring-boot-starter  核心包中的自动化配置,构建了 Spring 容器,并通过 Tomcat 启动 Web 应用。很多 Starters 只支持 Spring MVC,一般会将 spring-boot-starter-web 依赖加入到应用的 Classpath。

另外,spring-boot-starter-web 默认使用 Tomcat 作为嵌入式 Servlet 容器,在 pom.xml 配置 spring-boot-starter-jetty 和 spring-boot-starter-undertow 就可以替换默认容器。

二、Spring MVC on Spring Boot

Spring MVC 是 Spring Web 重要的模块。内容包括 MVC 模式的实现和 RESTful 服务的支持。

2.1 Spring MVC 体系温故知新

spring-webmvc 模块里面包:

– org.springframework.web.servlet 提供与应用程序上下文基础结构集成的 Servlet,以及 Spring web MVC 框架的核心接口和类。
– org.springframework.web.servlet.mvc Spring 附带的 Servlet MVC 框架的标准控制器实现。
– org.springframework.web.servlet.mvc.annotation 用于基于注解的 Servlet MVC 控制器的支持包。
– org.springframework.web.servlet.mvc.condition 用于根据条件匹配传入请求的公共 MVC 逻辑。
– org.springframework.web.servlet.mvc.method 用于处理程序方法处理的基于 Servlet 的基础结构,基于在 org.springframework.web.method 包上。
– org.springframework.web.servlet.view 提供标准的 View 和 ViewResolver 实现,包括自定义实现的抽象基类。
– org.springframework.web.servlet.view.freemarker 支持将 FreeMarker 集成为 Spring Web 视图技术的类。
– org.springframework.web.servlet.view.json 支持提供基于 JSON 序列化的 View 实现的类。

上面列出来核心的包。org.springframework.web.servlet.view 包中, View 视图实现有常见的:JSON 、FreeMarker 等。org.springframework.web.servlet.mvc 包中,Controller 控制层实现包括了注解、程序方法处理等封装。自然,看源码先从 org.springframework.web.servlet 包看其核心的接口和类。

2.2 重要的类

DispatcherServlet 类:调度 HTTP 请求控制器(或者处理器 Handler)。
View 视图层 ModelAndView 类:模型和视图的持有者。
View 接口:MVC WEB 交互。该接口的实现负责呈现视图或者暴露模型。
Controller 控制层 HandlerMapping 接口: 请求从 DispacherServlet 过来,该接口定义请求和处理程序对象之间的映射。
HandlerInterceptor 接口:处理程序的执行链接口。

Spring MVC 框架模型

Spring Boot Web 开发注解篇2.3 Spring Boo

2.3 Spring Boot MVC

以前 Spring MVC 开发模式是这样的:

1. 在 web.xml 配置 DispatcherServlet,用于截获并处理所有请求

2. 在 Spring MVC 配置文件中,声明预定义的控制器和视图解析器等

3. 编写预定义的处理请求控制器

4. 编写预定义的视图对象,比如 JSP、Freemarker 等

在 Spring Boot MVC 中,Web 自动化配置会帮你减少上面的两个步骤。默认使用的视图是 ThymeLeaf,在下面小节会具体讲

1. 编写预定义的处理请求控制器

2. 编写默认 ThymeLeaf 视图对象

例如下面会展示用户列表案例:

第一步:处理用户请求控制器

UserController.java

/**
 * 用户控制层
 *
 * Created by bysocket on 24/07/2017.
 */
@Controller
@RequestMapping(value = "/users")  // 通过这里配置使下面的映射都在 /users
public class UserController {
 @Autowired
 UserService userService;   // 用户服务层
 /**
  * 获取用户列表
  * 处理 "/users" 的GET请求,用来获取用户列表
  * 通过 @RequestParam 传递参数,进一步实现条件查询或者分页查询
  */
 @RequestMapping(method = RequestMethod.GET)
 public String getUserList(ModelMap map) {
  map.addAttribute("userList", userService.findAll());
  return "userList";
 }
}
 @Controller 注解在 UserController 类上,标识其为一个可接收 HTTP 请求的控制器
@RequestMapping(value = “/users”) 注解 ,标识 UserController 类下所有接收的请求路由都是 /users 开头的。注意:类上的 @RequestMapping 注解是不必需的
@RequestMapping(method = RequestMethod.GET) 注解,标识该 getUserList(ModelMap map) 方法会接收并处理 /users 请求,且请求方法是 GET
getUserList(ModelMap map) 方法返回的字符串 userList ,代表着是视图,会有视图解析器解析成为一个具体的视图对象,然后经过视图渲染展示到浏览器

第二步:用户列表 ThymeLeaf 视图对象

<!DOCTYPE html>
<html lang="zh-CN">
 <head>
  <script type="text/javascript" th:src="@{https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js}"></script>
  <link th:href="@{https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css}" rel="external nofollow" rel="stylesheet"/>
  <link th:href="@{/css/default.css}" rel="external nofollow" rel="stylesheet"/>
  <link rel="icon" th:href="@{/images/favicon.ico}" rel="external nofollow" type="image/x-icon"/>
  <meta charset="UTF-8"/>
  <title>用户列表</title>
 </head>
 <body>
  <div class="contentDiv">
   <h5> 《 Spring Boot 2.x 核心技术实战》第二章快速入门案例</h5>
   <table class="table table-hover table-condensed">
    <legend>
     <strong>用户列表</strong>
    </legend>
    <thead>
     <tr>
      <th>用户编号</th>
      <th>名称</th>
      <th>年龄</th>
      <th>出生时间</th>
      <th>管理</th>
     </tr>
    </thead>
    <tbody>
     <tr th:each="user : ${userList}">
      <th scope="row" th:text="${user.id}"></th>
      <td><a th:href="@{/users/update/{userId}(userId=${user.id})}" rel="external nofollow" th:text="${user.name}"></a></td>
      <td th:text="${user.age}"></td>
      <td th:text="${user.birthday}"></td>
      <td><a class="btn btn-danger" th:href="@{/users/delete/{userId}(userId=${user.id})}" rel="external nofollow" >删除</a></td>
     </tr>
    </tbody>
   </table>
   <div><a class="btn btn-primary" href="/users/create" rel="external nofollow" role="button">创建用户</a></div>
  </div>
 </body>
</html>

一个 table 展示用户列表,引入了 jquery.min.js 和 bootstrap.min.css ,更好的展示页面效果。具体 ThymeLeaf 语法下面会讲到。

代码共享在:https://github.com/JeffLi1993/spring-boot-core-book-demo

2.3.1 控制器

什么是控制器?控制器就是控制请求接收和负责响应到视图的角色。

@Controller 注解标识一个类作为控制器。DispatcherServlet 会扫描所有控制器类,并检测 @RequestMapping 注解配置的方法。Web 自动化配置已经处理完这一步骤。

@RequestMapping 注解标识请求 URL 信息,可以映射到整个类或某个特定的方法上。该注解可以表明请求需要的。

使用 value 指定特定的 URL ,比如 @RequestMapping(value = “/users”) 和 @RequestMapping(value = “/users/create”) 等

使用 method 指定 HTTP 请求方法,比如 RequestMethod.GET 等

还有使用其他特定的参数条件,可以设置 consumes 指定请求时的请求头需要包含的 Content-Type 值、设置 produces 可确保响应的内容类型

MVC on REST ful 场景

在 HTTP over JSON (自然 JSON、XML或其他自定义的媒体类型内容等均可)场景,配合上前后端分离的开发模式,我们经常会用 @ResponseBody 或 @RestController 两种方式实现 RESTful HTTP API 。

老方式:

@ResponseBody 注解标识该方法的返回值。这样被标注的方法返回值,会直接写入 HTTP 响应体(而不会被视图解析器认为是一个视图对象)。

新方式:

@RestController 注解,和 @Controller 用法一致,整合了 @Controller 和 @ResponseBody 功能。这样不需要每个 @RequestMapping 方法上都加上 @ResponseBody 注解,这样代码更简明。

使代码更简明,还有常用便捷注解 @GetMapping、@PostMapping 和 @PutMapping 等

HTTP 协议相关知识回顾,可以看看我以前的博文《图解 HTTP 协议》http://www.bysocket.com/?p=282

2.3.2 数据绑定

数据绑定,简单的说就是 Spring MVC 从请求中获取请求入参,赋予给处理方法相应的入参。主要流程如下:

1. DataBinder 接受带有请求入参的 ServletRequest 对象

2. 调用 ConversionService 组件,进行数据类型转换、数据格式化等工作

3. 然后调用 Validator 组件,进行数据校验等工作

4. 绑定结果到 BindingResult 对象

5. 最后赋予给处理方法相应的入参

@ModelAttribute 注解添加一个或多个属性(类对象)到 model 上。例如

 @RequestMapping(value = "/create", method = RequestMethod.POST)
 public String postUser(@ModelAttribute User user)

@PathVariable 注解通过变量名匹配到 URI 模板中相对应的变量。例如

 @RequestMapping(value = "/update/{id}", method = RequestMethod.GET)
 public String getUser(@PathVariable("id") Long id, ModelMap map)

@RequestParam 注解将请求参数绑定到方法参数。

@RequestHeader 注解将请求头属性绑定到方法参数。

2.3.3 视图和视图解析

视图的职责就是渲染模型数据,将模型里面的数据展示给用户。

请求到经过处理方法处理后,最终返回的是 ModeAndView 。可以从 Spring MVC 框架模型 看出,最终经过 ViewResolver 视频解析器得到视图对象 View。可能是我们常见的 JSP ,也可能是基于 ThymLeaf 、FreeMarker 或 Velocity 模板引擎视图,当然还有可能是 JSON 、XML 或者 PDF 等各种形式。

业界流行的模板引擎有如下的 Starters 支持:

spring-boot-starter-thymeleaf Thymeleaf 模板视图依赖,官方推荐

spring-boot-starter-freemarker Freemarker 模板视图依赖

spring-boot-starter-groovy-templates Groovy 模板视图依赖

spring-boot-starter-mustache Mustache 模板视图依赖

具体,spring-boot-starter-thymeleaf 使用案例在 GitHub :https://github.com/JeffLi1993/spring-boot-core-book-demo 的 chapter-2-spring-boot-quick-start 工程。

三、小结

本文主要介绍了 Spring Boot 在 Web 开发中涉及到的 HTTP 协议,还有一些 Spring MVC 相关的知识。

推荐:

开源项目 springboot-learning-example https://github.com/JeffLi1993/springboot-learning-example

开源项目 spring-boot-core-book-demo https://github.com/JeffLi1993/spring-boot-core-book-demo

总结

以上所述是小编给大家介绍的Spring Boot Web 开发注解篇,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

以上就是本次给大家分享的关于Java的全部知识点内容总结,大家还可以在下方相关文章里找到Java文件和base64流相互转换、 java图形界面编程的代码详、 Java实现快速排序原理分析、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:Java数组越界问题代码详解

下一篇:Java Swing中JTable渲染器与编辑器的用法详解

展开 +

收起 -

spring4 web开发 相关内容
Spring Boot 2企业应用实战

本书全面介绍了全新的Spring Boot 2和常用第三方框架整合开发相关的各方面知识。书中操作步骤细致,编程思路清晰,语言平实易懂。读者参考本书的架构,可以身临其境地感受企业实际项目开发。

查看详情
Spring Boot 企业级应用开发实战

《Spring Boot 企业级应用开发实战》 围绕如何整合以 Spring Boot 为核心的技术栈,来实现一个完整的企业级博客系统 NewStarBlog 而展开。该博客系统支持市面上博客系统的常见功能。读者朋友可以

查看详情
Spring5高级编程

获取Spring 5经验的必备图书!全面的Spring 参考和实用指南,Spring 5的新特性和方法,精通数据访问和事务处理,创建微服务和其他Web服务和与Java 9的互操作性。

查看详情
深入理解Spring Cloud与微服务构建

深入浅出讲解Spring Cloud组件、开发工具、框架等知识点。使读者全面理解微服务的构建原理。实例丰富,解释清晰,易于读者真正理解原理,并学以致用。深入讲解Spring Cloud OAuth2,直击市场需求痛点。

查看详情
Spring Cloud微服务架构开发实战

资深架构师手把手带你实战微服务;提供从设计、开发、部署到运维的一站式解决方案;涵盖Spring Boot微服务开发、Spring Cloud核心组件、Docker部署微服务应用;详解大量易于构建、运行

查看详情
Spring微服务实战

本书教读者如何使用Java和Spring平台构建基于微服务的应用程序。在构建和部署Spring Cloud应用程序时,读者将学习如何进行微服务设计。精心挑选的真实案例展示了基于微服务的各种模式,这些模式用于配置、路由、扩展和部署服务。

查看详情
微服务架构实战:基于Spring Boot、Spring Cloud、Docker

1.根据SpringBoot、SpringCloud、Docker等技术性搭建微保障体系。 2.精减而详细的经典案例展现保持分布式架构的详细宏伟蓝图。 3.融合业务流程情景,根据全方位实例得出专用工具在搭建分布式架构

查看详情
spring4 web开发 学习笔记
网友NO.936917

Spring Boot 利用WebUploader进行文件上传功能

Web Uploader简介 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。两套运行时,同样的调用方式,可供用户任意选用。采用大文件分片并发上传,极大的提高了文件上传效率。 我们这里使用官网的一个例子来实现我们个人头像的上传。 我们的重点是在Spring Boot项目中利用WebUploader如何进行文件上传,所以直接实现一个简单的功能,仅供参考。 下面是一个从官网下载来的示例:带剪裁的图片上传功能。 我们利用示例来改造项目中的个人头像上传。 效果看起来是这样的: 首先我们来改造我们的WebUploader示例代码。 以下都是我项目中的部分代码: (function( factory ) { if ( !window.jQuery ) { alert('jQuer……

网友NO.350139

详解Spring/Spring boot异步任务编程WebAsyncTask

今天一起学习下如何在Spring中进行异步编程。我们都知道,web服务器处理请求 request 的线程是从线程池中获取的,这也不难解释,因为当web请求并发数非常大时,如何一个请求进来就创建一条处理线程,由于创建线程和线程上下文切换的开销是比较大的,web服务器最终将面临崩溃。另外,web服务器创建的处理线程从头到尾默认是同步执行的,也就是说,假如处理线程A负责处理请求B,那么当B没有 return 之前,处理线程A是不可以脱身去处理别的请求的,这将极大限制了web服务器的并发处理能力。 因此线程池解决了线程可循环利用的问题,那同步处理请求怎么去解决呢?答案是异步处理。什么是异步处理呢?异步处理主要是让上面的B请求处理完成之前,能够将A线程空闲出来继续去处理别的请求。那么我们可以这样做,在A线程内部重新开启一个线程C去执……

网友NO.254022

springboot websocket简单入门示例

之前做的需求都是客户端请求服务器响应,新需求是服务器主动推送信息到客户端.百度之后有流、长轮询、websoket等方式进行.但是目前更加推崇且合理的显然是websocket. 从springboot官网翻译了一些资料,再加上百度简单实现了springboot使用websocekt与客户端的双工通信. 1.首先搭建一个简单的springboot环境 !-- Inherit defaults from Spring Boot -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.0.4.RELEASE/version /parent !-- Add typical dependencies for a web application -- dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies 2.引入springboot整合websocket依赖 !-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket --dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-websocket/artifactId version2.……

网友NO.442458

Spring Web项目spring配置文件随服务器启动时自动加载

前言:其实配置文件不随服务器启动时加载也是可以的,但是这样操作的话,每次获取相应对象,就会去读取一次配置文件,从而降低程序的效率,而Spring中已经为我们提供了监听器,可监听服务器是否启动,然后在启动时,加载spring的配置文件,并且只加载一次,从而提高程序效率。 实现:其配置需要在web.xml中进行,具体实现如下: !--配置监听器 -- !--以便在服务器启动的时候,加载spring配置文件-- listener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener !--配置spring配置文件-- context-param param-namecontextConfigLocation/param-name param-valueclasspath:spring/spring-context.xml/param-value /context-param 注:这里注意context-param标签中param-name中的内容为固定值,param-value中内容为固定格式:classpath:spring配置文件(如有路径请加上) 通过以上配置就可以让……

网友NO.932936

Spring Boot启动时调用自己的非web逻辑

在spring Boot中,有些代码是WEB功能,例如API等,但是有些逻辑是非WEB,启动时就要调用并持续运行的,该如何加载自己的非WEB逻辑呢? SpringBootApplication类实现CommandLineRunner并覆盖run()方法 @SpringBootApplication public class ZjkApplication implements CommandLineRunner{ /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // WEB SpringApplication.run(ZjkApplication.class, args); } @Override public void run(String... args) throws Exception { //your logic System.out.println("into zjk run"); } } 使用上面方式启动的SPRING BOOT,即可以运行WEB又可以运行自己的逻辑 总结 以上所述是小编给大家介绍的Spring Boot启动时调用自己的非web逻辑,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持! ……

<
1
>

Copyright 2018-2020 xz577.com 码农之家

本站所有电子书资源不再提供下载地址,只分享来路

免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

版权投诉 / 书籍推广 / 赞助:QQ:520161757