精华内容
下载资源
问答
  • 1、servlet3.0-异步请求:引用:在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理,当过来一个请求之后,会从tomcat的线程池中拿出一个线程去处理...

    1、servlet3.0-异步请求:

    引用:在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理,当过来一个请求之后,会从tomcat的线程池中拿出一个线程去处理这个请求,处理完成之后再将该线程归还到线程池图,如图一所示。但是线程池的数量是有限的,如果一个请求需要进行IO操作,比如访问数据库(或者调用第三方服务接口等),那么其所对应的线程将同步地等待IO操作完成, 而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。即便是像Spring、Struts这样的高层框架也脱离不了这样的桎梏,因为他们都是建立在Servlet之上的。为了解决这样的问题,Servlet 3.0引入了异步处理如图二,在Servlet 3.1中又引入了非阻塞IO来进一步增强异步处理的性能。

    25daa65eacf5c805e0599f89a4688213.png

    图一 同步模式

    5d028612baa1c2da9dde11002c7cefd0.png

    图二 异步模式

    例:

    @WebServlet(value="/async",asyncSupported=true)public class HelloAsyncServlet extendsHttpServlet {

    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {//1、支持异步处理asyncSupported=true//2、开启异步模式

    System.out.println("主线程开始。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());

    AsyncContext startAsync=req.startAsync();//3、业务逻辑进行异步处理;开始异步处理

    startAsync.start(() ->{try{

    System.out.println("副线程开始。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());

    sayHello();

    startAsync.complete();//获取到异步上下文

    AsyncContext asyncContext =req.getAsyncContext();//4、获取响应

    ServletResponse response =asyncContext.getResponse();

    response.getWriter().write("hello async...");

    System.out.println("副线程结束。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());

    }catch(Exception e) {

    }

    });

    System.out.println("主线程结束。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());

    }public void sayHello() throwsException{

    System.out.println(Thread.currentThread()+" processing...");

    Thread.sleep(3000);

    }

    }

    2、SpringMVC-异步请求

    Spring MVC很好的支持了Servlet 3.0异步请求,所有我们可以直接使用SpringMVC来实现异步请求:通过控制器返回DeferredResult或Callable来实现

    1)使用 Callable

    @ResponseBody

    @RequestMapping("/async01")public Callableasync01(){

    System.out.println("主线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());

    Callable callable = new Callable() {

    @Overridepublic String call() throwsException {

    System.out.println("副线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());

    Thread.sleep(2000);

    System.out.println("副线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());return "Callable async01()";

    }

    };

    System.out.println("主线程结束..."+Thread.currentThread()+"==>"+System.currentTimeMillis());returncallable;

    }

    结果:

    preHandle.../springmvc-annotation/async01

    主线程开始...Thread[http-bio-8081-exec-3,5,main]==>1513932494700

    主线程结束...Thread[http-bio-8081-exec-3,5,main]==>1513932494700

    =========DispatcherServlet及所有的Filter退出线程============================

    ================等待Callable执行==========

    副线程开始...Thread[MvcAsync1,5,main]==>1513932494707

    副线程开始...Thread[MvcAsync1,5,main]==>1513932496708

    ================Callable执行完成==========

    ================再次收到之前重发过来的请求========

    preHandle.../springmvc-annotation/async01

    postHandle...(Callable的之前的返回值就是目标方法的返回值)

    afterCompletion...

    说明:

    1、控制器返回Callable

    2、Spring异步处理,将Callable 提交到 TaskExecutor 使用一个隔离的线程进行执行

    3、DispatcherServlet和所有的Filter退出web容器的线程,但是response 保持打开状态

    4、Callable返回结果,SpringMVC将请求重新派发给容器,恢复之前的处理

    5、根据Callable返回的结果。SpringMVC继续进行视图渲染流程等(从收请求-视图渲染)

    普通的拦截器不能拦截异步处理请求的方法,可以使用Servlet原生API的AsyncListener或实现SpringMVC中的AsyncHandlerInterceptor来拦截异步方法的执行

    2)使用DeferredResult

    @GetMapping("/quotes")

    @ResponseBodypublic DeferredResultquotes() {

    DeferredResult deferredResult = new DeferredResult((long)3000, "timeout...");//Save the deferredResult somewhere..

    returndeferredResult;

    }//From some other thread...

    deferredResult.setResult(data);

    说明:

    1)控制器返回DeferredResult

    2)可以将DeferredResult保存起来

    3)使用其他线程调用DeferredsetResult.setResult方法

    4)SpringMVC将请求重新派发给容器,恢复之前的处理

    展开全文
  • Java异步请求

    2019-04-08 15:25:38
    传统web交互模型,浏览器直接将请求发送给服务器,服务器回送响应,直接发给浏览器, Ajax交互模型,浏览器首先将请求 发送 Ajax引擎(以XMLHttpRequest为核心),AJax引擎再将请求发送给 服务器,服务器回送响应先...
  • } }/// ///发送POST请求/// /// /// /// publicString HttpPost(String url, String data) {returnHttpPost(url, data, url); }/// ///发送POST请求/// /// /// /// /// publicString HttpPost(String url, String ...

    /** Created by SharpDevelop.

    * User: RedXu

    * Date: 2015-04-16

    * Time: 13:58

    **/

    usingSystem;usingSystem.Net;usingSystem.IO;usingSystem.Text;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.Net.Security;usingSystem.Security.Cryptography.X509Certificates;namespaceRedXuCSharpClass

    {///

    ///Http操作类.///

    public classHttpHelper

    {private const int ConnectionLimit = 100;//编码

    private Encoding _encoding =Encoding.Default;//浏览器类型

    private string[] _useragents = new string[]{"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)","Mozilla/5.0 (Windows NT 6.1; rv:36.0) Gecko/20100101 Firefox/36.0","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0"};private String _useragent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36";//接受类型

    private String _accept = "text/html, application/xhtml+xml, application/xml, */*";//超时时间

    private int _timeout = 30 * 1000;//类型

    private string _contenttype = "application/x-www-form-urlencoded";//cookies

    private String _cookies = "";//cookies

    privateCookieCollection _cookiecollection;//custom heads

    private Dictionary _headers = new Dictionary();publicHttpHelper()

    {

    _headers.Clear();//随机一个useragent

    _useragent = _useragents[new Random().Next(0, _useragents.Length)];//解决性能问题?

    ServicePointManager.DefaultConnectionLimit =ConnectionLimit;

    }public voidInitCookie()

    {

    _cookies= "";

    _cookiecollection= null;

    _headers.Clear();

    }///

    ///设置当前编码///

    ///

    public voidSetEncoding(Encoding en)

    {

    _encoding=en;

    }///

    ///设置UserAgent///

    ///

    public voidSetUserAgent(String ua)

    {

    _useragent=ua;

    }public voidRandUserAgent()

    {

    _useragent= _useragents[new Random().Next(0, _useragents.Length)];

    }public void SetCookiesString(stringc)

    {

    _cookies=c;

    }///

    ///设置超时时间///

    ///

    public void SetTimeOut(intmsec)

    {

    _timeout=msec;

    }public voidSetContentType(String type)

    {

    _contenttype=type;

    }public voidSetAccept(String accept)

    {

    _accept=accept;

    }///

    ///添加自定义头///

    ///

    ///

    public voidAddHeader(String key, String ctx)

    {//_headers.Add(key,ctx);

    _headers[key] =ctx;

    }///

    ///清空自定义头///

    public voidClearHeader()

    {

    _headers.Clear();

    }///

    ///获取HTTP返回的内容///

    ///

    ///

    privateString GetStringFromResponse(HttpWebResponse response)

    {

    String html= "";try{

    Stream stream=response.GetResponseStream();

    StreamReader sr= newStreamReader(stream, _encoding);

    html=sr.ReadToEnd();

    sr.Close();

    stream.Close();

    }catch(Exception e)

    {

    Trace.WriteLine("GetStringFromResponse Error:" +e.Message);

    }returnhtml;

    }///

    ///检测证书///

    ///

    ///

    ///

    ///

    ///

    private bool CheckCertificate(objectsender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)

    {return true;

    }///

    ///发送GET请求///

    ///

    ///

    publicString HttpGet(String url)

    {returnHttpGet(url, url);

    }///

    ///发送GET请求///

    ///

    ///

    ///

    publicString HttpGet(String url, String refer)

    {

    String html;try{

    ServicePointManager.ServerCertificateValidationCallback= newSystem.Net.Security.RemoteCertificateValidationCallback(CheckCertificate);

    HttpWebRequest request=(HttpWebRequest)HttpWebRequest.Create(url);

    request.UserAgent=_useragent;

    request.Timeout=_timeout;

    request.ContentType=_contenttype;

    request.Accept=_accept;

    request.Method= "GET";

    request.Referer=refer;

    request.KeepAlive= true;

    request.AllowAutoRedirect= true;

    request.UnsafeAuthenticatedConnectionSharing= true;

    request.CookieContainer= newCookieContainer();//据说能提高性能

    request.Proxy = null;if (_cookiecollection != null)

    {foreach (Cookie c in_cookiecollection)

    {

    c.Domain=request.Host;

    }

    request.CookieContainer.Add(_cookiecollection);

    }foreach (KeyValuePair hd in_headers)

    {

    request.Headers[hd.Key]=hd.Value;

    }

    HttpWebResponse response=(HttpWebResponse)request.GetResponse();

    html=GetStringFromResponse(response);if (request.CookieContainer != null)

    {

    response.Cookies=request.CookieContainer.GetCookies(request.RequestUri);

    }if (response.Cookies != null)

    {

    _cookiecollection=response.Cookies;

    }if (response.Headers["Set-Cookie"] != null)

    {string tmpcookie = response.Headers["Set-Cookie"];

    _cookiecollection.Add(ConvertCookieString(tmpcookie));

    }

    response.Close();returnhtml;

    }catch(Exception e)

    {

    Trace.WriteLine("HttpGet Error:" +e.Message);returnString.Empty;

    }

    }///

    ///获取MINE文件///

    ///

    ///

    publicByte[] HttpGetMine(String url)

    {

    Byte[] mine= null;try{

    ServicePointManager.ServerCertificateValidationCallback= newSystem.Net.Security.RemoteCertificateValidationCallback(CheckCertificate);

    HttpWebRequest request=(HttpWebRequest)HttpWebRequest.Create(url);

    request.UserAgent=_useragent;

    request.Timeout=_timeout;

    request.ContentType=_contenttype;

    request.Accept=_accept;

    request.Method= "GET";

    request.Referer=url;

    request.KeepAlive= true;

    request.AllowAutoRedirect= true;

    request.UnsafeAuthenticatedConnectionSharing= true;

    request.CookieContainer= newCookieContainer();//据说能提高性能

    request.Proxy = null;if (_cookiecollection != null)

    {foreach (Cookie c in_cookiecollection)

    c.Domain=request.Host;

    request.CookieContainer.Add(_cookiecollection);

    }foreach (KeyValuePair hd in_headers)

    {

    request.Headers[hd.Key]=hd.Value;

    }

    HttpWebResponse response=(HttpWebResponse)request.GetResponse();

    Stream stream=response.GetResponseStream();

    MemoryStream ms= newMemoryStream();byte[] b = new byte[1024];while (true)

    {int s = stream.Read(b, 0, b.Length);

    ms.Write(b,0, s);if (s == 0 || s

    {break;

    }

    }

    mine=ms.ToArray();

    ms.Close();if (request.CookieContainer != null)

    {

    response.Cookies=request.CookieContainer.GetCookies(request.RequestUri);

    }if (response.Cookies != null)

    {

    _cookiecollection=response.Cookies;

    }if (response.Headers["Set-Cookie"] != null)

    {

    _cookies= response.Headers["Set-Cookie"];

    }

    stream.Close();

    stream.Dispose();

    response.Close();returnmine;

    }catch(Exception e)

    {

    Trace.WriteLine("HttpGetMine Error:" +e.Message);return null;

    }

    }///

    ///发送POST请求///

    ///

    ///

    ///

    publicString HttpPost(String url, String data)

    {returnHttpPost(url, data, url);

    }///

    ///发送POST请求///

    ///

    ///

    ///

    ///

    publicString HttpPost(String url, String data, String refer)

    {

    String html;try{

    ServicePointManager.ServerCertificateValidationCallback= newSystem.Net.Security.RemoteCertificateValidationCallback(CheckCertificate);

    HttpWebRequest request=(HttpWebRequest)HttpWebRequest.Create(url);

    request.UserAgent=_useragent;

    request.Timeout=_timeout;

    request.Referer=refer;

    request.ContentType=_contenttype;

    request.Accept=_accept;

    request.Method= "POST";

    request.KeepAlive= true;

    request.AllowAutoRedirect= true;

    request.CookieContainer= newCookieContainer();//据说能提高性能

    request.Proxy = null;if (_cookiecollection != null)

    {foreach (Cookie c in_cookiecollection)

    {

    c.Domain=request.Host;if (c.Domain.IndexOf(':') > 0)

    c.Domain= c.Domain.Remove(c.Domain.IndexOf(':'));

    }

    request.CookieContainer.Add(_cookiecollection);

    }foreach (KeyValuePair hd in_headers)

    {

    request.Headers[hd.Key]=hd.Value;

    }byte[] buffer =_encoding.GetBytes(data.Trim());

    request.ContentLength=buffer.Length;

    request.GetRequestStream().Write(buffer,0, buffer.Length);

    request.GetRequestStream().Close();

    HttpWebResponse response=(HttpWebResponse)request.GetResponse();

    html=GetStringFromResponse(response);if (request.CookieContainer != null)

    {

    response.Cookies=request.CookieContainer.GetCookies(request.RequestUri);

    }if (response.Cookies != null)

    {

    _cookiecollection=response.Cookies;

    }if (response.Headers["Set-Cookie"] != null)

    {string tmpcookie = response.Headers["Set-Cookie"];

    _cookiecollection.Add(ConvertCookieString(tmpcookie));

    }

    response.Close();returnhtml;

    }catch(Exception e)

    {

    Trace.WriteLine("HttpPost Error:" +e.Message);returnString.Empty;

    }

    }public string UrlEncode(stringstr)

    {

    StringBuilder sb= newStringBuilder();byte[] byStr =_encoding.GetBytes(str);for (int i = 0; i < byStr.Length; i++)

    {

    sb.Append(@"%" + Convert.ToString(byStr[i], 16));

    }return(sb.ToString());

    }///

    ///转换cookie字符串到CookieCollection///

    ///

    ///

    private CookieCollection ConvertCookieString(stringck)

    {

    CookieCollection cc= newCookieCollection();string[] cookiesarray = ck.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);for (int i = 0; i < cookiesarray.Length; i++)

    {string[] cookiesarray_2 = cookiesarray[i].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);for (int j = 0; j < cookiesarray_2.Length; j++)

    {string[] cookiesarray_3 = cookiesarray_2[j].Trim().Split("=".ToCharArray());if (cookiesarray_3.Length == 2)

    {string cname = cookiesarray_3[0].Trim();string cvalue = cookiesarray_3[1].Trim();if (cname.ToLower() != "domain" && cname.ToLower() != "path" && cname.ToLower() != "expires")

    {

    Cookie c= newCookie(cname, cvalue);

    cc.Add(c);

    }

    }

    }

    }returncc;

    }public voidDebugCookies()

    {

    Trace.WriteLine("**********************BEGIN COOKIES*************************");foreach (Cookie c in_cookiecollection)

    {

    Trace.WriteLine(c.Name+ "=" +c.Value);

    Trace.WriteLine("Path=" +c.Path);

    Trace.WriteLine("Domain=" +c.Domain);

    }

    Trace.WriteLine("**********************END COOKIES*************************");

    }

    }

    }

    展开全文
  • 1、servlet3.0-异步请求:引用:在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理,当过来一个请求之后,会从tomcat的线程池中拿出一个线程去处理...

    1、servlet3.0-异步请求:

    引用:在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理,当过来一个请求之后,会从tomcat的线程池中拿出一个线程去处理这个请求,处理完成之后再将该线程归还到线程池图,如图一所示。但是线程池的数量是有限的,如果一个请求需要进行IO操作,比如访问数据库(或者调用第三方服务接口等),那么其所对应的线程将同步地等待IO操作完成, 而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。即便是像Spring、Struts这样的高层框架也脱离不了这样的桎梏,因为他们都是建立在Servlet之上的。为了解决这样的问题,Servlet 3.0引入了异步处理如图二,在Servlet 3.1中又引入了非阻塞IO来进一步增强异步处理的性能。

    8b1d6473219e05fa360726a7400b0848.png

    图一 同步模式

    3b11b4a8fea030e0d7a89c0c6d866f95.png

    图二 异步模式

    例:

    @WebServlet(value="/async",asyncSupported=true)public class HelloAsyncServlet extendsHttpServlet {

    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {//1、支持异步处理asyncSupported=true//2、开启异步模式

    System.out.println("主线程开始。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());

    AsyncContext startAsync=req.startAsync();//3、业务逻辑进行异步处理;开始异步处理

    startAsync.start(() ->{try{

    System.out.println("副线程开始。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());

    sayHello();

    startAsync.complete();//获取到异步上下文

    AsyncContext asyncContext =req.getAsyncContext();//4、获取响应

    ServletResponse response =asyncContext.getResponse();

    response.getWriter().write("hello async...");

    System.out.println("副线程结束。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());

    }catch(Exception e) {

    }

    });

    System.out.println("主线程结束。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());

    }public void sayHello() throwsException{

    System.out.println(Thread.currentThread()+" processing...");

    Thread.sleep(3000);

    }

    }

    2、SpringMVC-异步请求

    Spring MVC很好的支持了Servlet 3.0异步请求,所有我们可以直接使用SpringMVC来实现异步请求:通过控制器返回DeferredResult或Callable来实现

    1)使用 Callable

    @ResponseBody

    @RequestMapping("/async01")public Callableasync01(){

    System.out.println("主线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());

    Callable callable = new Callable() {

    @Overridepublic String call() throwsException {

    System.out.println("副线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());

    Thread.sleep(2000);

    System.out.println("副线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());return "Callable async01()";

    }

    };

    System.out.println("主线程结束..."+Thread.currentThread()+"==>"+System.currentTimeMillis());returncallable;

    }

    结果:

    preHandle.../springmvc-annotation/async01

    主线程开始...Thread[http-bio-8081-exec-3,5,main]==>1513932494700

    主线程结束...Thread[http-bio-8081-exec-3,5,main]==>1513932494700

    =========DispatcherServlet及所有的Filter退出线程============================

    ================等待Callable执行==========

    副线程开始...Thread[MvcAsync1,5,main]==>1513932494707

    副线程开始...Thread[MvcAsync1,5,main]==>1513932496708

    ================Callable执行完成==========

    ================再次收到之前重发过来的请求========

    preHandle.../springmvc-annotation/async01

    postHandle...(Callable的之前的返回值就是目标方法的返回值)

    afterCompletion...

    说明:

    1、控制器返回Callable

    2、Spring异步处理,将Callable 提交到 TaskExecutor 使用一个隔离的线程进行执行

    3、DispatcherServlet和所有的Filter退出web容器的线程,但是response 保持打开状态

    4、Callable返回结果,SpringMVC将请求重新派发给容器,恢复之前的处理

    5、根据Callable返回的结果。SpringMVC继续进行视图渲染流程等(从收请求-视图渲染)

    普通的拦截器不能拦截异步处理请求的方法,可以使用Servlet原生API的AsyncListener或实现SpringMVC中的AsyncHandlerInterceptor来拦截异步方法的执行

    2)使用DeferredResult

    @GetMapping("/quotes")

    @ResponseBodypublic DeferredResultquotes() {

    DeferredResult deferredResult = new DeferredResult((long)3000, "timeout...");//Save the deferredResult somewhere..

    returndeferredResult;

    }//From some other thread...

    deferredResult.setResult(data);

    说明:

    1)控制器返回DeferredResult

    2)可以将DeferredResult保存起来

    3)使用其他线程调用DeferredsetResult.setResult方法

    4)SpringMVC将请求重新派发给容器,恢复之前的处理

    原文:https://www.cnblogs.com/qzlcl/p/11106162.html

    展开全文
  • ajax异步请求详解ajxa定义:异步的javascript和xml1、XMLHttpRequst的出现才有了异步处理2、创建XmlHttpRequest对象var request=new XMLHttpRequest();注意:如果要兼容IE6以下浏览器则需要编写如下代码var request;...

    ajax异步请求详解

    ajxa定义:异步的javascript和xml

    1、XMLHttpRequst的出现才有了异步处理

    2、创建XmlHttpRequest对象

    var request=new XMLHttpRequest();

    注意:如果要兼容IE6以下浏览器则需要编写如下代码

    var request;

    if(window.XMLRequest){

    request=new XMLRequestHttpRequest();  //IE7、IE8、360等

    }else{

    request=new ActiveXObject("Microsoft.XMLHTTP");//IE5、IE6

    }

    3、XMLHttpRequest发送请求

    (1)open(method,url,async),参数的意义如下

    method:GET或者POST请求方法

    url:相对地址或者绝对地址

    async:true或者false,默认是true,表示异步

    (2)send(String)

    GET请求无参数,POST请求时一定要有参数

    举例A:

    request。open("GET",'getDate',true);

    request.send();

    举例B:

    request.open("POST","getDate",true)

    //默认是"application/x-www-from"-urlencoden"方式提交,如果是提交文件,则需要修改成为multipart/form-data方式提交

    request.setRequestHeader("Content-type","application/x-www-from"-urlencoden");

    request.send("name=王二&age=25");

    4、XMLHttpRequest取得响应

    (1)responseText:获得字符串形式的响应数据

    (2)responseXML:获得xml形式的响应数据

    (3)status和statusText:以数字和文本形式返回Http转态码

    (4)getAllResponseHeader():获得所以得响应报头

    (5)getResponseHeader():查询响应中的某个字段的值

    (6)readState属性

    "0"请求未初始化,open还未调用

    "1":服务器连接已经建立,open已调用

    "2":请求已接收,也就是接收到头信息了

    "3":请求处理中,也就是接收到响应主体了

    "4":请求已经完成,且响应就绪,响应完成了

    举例:

    var  request;

    request.open("GET","getDate",true);

    request.send();

    //监听返回的转态,200和4代表响应成功

    request.onreadystatechange=fuction(){

    if(request.readstate==4&&request.status==200){

    //需要处理的事务

    }

    }

    6、HTTP请求:是一种规则,无状态,无记忆

    HTTP请求过程

    (1)建立TCP连接

    (2)web浏览器向web服务器发送请求指令

    (3)web浏览器发送请求头信息

    (4)web服务器应答

    (5)web服务器发送应答头信息

    (6)web服务器向浏览器发送数据

    (7)web服务器关闭TCP连接

    A、HTTP请求的4个·组成部分

    a、HTTP请求方法或者动作(GET/POST)

    b、正在请求的URL

    c、请求头,包含客户环境信息、身份信息等

    d、请求体(正文),包含客户提交的查询字符串信息、表单信息

    B、POST和GET方法

    GET:(1)用于信息获取

    (2)使用URL传递参数

    (3)String<=2000个字符左右

    POST:(1)用于修改服务器上的资源

    (2)String<=无穷大

    C、一个HTTP响应由三个部分组成

    a、一个数字和文字组成的转态码。作用:显示请求是否成功

    b、响应头,包含服务器类型、日期、内容类型、长度等

    c、响应体,即响应正文,字符串、HTML等

    D、HTTP状态码由3个数字构成,其中首位数字定义了状态码的类型

    1^^:信息类,表示收到web请求,正在进行处理中

    2^^:成功,表示用户请求被正确接收、理解和处理,如200

    3^^:重定向,表示请求未成功,客户必须采取动作

    4^^:客户端错误,客户提交的信息有误,如400

    found:意味着请求中所引用的文档不存在

    5^^:服务器错误(最难处理的问题),表示服务器不能完成请求处理,如500

    展开全文
  • 上篇提到了高性能处理的关键是异步,而我们当中许多人依旧在使用同步模式的HttpClient访问第三方Web资源,我认为原因之一是:异步的HttpClient诞生较晚,许多人不知道;另外也可能是大多数Web程序其实不在意这点性能...
  • 请求重定向指的是一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。302状态码和location头即可实现重定向。请求重定向最常见的应用场景就是用户登录。 下面的示例代码从另一个...
  • 详细介绍了Java Web 的Servlet3.0 中提供的异步请求处理机制的原理,并提供了使用案例!
  • ajax异步请求详解   ajxa定义:异步的javascript和xml   1、XMLHttpRequst的出现才有了异步处理   2、创建XmlHttpRequest对象 var request=new XMLHttpRequest(); 注意:如果要兼容IE6以下浏览器则需要...
  • 在spring mvc3.2及以上版本增加了对请求异步处理,是在servlet3的基础上进行封装的。1、修改web.xmlhttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">...1.1、声明version="3.0",声明web-app_3_0.xsd1.2、...
  • 在我们的请求中做了耗时处理,当并发请求的情况下,为了避免web server的连接池被长期占用而引起性能问题,调用后生成一个非web的服务线程来处理,增加web服务器的吞吐量。为此 Servlet 3.0 新增了请求异步处理,...
  • 如何把JAVA方法变成异步执行的方法?在苹果手机上移动端页面发起ajax请求到服务端,服务端对数据库增删改查之后,需要发起http请求到消息中心这样一个项目,给它加消息。但是http请求时间比较长,导致页面ajax请求...
  • [译] spring 多线程异步调用 - 提高程序执行效率 ...java异步线程池同时请求多个接口数据 高性能的关键:Spring MVC的异步模式 Spring MVC异步处理-DeferedResult使用 servlet3异步原理与实践 ...
  • 实现异步处理请求 package com.icss.action; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.AsyncContext; import javax.servlet.AsyncEvent; import javax.servlet....
  • Servlet容器配置在web.xml中对DispatcherServlet和所有filter添加对于配置了web.xml的应用程序,请确保更新至版本3.0:xmlns:xsi=...
  • Java中使用RabbitMQ的异步Web-Worker模型 正如在“文章中所解释的那样,Web请求应尽快完成。 如果操作可能需要很长时间,则最好将其发送给工人测功机以在后台进行处理。 本文通过使用Spring 和以及Heroku 的示例...
  • 亦即是说,在js代码中向服务器发送异步请求,不刷新整个界面,只更改部分界面。 首先,要创建XMLHttpRequest对象,js代码: // 创建XMLHttpRequest对象 function createXMLHttpRequest(){ // chrome, opera等 ...
  • 一 简介和实现效果这里用一个小例子来简单举例说明,做一个搜索引擎...注:在文末我会给出完整源代码的下载链接,以供大家参考二 具体实现1 在eclipse for java ee中创建一个Java Web工程,然后导入相应的jar包,...
  • 第7章 注册功能实现-异步的表单校验7.1涉及的技术知识点Ajax7.2AjaxAJAX 是 Asynchronous JavaScript AndXML 的简称。...7.3异步处理同步处理AJAX出现之前,我们访问互联网时一般都是同步请求,也就是当我...
  • 一、什么是同步调用浏览器发起请求Web服务器开一个线程处理,处理完把处理结果返回浏览器。好像没什么好说的了,绝大多数Web服务器都如此般处理。现在想想如果处理的过程中需要调用后端的一个业务逻辑服务器请求...
  • DWR是一个开源的服务器端ajax框架,js通过直接调用普通java类中的方法实现服务器端数据处理。原理:框架根据配置在加载页面的时候自动生成ajax代码供前端调用。  该框架只需一个jar包 csdn有下载:dwr(免费)  web....
  • 前言随着 Web Servlet 技术栈的不断发展实现了异步处理与非阻塞 IO,但是其异步是不彻底的,因为受制于 Servlet 规范本身,比如其规范是同步的(Filter,Servlet)或阻塞(getParameter,getPart)。所以新的使用少量...
  • 1、简单介绍一下Ajax(Asynchronous JavaScript and XML)异步请求: Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。 2、简单介绍一下Json数据: JSON(JavaScriptObject...
  • java异步编程

    2017-12-18 22:34:00
    通过异步消除阻塞,可以让web服务响应更多请求。可以让系统更高效的执行。比如log框架,记录日志或异常时异步执行可避免影响正常业务流程的执行。 异步变成如何把线程执行结果返回是个问题,通常的做法是注册回调。...
  • tomcat下不报错,放到was下报错,请大神指点。[16-4-20 9:32:28:352 CST] 000000c3 LocalTranCoor E WLTC0017E: 资源回滚,因为...[16-4-20 9:32:28:352 CST] 000000c3 webapp E com.ibm.ws.webcontainer.webapp....
  • 相关系列文章:Servlet 3.0 开始提供了AsyncContext用来支持异步处理请求,那么异步处理请求到底能够带来哪些好处?Web容器一般来说处理请求的方式是:为每个request分配一个thread。我们都知道thread的创建不是没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 602
精华内容 240
关键字:

java异步web请求

java 订阅