java发送HttpClient请求及接收请求结果过程的简单实例

 更新时间:2016年11月06日 12:32:05   投稿:jingxian  
下面小编就为大家带来一篇java发送HttpClient请求及接收请求结果过程的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

一.

1、写一个HttpRequestUtils工具类,包括post请求和get请求

package com.brainlong.framework.util.httpclient; 
import net.sf.json.JSONObject;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; 
import java.io.IOException;import java.net.URLDecoder; public class HttpRequestUtils {  
private static Logger logger = LoggerFactory.getLogger(HttpRequestUtils.class);  
//日志记录   /**   * httpPost   * @param url 路径   * @param jsonParam 参数   * @return   */  
public static JSONObject httpPost(String url,JSONObject jsonParam){    
return httpPost(url, jsonParam, false);  
}   
/**   * post请求   * @param url     url地址   * @param jsonParam   参数   * @param noNeedResponse  不需要返回结果   * @return   */  
public static JSONObject httpPost(String url,JSONObject jsonParam, boolean noNeedResponse){    
//post请求返回结果    
DefaultHttpClient httpClient = new DefaultHttpClient();    
JSONObject jsonResult = null;    
HttpPost method = new HttpPost(url);    
try {      
if (null != jsonParam) {        
//解决中文乱码问题        
StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8");        
entity.setContentEncoding("UTF-8");        
entity.setContentType("application/json");        
method.setEntity(entity);      }      
HttpResponse result = httpClient.execute(method);      
url = URLDecoder.decode(url, "UTF-8");      
/**请求发送成功,并得到响应**/      
if (result.getStatusLine().getStatusCode() == 200) {        
String str = "";        
try {          
/**读取服务器返回过来的json字符串数据**/          
str = EntityUtils.toString(result.getEntity());          
if (noNeedResponse) {            
return null;          
}          
/**把json字符串转换成json对象**/          
jsonResult = JSONObject.fromObject(str);        
} catch (Exception e) {          
logger.error("post请求提交失败:" + url, e);        
}      
}    
} catch (IOException e) {      
logger.error("post请求提交失败:" + url, e);    
}    
return jsonResult;  
}   
/**   * 发送get请求   * @param url  路径   * @return   */  
public static JSONObject httpGet(String url){    
//get请求返回结果    
JSONObject jsonResult = null;    
try {      
DefaultHttpClient client = new DefaultHttpClient();      
//发送get请求      
HttpGet request = new HttpGet(url);      
HttpResponse response = client.execute(request);       
/**请求发送成功,并得到响应**/      
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {        
/**读取服务器返回过来的json字符串数据**/        
String strResult = EntityUtils.toString(response.getEntity());        
/**把json字符串转换成json对象**/        
jsonResult = JSONObject.fromObject(strResult);        
url = URLDecoder.decode(url, "UTF-8");      
} else {        
logger.error("get请求提交失败:" + url);      
}    
} catch (IOException e) {      
logger.error("get请求提交失败:" + url, e);    
}    
return jsonResult;  }}

2、写业务代码发送Http请求

3、MVC配置文件设置Controller扫描目录

<!-- 自动扫描且只扫描@Controller -->
<context:component-scan base-package="com.wiselong.multichannel" use-default-filters="false">  
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan> 

4、接收Http请求

接收post请求

@Controller

@RequestMapping(value = "/api/platform/exceptioncenter/exceptioninfo")

public class ExceptionInfoController {

//注入

@Autowired

private ExceptionInfoBiz exceptionInfoBiz;



/**

* 创建异常信息请求

* @param requestBody 请求消息内容

* @param request 请求消息头

* @return jsonObject

*/

@RequestMapping(

value="/create",

method = RequestMethod.POST

)

public ModelAndView createExceptionInfo(@RequestBody String requestBody, HttpServletRequest request) {

JSONObject jsonObject = JSONObject.fromObject(requestBody);

ComExceptionInfo comExceptionInfo = new ComExceptionInfo();

comExceptionInfo.setProjectName(jsonObject.getString("projectName"));

comExceptionInfo.setTagName(jsonObject.getString("tagName"));

exceptionInfoBiz.insert(comExceptionInfo);

//返回请求结果

JSONObject result= new JSONObject();

result.put("success", "true");

return new ModelAndView("", ResponseUtilsHelper.jsonSuccess(result.toString()));

}

}

接收get请求

@Controller

@RequestMapping(value="/api/platform/messagecenter/messages/sms")

public class SmsController {

@Autowired

SmsSendBiz smsSendBiz;



/**

* 接收手机号码和内容往短信发送表插入一条记录

* @param requestbody 请求消息内容

* @param request 请求消息头

* @return jsonObject

*/

@RequestMapping(

value="/send",

method= RequestMethod.GET

)

public ModelAndView sendSms(@RequestBody String requestbody, HttpServletRequest request) {

//获取请求URL及url后面传输的参数

String url = request.getRequestURL() + "?" + request.getQueryString();

url = BuildRequestUrl.decodeUrl(url);

String telePhone = RequestUtils.getStringValue(request, "telePhone");

String content = RequestUtils.getStringValue(request, "content");

smsSendBiz.insertTtMsQuequ(telePhone,content);

return new ModelAndView("", ResponseUtilsHelper.jsonResult("", true));

}

}

二.

get

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;



import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.HttpMethod;

import org.apache.commons.httpclient.methods.GetMethod;



public class H_client_get {

public static void main(String[] args) throws IOException {

// new类对象

HttpClient client = new HttpClient();

// 使用 GET 方法 与URL服务器进行交互

// HttpMethod method = new GetMethod("http://192.168.111.128/bak/regist.php?email=admin@admin.com&password=1234567&re_password=1234567&username=admin&nickname=管理员");

HttpMethod method = new GetMethod("http://192.168.111.128/bak/login.php?username=");

// 使用 GET 方法 ,实行与url服务器连接

client.executeMethod(method);

// 数据流输出

// method.getResponseBodyAsStream 创建字节流对象为inputStream

InputStream inputStream = method.getResponseBodyAsStream();

// InputStreamReader(inputStream)字节流转换成字符流 BufferedReader封装成带有缓冲的字符流对象了 

BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));

// StringBuffer是字符串变量,它的对象是可以扩充和修改的 创建一个空的StringBuffer类的对象 

StringBuffer stringBuffer = new StringBuffer();

// 定义字符串常量

String str= "";

// br字符流赋值给str字符串常量 str不等于空 按行输出

while((str = br.readLine()) != null){ 

// StringBuffer 是字符串变量,它的对象是可以扩充和修改的 将str数据赋予 stringBuffer 

stringBuffer .append(str ); 

} 

// 按照字符串循环输出stringBuffer

System.out.println(stringBuffer.toString());

// 关闭method 的 httpclient连接

method.releaseConnection();

}

}

post

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;



import org.apache.commons.httpclient.methods.PostMethod;

import org.apache.commons.httpclient.*;



public class H_client_post {

public static void main(String[] args) throws IOException {

HttpClient client = new HttpClient();

PostMethod method = new PostMethod("http://192.168.111.128/bak/login_post.php");

//表单域的值,既post传入的key=value

NameValuePair[] date = { new NameValuePair("username","admin"),new NameValuePair("password","123457")};

//method使用表单阈值

method.setRequestBody(date);

//提交表单

client.executeMethod(method);

//字符流转字节流 循环输出,同get解释

InputStream inputStream = method.getResponseBodyAsStream();

BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));

StringBuffer stringBuffer = new StringBuffer();

String str= "";

while((str = br.readLine()) != null){ 

stringBuffer .append(str ); 

} 

System.out.println(stringBuffer.toString());

method.releaseConnection();

}

}

三.

Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。

一、简介

HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。

二、特性

1. 基于标准、纯净的java语言。实现了Http1.0和Http1.1

2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

3. 支持HTTPS协议。

4. 通过Http代理建立透明的连接。

5. 利用CONNECT方法通过Http代理建立隧道的https连接。

6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。

7. 插件式的自定义认证方案。

8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。

9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。

10. 自动处理Set-Cookie中的Cookie。

11. 插件式的自定义Cookie策略。

12. Request的输出流可以避免流中内容直接缓冲到socket服务器。

13. Response的输入流可以有效的从socket服务器直接读取相应内容。

14. 在http1.0和http1.1中利用KeepAlive保持持久连接。

15. 直接获取服务器发送的response code和 headers。

16. 设置连接超时的能力。

17. 实验性的支持http1.1 response caching。

18. 源代码基于Apache License 可免费获取。

三、使用方法

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

1. 创建HttpClient对象。

2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

6. 释放连接。无论执行方法是否成功,都必须释放连接

四、实例


package com.test; 

import java.io.File; 

import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.security.KeyManagementException; 
import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.cert.CertificateException; 
import java.util.ArrayList; 
import java.util.List; 
import javax.net.ssl.SSLContext; 
import org.apache.http.HttpEntity; 
import org.apache.http.NameValuePair; 
import org.apache.http.ParseException; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.CloseableHttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 
import org.apache.http.conn.ssl.SSLContexts; 
import org.apache.http.conn.ssl.TrustSelfSignedStrategy; 
import org.apache.http.entity.ContentType; 
import org.apache.http.entity.mime.MultipartEntityBuilder; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.entity.mime.content.StringBody; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.message.BasicNameValuePair; 
import org.apache.http.util.EntityUtils; 
import org.junit.Test; 
public class HttpClientTest { 
  @Test 
  public void jUnitTest() { 
    get(); 
  } 
  /** 
   * HttpClient连接SSL 
   */ 
  public void ssl() { 
    CloseableHttpClient httpclient = null; 
    try { 
      KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      FileInputStream instream = new FileInputStream(new File("d:\\tomcat.keystore")); 
      try { 54.
        // 加载keyStore d:\\tomcat.keystore  
        trustStore.load(instream, "123456".toCharArray()); 
      } catch (CertificateException e) { 
        e.printStackTrace(); 
      } finally { 
        try { 
          instream.close(); 
        } catch (Exception ignore) { 
        } 
      } 
      // 相信自己的CA和所有自签名的证书 
      SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build(); 
      // 只允许使用TLSv1协议 
      SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, 
          SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 
      httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); 
      // 创建http请求(get方式) 
      HttpGet httpget = new HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); 
      System.out.println("executing request" + httpget.getRequestLine()); 
      CloseableHttpResponse response = httpclient.execute(httpget); 
      try { 
        HttpEntity entity = response.getEntity(); 
        System.out.println("----------------------------------------"); 
        System.out.println(response.getStatusLine()); 
        if (entity != null) { 
          System.out.println("Response content length: " + entity.getContentLength()); 
          System.out.println(EntityUtils.toString(entity)); 
          EntityUtils.consume(entity); 
        } 
      } finally { 
        response.close(); 
      } 
    } catch (ParseException e) { 
      e.printStackTrace(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } catch (KeyManagementException e) { 
      e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
    } catch (KeyStoreException e) { 
      e.printStackTrace(); 
    } finally { 
      if (httpclient != null) { 
        try { 
          httpclient.close(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
		  
        } 
      } 
    } 
  } 

  /** 
   * post方式提交表单(模拟用户登录请求) 
   */ 
  public void postForm() { 
    // 创建默认的httpClient实例.  
    CloseableHttpClient httpclient = HttpClients.createDefault(); 
    // 创建httppost  
    HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); 
    // 创建参数队列  
    List<namevaluepair> formparams = new ArrayList<namevaluepair>(); 
    formparams.add(new BasicNameValuePair("username", "admin")); 

    formparams.add(new BasicNameValuePair("password", "123456")); 

    UrlEncodedFormEntity uefEntity; 

    try { 

      uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); 

      httppost.setEntity(uefEntity); 

      System.out.println("executing request " + httppost.getURI()); 

      CloseableHttpResponse response = httpclient.execute(httppost); 

      try { 

        HttpEntity entity = response.getEntity(); 

        if (entity != null) { 

          System.out.println("--------------------------------------"); 

          System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8")); 

          System.out.println("--------------------------------------"); 

        } 

      } finally { 

        response.close(); 

      } 

    } catch (ClientProtocolException e) { 

      e.printStackTrace(); 
	  

    } catch (UnsupportedEncodingException e1) { 

      e1.printStackTrace(); 

    } catch (IOException e) { 

      e.printStackTrace(); 

    } finally { 

      // 关闭连接,释放资源  

      try { 

        httpclient.close(); 

      } catch (IOException e) { 

        e.printStackTrace(); 

      } 

    } 

  } 
  /** 
   * 发送 post请求访问本地应用并根据传递参数不同返回不同结果 
   */ 

  public void post() { 

    // 创建默认的httpClient实例.  

    CloseableHttpClient httpclient = HttpClients.createDefault(); 

    // 创建httppost  

    HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); 

    // 创建参数队列  

    List<namevaluepair> formparams = new ArrayList<namevaluepair>(); 

    formparams.add(new BasicNameValuePair("type", "house")); 

    UrlEncodedFormEntity uefEntity; 

    try { 

      uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); 
      httppost.setEntity(uefEntity); 
      System.out.println("executing request " + httppost.getURI()); 
      CloseableHttpResponse response = httpclient.execute(httppost); 
      try { 
        HttpEntity entity = response.getEntity(); 

        if (entity != null) { 

          System.out.println("--------------------------------------"); 

          System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8")); 

          System.out.println("--------------------------------------"); 

        } 

      } finally { 

        response.close(); 

      } 

    } catch (ClientProtocolException e) { 

      e.printStackTrace(); 

    } catch (UnsupportedEncodingException e1) { 

      e1.printStackTrace(); 

    } catch (IOException e) { 

      e.printStackTrace(); 

    } finally { 

      // 关闭连接,释放资源  

      try { 

        httpclient.close(); 

      } catch (IOException e) { 

        e.printStackTrace(); 

      } 

    } 

  } 

  /** 

   * 发送 get请求 
   */ 

  public void get() { 

    CloseableHttpClient httpclient = HttpClients.createDefault(); 

    try { 

      // 创建httpget.  

      HttpGet httpget = new HttpGet("http://www.baidu.com/"); 

      System.out.println("executing request " + httpget.getURI()); 

      // 执行get请求.  

      CloseableHttpResponse response = httpclient.execute(httpget); 

      try { 

        // 获取响应实体  
		

        HttpEntity entity = response.getEntity(); 

        System.out.println("--------------------------------------"); 

        // 打印响应状态  

        System.out.println(response.getStatusLine()); 

        if (entity != null) { 

          // 打印响应内容长度  

          System.out.println("Response content length: " + entity.getContentLength()); 

          // 打印响应内容  

          System.out.println("Response content: " + EntityUtils.toString(entity)); 

        } 

        System.out.println("------------------------------------"); 

      } finally { 

        response.close(); 

      } 

    } catch (ClientProtocolException e) { 

      e.printStackTrace(); 

    } catch (ParseException e) { 

      e.printStackTrace(); 

    } catch (IOException e) { 

      e.printStackTrace(); 

    } finally { 

      // 关闭连接,释放资源  

      try { 

        httpclient.close(); 

      } catch (IOException e) { 

        e.printStackTrace(); 

      } 

    } 

  } 


  /** 
   * 上传文件 

   */ 

  public void upload() { 

    CloseableHttpClient httpclient = HttpClients.createDefault(); 

    try { 

      HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceFile.action"); 

      FileBody bin = new FileBody(new File("F:\\image\\sendpix0.jpg")); 

      StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN); 

      HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin", bin).addPart("comment", comment).build(); 

      httppost.setEntity(reqEntity); 

      System.out.println("executing request " + httppost.getRequestLine()); 

      CloseableHttpResponse response = httpclient.execute(httppost); 

      try { 

        System.out.println("----------------------------------------"); 

        System.out.println(response.getStatusLine()); 

        HttpEntity resEntity = response.getEntity(); 

        if (resEntity != null) { 

          System.out.println("Response content length: " + resEntity.getContentLength()); 

        } 

        EntityUtils.consume(resEntity); 

      } finally { 

        response.close(); 

      } 

    } catch (ClientProtocolException e) { 

      e.printStackTrace(); 

    } catch (IOException e) { 

      e.printStackTrace(); 

    } finally { 

      try { 

        httpclient.close(); 

      } catch (IOException e) { 

        e.printStackTrace(); 

      } 

    } 

  } 

}</namevaluepair></namevaluepair></namevaluepair></namevaluepair> 

以上这篇java发送HttpClient请求及接收请求结果过程的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 探讨:使用httpClient在客户端与服务器端传输对象参数的详解

    探讨:使用httpClient在客户端与服务器端传输对象参数的详解

    本篇文章是对使用httpClient在客户端与服务器端传输对象参数进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Java中的RMI使用方法详解

    Java中的RMI使用方法详解

    这篇文章主要介绍了Java中的RMI使用方法,RMI是Java提供的一个完善的简单易用的远程方法调用框架,采用客户服务器通信方式,在服务器上部署了提供各种服务的远程对象,下面我们来详细讲解
    2023-10-10
  • Spring IOC的相关注解运用详解

    Spring IOC的相关注解运用详解

    这篇文章主要介绍了Spring IOC的相关注解运用详解,纯注解实现IOC需要一个Java类代替xml文件,这个Java类上方需要添加@Configuration,表示该类是一个配置类,作用是代替配置文件,需要的朋友可以参考下
    2023-08-08
  • 常用json与javabean互转的方法实现

    常用json与javabean互转的方法实现

    这篇文章主要介绍了常用json与javabean互转的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 深入理解Java遗传算法

    深入理解Java遗传算法

    这篇文章主要为大家详细介绍了Java遗传算法,本文对基因的编码采用二进制规则,分享了对Java遗传算法的理解,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • java+vue3+el-tree实现树形结构操作代码

    java+vue3+el-tree实现树形结构操作代码

    基于springboot + vue3 elementPlus实现树形结构数据的添加、删除和页面展示,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • SpringBoot之QueryDsl嵌套子查询问题

    SpringBoot之QueryDsl嵌套子查询问题

    这篇文章主要介绍了SpringBoot之QueryDsl嵌套子查询问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 详解Java 中的三种代理模式

    详解Java 中的三种代理模式

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;这篇文章主要介绍了Java 中的三种代理模式,需要的朋友可以参考下
    2018-08-08
  • IntelliJ IDEA编译项目报错

    IntelliJ IDEA编译项目报错 "xxx包不存在" 或 "找不到符号"

    这篇文章主要介绍了IntelliJ IDEA编译项目报错 "xxx包不存在" 或 "找不到符号" ,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Spring菜鸟教你看源码冲面试

    Spring菜鸟教你看源码冲面试

    这篇文章主要介绍了Spring菜鸟教你看源码冲面试,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03

最新评论