引言Java.lang.IllegalStateException是在Java开发过程中常见的错误之一。它通常在尝试在同一个响应中多次调用getOutputStream()方法时抛出。...如果我们先调用了getOutputStream()方法获取了输出流,然后又尝试调用getWriter()方法,或者反之亦然,就会抛出IllegalStateException。...Servlet过滤器中的错误处理当我们在Servlet过滤器中处理响应时,如果多次调用了getOutputStream()或getWriter()方法,就会抛出IllegalStateException...这通常发生在我们在过滤器中进行一些额外的响应处理,并且多次调用了这些方法。为了避免这个错误,我们可以在过滤器中添加一个标志位来跟踪输出流的获取状态。只有在输出流未获取时才进行额外的处理。2....JSP页面中的错误处理在JSP页面中,如果我们在使用JSTL或其他标签库时多次调用了getOutputStream()或getWriter()方法,也会导致IllegalStateException的发生
的响应流,repsonse一共提供了两个响应流对象: PrintWriter out = response.getWriter():获取字符流; ServletOutputStream out = response.getOutputStream...():获取字节流; 当然,如果响应正文内容为字符,那么使用response.getWriter(),如果响应内容是字节,例如下载时,那么可以使用response.getOutputStream()。...不然会抛出IllegalStateException异常。...等同与调用了response.setCharacterEncoding(“utf-8”); 设置Content-type响应头,即通知浏览器响应数据的编码为utf-8。...5.4、重定向小结 重定向是两次请求; 重定向的URL可以是其他应用,不局限于当前应用; 重定向的响应头为302,并且必须要有Location响应头; 重定向就不要再使用response.getWriter
从上图可以看出:请求过来后,从主线程池获取一个线程,处理业务,响应请求,然后将线程还回线程池,整个过程都是由同一个主线程在执行。...event) throws IOException { //发生错误会被回调 event.getAsyncContext().getResponse().getWriter...tomcat 控制台输出,可以看出 onComplete 被调用了。 ? 下面模拟超时请求,访问下面地址 http://localhost:8080/asyncServlet5?...1617378344634-onTimeout() Thread[http-nio-8080-exec-10,5,main]-1617378344634-onComplete() java.lang.IllegalStateException...orderId=1&result=success;用来模拟将结果通知给请求者,这步执行完毕之后,step2会立即收到响应 ?
2.2.1.1 发送状态码相关的方法 当Servlet向客户端回送响应消息时,需要在响应消息中设置状态码。为此,在HttpServletResponse接口中,定义了两个发送状态码的方法,具体如下。...2.2.1.2 发送响应消息头相关的方法 当Servlet向客户端发送响应消息时,由于HTTP协议的响应头字段有很多种,为此,在HttpServletResponse接口中,定义了一系列设置HTTP响应头字段的方法...注意: 虽然response对象的getOutputStream()和getWriter()方法都可以发送响应消息体,但是,它们之间互相排斥,不可同时使用,否则会发生IllegalStateException...图4-3 图4-3中发生异常的原因就是在Servlet中,调用response.getWriter() 方法之前已经调用了response.getOutputStream() 方法。...需要注意的是,该方法必须在响应提交给客户端之前被调用,否则将抛出IllegalStateException异常include(ServletRequest request, ServletResponse
------------------->创建 Request并设置Request参数 通过AlipayClient执行request调用SDK生成表单,用HttpServletResponse(浏览器响应的一个流...().write(form);// 直接将完整的表单html输出到页面 httpResponse.getWriter().flush(); httpResponse.getWriter(...alipay接口的配置 遇到的坑: url中有中文字符报错,更换依赖 官网提供有easy版和正式版 easy-sdk 好像不太支持中文的subject,否则 biz_content就会乱码,那我索性就用了...; System.out.println("买家付款金额: " + params.get("buyer_pay_amount")); // 更新订单未已支付...ordersMapper.updateState(tradeNo, "已支付", gmtPayment, alipayTradeNo); } }
----------------->创建 Request并设置Request参数 5.通过AlipayClient执行request调用SDK生成表单,用HttpServletResponse(浏览器响应的一个流...().write(form);// 直接将完整的表单html输出到页面 httpResponse.getWriter().flush(); httpResponse.getWriter(...alipay接口的配置 遇到的坑: url中有中文字符报错,更换依赖 官网提供有easy版和正式版 easy-sdk 好像不太支持中文的subject,否则 biz_content就会乱码,那我索性就用了...; System.out.println("买家付款金额: " + params.get("buyer_pay_amount")); // 更新订单未已支付...ordersMapper.updateState(tradeNo, "已支付", gmtPayment, alipayTradeNo); } }
"username":"jack","age":23}, success:function (data) { alert(data); },//响应成功后的回调函数...error:function () { alert("出错啦....") },//表示如果请求响应出现错误,会执行的回调函数 dataType...:请求路径 data:请求参数 callback:回调函数 type:响应结果的类型 function fun() { $.get("ajaxServlet",{username:"rose"}...",{username:"rose"},function (data) { alert(data); },"text"); } tips:针对上面3种ajax方式,我们主要是调用了三种不同的方法...对于回调函数需要着重注意一点:向回调函数中传递的data一般来自于后端传输到前端的data,前端接收到之后,对data进行处理,这就是回调函数的基本思想。
获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认 为application/x-www-form-urlencoded,表示请求体内容使用了...request域进行Servlet进行Servlet之间的通讯在开发中是非常频繁的 细节: 如果在调用foreard方法之前,在Servlet程序中写入的部分已经被真正地传到了客户端,forward方法将抛出IllegalStateException...不要在在转发之前写数据给浏览器 如果调用forward方法之前向Servlet引擎的缓冲区中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到缓冲区中的内容将被清空,但是已写入到...content-type头来解读响应数据) 总结:响应正文内容为字符,那么使用respone.getWriter(),如果响应内容是字节,例如下载文件,可以使用 response.getOutputStream...() 注意:在同一个请求中,不能同时使用这两个流,否则会抛出 IllegalStateException 异常 getWriter() 的缓冲区问题 它的类型是PrintWriter类型的,所以它有缓冲区
HTTP 协议格式 响应行 响应的协议和版本号 响应状态码 响应状态描述符 响应头 key : value (不同的响应头,有其不同含义) 响应体(即回传给客户端的数据) 参考图片见上图 常用的响应码...().write("数据已储存至 Session 中"); } /** * 获取 Session 域中的数据 * @param req * @param resp * @throws ServletException...username=ahzoo" })then(function (resp){ //回调函数,接收后端返回结果 alert(resp.data); }) Post请求: axios({...http://localhost:8080/axios-demo/aJAXDemo" data:"username=ahzoo" })then(function (resp){ //回调函数...}); 错误处理: axios.get('/user/12345') .catch(function (error) { if (error.response) { // 请求已发出
服务器响应方式不同: 传统:响应一个完整页面(JSP)。 Ajax:响应需要的数据。...常用事件: onreadystatechange:指定回调函数。 常用属性: readyState:XMLHttpRequest的状态信息。...3:XMLHttpRequest对象对象开始读取响应。 4:XMLHttpRequest对象读取响应结束。...xmlHttpRequest.responseText; if(data == "true"){ $("#info").html("用户名已存在...function(data){ if(data == "true"){ $("#info").html("用户名已存在
XMLHttpRequest 对象 (异步的与服务器交换数据) JavaScript/DOM (信息显示/交互) CSS (给数据定义样式) XML (作为转换数据的格式) 异步:发送请求后不等待返回结果,由回调函数处理结果...HttpServletResponse response) throws ServletException, IOException { System.out.println("获得异步请求"); response.getWriter...username>" + "" + pwd + "" + ""; System.out.println(xml); response.getWriter...,创建回调函数,根据响应状态动态更新页面 xhr.onreadystatechange = function() { if (xhr.readyState...,创建回调函数,根据响应状态动态更新页面 xhr.onreadystatechange = function() { if (xhr.readyState
字节流 getOutputStream(); 常用于下载(传递二进制数据) 字符流 getWriter(); 常用于回传字符串(常用) 两个流同时只能使用一个。...使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。...PrintWriter writer = resp.getWriter(); writer.write("response's content!!!")...; } } d)响应的乱码解决 解决响应中文乱码方案一(不推荐使用): // 设置服务器字符集为 UTF-8 resp.setCharacterEncoding("UTF-8"); // 通过响应头...叫请求 重定向(因为之前的地址可能已经被废弃) 请求重定向的第一种方案: // 设置响应状态码 302 ,表示重定向,(已搬迁) resp.setStatus(302); // 设置响应头,说明
直接创建其实就是使用了默认的配置。...再回头看RealCall实现的接口Call: // 已准备要执行的请求。...然后回调请求监听器的请求开始。...().enqueue(new AsyncCall(responseCallback));//请求调度 } 同样先判断是否已请求过,回调请求开始。...cookie,如果响应使用gzip压缩过,则还需要进行解压。
两个输出流的说明 字节流 getOutputStream(); 常用于下载(传递二进制数据) 字符流 getWriter(); 常用于回传字符串(常用) 两个流同时只能使用一个。...使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。 如何往客户端回传数据 往客户端回传字符串数据。...IOException { resp.setContentType("text/html; charset=UTF-8"); PrintWriter writer = resp.getWriter...(); writer.write("响应的内容"); } } 结果: 响应的乱码解决 解决响应中文乱码方案一(不推荐使用): // 设置服务器字符集为 UTF-8 resp.setCharacterEncoding...请求重定向的第一种方案: // 设置响应状态码 302 ,表示重定向,(已搬迁) resp.setStatus(302); // 设置响应头,说明 新的地址在哪里 resp.setHeader("Location
属性来在HTML文档中模拟HTTP响应消息头 发送响应消息体相关的方法 发送响应消息体相关的方法 由于在 HTTP 响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse...因此,要想输出二进制格式的响应正文,就需要使用 getOutputStream() 方法。 2)getWriter() 方法 该方法所获取的字符输出流对象为 PrintWriter 类型。...由于 PrintWriter 类型的对象可以直接输出字符文本内容,因此,要想输出内容全部为字符文本的网页文档,则需要使用 getWriter() 方法。...注意1:虽然 response 对象的 getOutputStream() 和 getWriter() 方法都可以发送响应消息体,但是,它们之间互相排斥,不可同时使用,否则会发生 IllegalStateException...注意2:虽然Servlet的sercice方法结束后,Servlet引擎会检查这两个方法返回的输出流对象有没有调用close方法,没有会帮忙调一下,但是作为Servlet开发人员最好还是把close方法加上
if("zhangsan".equals(username)) { resp.getWriter().write("用户名已注册...处理响应:onreadystatechange readyState:0-请求未初始化,1-服务器连接已建立,2-请求已接收,3-请求处理中,4-请求已完成,且响应已就绪。 ...status:200-响应已全部 OK。 获得响应数据形式 responseText:获得字符串形式的响应数据。 responseXML:获得 XML 形式的响应数据。...success:请求成功时调用的回调函数。 error:请求失败时调用的回调函数。 代码实现 调函数。 error:请求失败时调用的回调函数。
,Spring Security 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有 Spring Security 多,但是对于大部分项目而言,Shiro 也够用了...当用户从浏览器发送请求访问 /hello 接口时,服务端会返回 302 响应码,让客户端重定向到 /login 页面,用户在 /login 页面登录,登陆成功之后,就会自动跳转到 /hello 接口。...4.登录配置 对于登录接口,登录成功后的响应,登录失败后的响应,我们都可以在 WebSecurityConfigurerAdapter 的实现类中进行配置。...httpBasic() .and() .csrf().disable(); } } 我们可以在 successHandler 方法中,配置登录成功的回调,...如果是前后端分离开发的话,登录成功后返回 JSON 即可,同理,failureHandler 方法中配置登录失败的回调,logoutSuccessHandler 中则配置注销成功的回调。
在这种模式下,当在Servlet内执行比较耗时的操作,比如访问了数据库、同步调用了远程rpc,或者进行了比较耗时的计算时,当前分配给Servlet执行任务的线程会一直被该Servlet持有,不能及时释放掉后供其他请求使用...代码3.2从asyncContext中获取响应对象,并把响应结果写入响应对象。代码3.3则调用asyncContext.complete()标识异步任务执行完毕。...上面代码的异步执行虽然及时释放了调用Servlet时执行的容器线程,但是异步处理还是使用了容器中的其他线程,其实我们可以使用自己的线程池来进行任务的异步处理,将上面的代码修改为如下形式: //1.开启异步支持...Filter中的异步请求处理有效,否则,当调用ServletInputStream.setReadListener或Servlet OutputStream.setWriteListener方法时将抛出IllegalStateException...3)最终在业务线程池中执行的异步任务会产生一个结果,该结果会被设置到DeferredResult对象,然后设置的回调函数会被调用,接着Spring MVC会分派请求结果回到Servlet容器继续完成处理
Ajax,并不是指一种单一的技术,而是有机的利用了一系列交互式网页应用相关的技术所形成的结合体。...减轻服务器和宽带的负担 开发和调试工具的缺乏 2.Ajax的XMLHttpRequest对象 Ajax的核心是XMLHttpRequest对象,它是Ajax实现的关键——发送异步请求、接收响应及执行回调都是通过它来完成的...2 “发送完成”状态,已经把一个请求发送到服务器端,但还没有响应。 3 “正在接收”状态,已经接收,还没有完全接收结束。...4 “已加载”状态,响应已经被完全接收。...如: {name:’zhangs’} callback:载入成功时回调函数(只有当Response的返回状态是success 才调用该方法)自动将请求结果和状态传递给该方法。