JavaEE05 HTTP响应处理编程

合集下载

JAVA基础之HttpServletResponse响应

JAVA基础之HttpServletResponse响应

JAVA基础之HttpServletResponse响应 ⽤户在客户端输⼊⽹址(虚拟路径)时,开始发送⼀个HTTP请求(请求⾏、请求头、请求体)⾄服务器。

服务器内的Tomcat引擎会解析请求的地址,去找XML⽂件,然后根据虚拟路径找Servlet的真实路径,真实的Servlet会将请求的信息封装成request(请求)对象,然后再创建⼀个response(响应)对象,(此时的response内是空的)同时创建servlet对象,并调⽤service⽅法(或doGet和doPost⽅法)。

这样就是把两个对象传给了服务器内的某个servlet的service⽅法,通过这个⽅法,我们可以获得request的所有的信息,并且向response内设置信息。

response.getwriter().write()将内容写到response的缓冲区,这样service⽅法结束了,⽅法返回后,tomcat引擎会将从该response缓冲区中获取的设置信息封装成⼀个HTTP响应(响应⾏、响应头、响应体),发送给客户端。

客户端解析响应回来的东西继⽽进⾏显⽰。

我们可以通过设置修改响应的信息进⾏相应的重定向(⽤户访问的⽹页不存在并跳转到其他⽹页上)、修改响应⽂本(需要修改浏览器和服务器两边的编码,并且还得处理兼容问题)。

⼀、概述: 我们在创建Servlet时会覆盖service()⽅法,或doGet()/doPost(),这些⽅法都有两个参数,⼀个为代表请求的request和代表响应response。

service⽅法中的response的类型是ServletResponse,⽽doGet/doPost⽅法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的⼦接⼝,功能和⽅法更加强⼤⼆、运⾏流程:三、内容:响应⾏、响应头、响应体;四、通过response 设置响应⾏: 设置响应⾏的状态码:setStatus( int sc)五、通过response 设置响应头: setHeader(String name,String value) 设置public class RefreshServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置定时刷新的头response.setHeader("refresh","5;url=https://");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script type="text/javascript">window.onload=function(){//获取span元素var second=document.getElementById("second");//定义秒数var time =5;//设置定时器var timer=setInterval(function(){second.innerHTML=time;time--;if(time < 0){clearInterval(timer);location.href="https://";}},1000);}</script></head><body>恭喜您,注册成功!<span id="second" style="color:red">5</span>秒后跳转,如没跳转,请点击<a href="https://">这⾥</a></body></html>1、重定向:(请求服务器两次,地址栏变化)①、状态码:302;②、响应头:location 代表重定向地址;public class Servlet01 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*// 设置响应状态码response.setStatus(302);//设置响应头中的Locationresponse.setHeader("Location","/WEB0/Servlet02");*///重定向response.sendRedirect("/WEB0/Servlet02");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}public class Servlet02 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().write("Servlet02");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}六、通过response 设置响应体:1、响应体设置⽂本:PrintWriter getWriter() 获得字符流,通过字符流的write(String s)⽅法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

Java中实现Http请求并获取响应数据

Java中实现Http请求并获取响应数据

Java中实现Http请求并获取响应数据⽬录前⾔接⼝说明:获取指定年份或年⽉份的所有节假⽇信息。

默认返回当前年份的所有信息。

跳转链接:以上功能代码仅在使⽤GET请求⽅式时测试通过,POST等其他请求时请⾃⾏尝试。

因未设置请求头时也成功获取了响应数据,所以未在演⽰代码中添加请求头信息,请求失败时可⾃⾏添加请求头信息后重试⽅式⼀:功能实现类.HttpURLConnection请求实现代码:package com.zhiyin.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import .HttpURLConnection;import .URL;public class MyTest {public static void main(String[] args) {test();}// HttpURLConnection⽅式public static void test() {String SUBMIT_METHOD_GET = "GET"; // ⼀定要是⼤写,否则请求⽆效String urlStr = "http://timor.tech/api/holiday/year/"; // 请求http地址String param = "2020"; // 请求参数HttpURLConnection connection = null;InputStream is = null;BufferedReader br = null;String result = null; // 返回结果字符串try {// 创建远程url连接对象URL url = new URL(urlStr);// 通过远程url连接对象打开⼀个连接,强转成httpURLConnection类connection = (HttpURLConnection) url.openConnection();// 设置连接⽅式:GETconnection.setRequestMethod(SUBMIT_METHOD_GET);// 设置连接主机服务器的超时时间:15000毫秒connection.setConnectTimeout(15000);// 设置读取远程返回的数据时间:60000毫秒connection.setReadTimeout(60000);// 发送请求connection.connect();// 通过connection连接,请求成功后获取输⼊流if (connection.getResponseCode() == 200) {is = connection.getInputStream();// 封装输⼊流is,并指定字符集br = new BufferedReader(new InputStreamReader(is, "UTF-8"));// 存放数据StringBuffer sbf = new StringBuffer();String temp = null;while ((temp = br.readLine()) != null) {sbf.append(temp);}result = sbf.toString();}} catch (IOException e) {e.printStackTrace();} finally {// 释放资源if (null != br) {try {br.close();} catch (IOException e) {e.printStackTrace();}}if (null != is) {try {is.close();} catch (IOException e) {e.printStackTrace();}}connection.disconnect(); // 关闭远程连接}System.out.println("Successfully:" + result);}}⽅式⼆:功能实现类org.apache.http.client.methods.HttpGet maven项⽬中pom.xml⽂件⾥引⼊依赖:<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency>请求实现代码:package com.zhiyin.test;import org.apache.http.HttpEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import java.io.InputStream;public class MyTest {public static void main(String[] args) {test();}// HttpGet⽅式public static void test() {try {String urlStr = "http://timor.tech/api/holiday/year/"; // 请求http地址String param = "2020"; // 请求参数// 模拟(创建)⼀个浏览器⽤户CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(urlStr + param);// httpclient进⾏连接CloseableHttpResponse response = client.execute(httpGet); // 获取内容HttpEntity entity = response.getEntity();// 将内容转化成IO流InputStream content = entity.getContent();// 输⼊流转换成字符串byte[] byteArr = new byte[content.available()];content.read(byteArr); // 将输⼊流写⼊到字节数组中String result = new String(byteArr);System.out.println("Successfully:" + result);} catch (Exception e) {e.printStackTrace();}}}。

Java Web_第3章使用Servlet处理Http响应

Java Web_第3章使用Servlet处理Http响应
PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>”);
调用print()、println()或 write()方法
何时设置状态码
注意:在使用PrintWriter向客户端输出信息之前,设置状态码
设置状态码
使用HttpServletResponse的setStatus()方法 setStatus方法的参数是一个整数 使用HttpServletResponse中的常量
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //使用 使用response.setStatus()进行重定向 使用 进行重定向 response.setStatus(response.SC_MOVED_TEMPORARILY); response.addHeader("location", "dynamicimage"); }
设置响应状态行
状态行分为HTTP协议版本、状态码和状态描述三个部分 HTTP/1.1 200 OK HTTP状态码: 状态描述与状态码直接相关 100-199:表示信息性代码,标示客户端应该采取 的其他动作,请求正在进行。 HTTP响应内容由服务器确定 200-299:表示客户请求成功。 300-399:表示用于已经移走的资源文件,指示新 利用状态码可以把用户重定向 的地址。 到另一个网站,可以指示附加 400-499:表示由客户端引发的错误。 的文档是图片、PDF或 HTML…… 500-599:表示由服务器端引发的错误。

JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码

JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码

JAVA发送HTTP请求,返回HTTP响应内容,应⽤及实例代码JDK 中提供了⼀些对⽆状态协议请求(HTTP )的⽀持,下⾯我就将我所写的⼀个⼩例⼦(组件)进⾏描述:⾸先让我们先构建⼀个请求类(HttpRequester )。

该类封装了 JAVA 实现简单请求的代码,如下:复制代码代码如下:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import .HttpURLConnection;import .URL;import java.nio.charset.Charset;import java.util.Map;import java.util.Vector;/*** HTTP请求对象** @author YYmmiinngg*/public class HttpRequester {private String defaultContentEncoding;public HttpRequester() {this.defaultContentEncoding = Charset.defaultCharset().name();}/*** 发送GET请求** @param urlString* URL地址* @return 响应对象* @throws IOException*/public HttpRespons sendGet(String urlString) throws IOException {return this.send(urlString, "GET", null, null);}/*** 发送GET请求** @param urlString* URL地址* @param params* 参数集合* @return 响应对象* @throws IOException*/public HttpRespons sendGet(String urlString, Map<String, String> params)throws IOException {return this.send(urlString, "GET", params, null);}/*** 发送GET请求** @param urlString* URL地址* @param params* 参数集合* @param propertys* 请求属性* @return 响应对象* @throws IOException*/public HttpRespons sendGet(String urlString, Map<String, String> params, Map<String, String> propertys) throws IOException {return this.send(urlString, "GET", params, propertys);}/*** 发送POST请求** @param urlString* URL地址* @return 响应对象* @throws IOException*/public HttpRespons sendPost(String urlString) throws IOException {return this.send(urlString, "POST", null, null);}/*** 发送POST请求** @param urlString* URL地址* @param params* 参数集合* @return 响应对象* @throws IOException*/public HttpRespons sendPost(String urlString, Map<String, String> params) throws IOException {return this.send(urlString, "POST", params, null);}/*** 发送POST请求** @param urlString* URL地址* @param params* 参数集合* @param propertys* 请求属性* @return 响应对象* @throws IOException*/public HttpRespons sendPost(String urlString, Map<String, String> params, Map<String, String> propertys) throws IOException {return this.send(urlString, "POST", params, propertys);}/*** 发送HTTP请求** @param urlString* @return 响映对象* @throws IOException*/private HttpRespons send(String urlString, String method,Map<String, String> parameters, Map<String, String> propertys)throws IOException {HttpURLConnection urlConnection = null;if (method.equalsIgnoreCase("GET") && parameters != null) {StringBuffer param = new StringBuffer();int i = 0;for (String key : parameters.keySet()) {if (i == 0)param.append("?");elseparam.append("&");param.append(key).append("=").append(parameters.get(key)); i++;}urlString += param;}URL url = new URL(urlString);urlConnection = (HttpURLConnection) url.openConnection();urlConnection.setRequestMethod(method);urlConnection.setDoOutput(true);urlConnection.setDoInput(true);urlConnection.setUseCaches(false);if (propertys != null)for (String key : propertys.keySet()) {urlConnection.addRequestProperty(key, propertys.get(key));}if (method.equalsIgnoreCase("POST") && parameters != null) {StringBuffer param = new StringBuffer();for (String key : parameters.keySet()) {param.append("&");param.append(key).append("=").append(parameters.get(key)); }urlConnection.getOutputStream().write(param.toString().getBytes()); urlConnection.getOutputStream().flush();urlConnection.getOutputStream().close();}return this.makeContent(urlString, urlConnection);}/*** 得到响应对象** @param urlConnection* @return 响应对象* @throws IOException*/private HttpRespons makeContent(String urlString,HttpURLConnection urlConnection) throws IOException {HttpRespons httpResponser = new HttpRespons();try {InputStream in = urlConnection.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));httpResponser.contentCollection = new Vector<String>();StringBuffer temp = new StringBuffer();String line = bufferedReader.readLine();while (line != null) {httpResponser.contentCollection.add(line);temp.append(line).append("\r\n");line = bufferedReader.readLine();}bufferedReader.close();String ecod = urlConnection.getContentEncoding();if (ecod == null)ecod = this.defaultContentEncoding;httpResponser.urlString = urlString;httpResponser.defaultPort = urlConnection.getURL().getDefaultPort();httpResponser.file = urlConnection.getURL().getFile();httpResponser.host = urlConnection.getURL().getHost();httpResponser.path = urlConnection.getURL().getPath();httpResponser.port = urlConnection.getURL().getPort();httpResponser.protocol = urlConnection.getURL().getProtocol();httpResponser.query = urlConnection.getURL().getQuery();httpResponser.ref = urlConnection.getURL().getRef();erInfo = urlConnection.getURL().getUserInfo();httpResponser.content = new String(temp.toString().getBytes(), ecod);httpResponser.contentEncoding = ecod;httpResponser.code = urlConnection.getResponseCode();httpResponser.message = urlConnection.getResponseMessage();httpResponser.contentType = urlConnection.getContentType();httpResponser.method = urlConnection.getRequestMethod();httpResponser.connectTimeout = urlConnection.getConnectTimeout();httpResponser.readTimeout = urlConnection.getReadTimeout();return httpResponser;} catch (IOException e) {throw e;} finally {if (urlConnection != null)urlConnection.disconnect();}}/*** 默认的响应字符集*/public String getDefaultContentEncoding() {return this.defaultContentEncoding;}/*** 设置默认的响应字符集*/public void setDefaultContentEncoding(String defaultContentEncoding) {this.defaultContentEncoding = defaultContentEncoding;}}其次我们来看看响应对象(HttpRespons )。

HTTP头部详解及使用Java套接字处理HTTP请求

HTTP头部详解及使用Java套接字处理HTTP请求

HTTP头部详解及使用Java套接字处理HTTP请求进行Web开发关键是要了解超文本传输协议(HTTP),该协议用来传输网页图像以及因特网上在浏览器与服务器间传输的其他类型文件只要你在浏览器上输入一个URL,最前面的http://就表示使用HTTP来访问指定位置的信息(大部分浏览器还支持其他一些不同的协议,其中FTP就是一个典型例子)本文从HTTP协议的结构上初步探讨HTTP协议的工作原理和请求响应格式,并最后通过一个使用Java编写的小HTTP服务器验证了如何处理和响应HTTP请求HTTP由两部分组成:请求和响应当你在Web浏览器中输入一个URL时,浏览器将根据你的要求创建并发送请求,该请求包含所输入的URL以及一些与浏览器本身相关的信息当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息以及位于指定URL(如果有的话)的数据直到浏览器解析该响应并显示出网页(或其他资源)为止HTTP请求HTTP请求的格式如下所示:<request-line><headers><blank line>[<request-body>]在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型要访问的资源以及使用的HTTP版本紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]在HTTP中,定义了大量的请求类型,不过Ajax开发人员关心的只有GET请求和POST请求只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源对于 的GET请求如下所示:GET / HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1Connection: Keep-Alive请求行的第一部分说明了该请求是GET请求该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录该行的最后一部分说明使用的是HTTP 1.1版本(另一个可选项是1.0)那么请求发到哪里去呢?这就是第二行的内容第2行是请求的第一个首部,HOST首部HOST将指出请求的目的地结合HOST 和上一行中的斜杠(/),可以通知服务器请求的是/(HTTP 1.1才需要使用首部HOST,而原来的1.0版本则不需要使用)第三行中包含的是首部User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础该信息由你使用的浏览器来定义(在本例中是Firefox 1.0.1),并且在每个请求中将自动发送最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值,但这已经超出了本书讨论的范围)注意,在最后一个首部之后有一个空行即使不存在请求主体,这个空行也是必需的如果要获取一个诸如/books的域内的页面,那么该请求可能类似于:GET /books/ HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1Connection: Keep-Alive注意只有第一行的内容发生了变化,它只包含URL中后面的部分要发送GET请求的参数,则必须将这些额外的信息附在URL本身的后面其格式类似于:URL ? name1=value1&name2=value2&..&nameN=valueN该信息称之为查询字符串(query string),它将会复制在HTTP请求的请求行中,如下所示:GET /books/?name=Professional%20Ajax HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1Connection: Keep-Alive注意,为了将文本Professional Ajax作为URL的参数,需要编码处理其内容,将空格替换成%20,这称为URL编码(URL encoding),常用于HTTP的许多地方(JavaScript提供了内建的函数来处理URL编码和解码,这些将在本章中的后续部分中说明)名称值(namevalue)对用 & 隔开绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式当然,如何使用这些数据还是由服务器决定的浏览器发送的首部,通常比本文中所讨论的要多得多为了简单起见,这里的例子尽可能简短另一方面,POST请求在请求主体中为服务器提供了一些附加的信息通常,当填写一个在线表单并提交它时,这些填入的数据将以POST请求的方式发送给服务器以下就是一个典型的POST请求:POST / HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1Content-Type: application/x-www-form-urlencodedContent-Length: 40Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley从上面可以发现, POST请求和GET请求之间有一些区别首先,请求行开始处的GET改为了POST,以表示不同的请求类型你会发现首部Host和User-Agent 仍然存在,在后面有两个新行其中首部Content-Type说明了请求主体的内容是如何编码的浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型首部Content-Length说明了请求主体的字节数在首部 Connection后是一个空行,再后面就是请求主体与大多数浏览器的POST请求一样,这是以简单的名称值对的形式给出的,其中name是Professional Ajax,publisher是Wiley你可以以同样的格式来组织URL的查询字符串参数正如前面所提到的,还有其他的HTTP请求类型,它们遵从的基本格式与GET 请求和POST请求相同下一步我们来看看服务器将对HTTP请求发送什么响应HTTP响应如下所示,HTTP响应的格式与请求的格式十分类似:<status-line><headers><blank line>[<response-body>]正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息状态行(status line)通过提供一个状态码来说明所请求的资源情况以下就是一个HTTP响应的例子:HTTP/1.1 200 OKDate: Sat, 31 Dec 2005 23:59:59 GMTContent-Type: text/html;charset=ISO-8859-1Content-Length: 122<html><head><title>Wrox Homepage</title></head><body><!-- body goes here --></body></html>在本例中,状态行给出的HTTP状态代码是200,以及消息OK状态行始终包含的是状态码和相应的简短消息,以避免混乱最常用的状态码有:200 (OK): 找到了该资源,并且一切正常304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改这通常用于浏览器的缓存机制401 (UNAUTHORIZED):客户端无权访问该资源这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器403 (FORBIDDEN):客户端未能获得授权这通常是在401之后输入了不正确的用户名或密码404 (NOT FOUND):在指定的位置不存在所申请的资源在状态行之后是一些首部通常,服务器会返回一个名为Data的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和Content-Length在本例中,首部 Content-Type指定了MIME 类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)响应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)浏览器将把这些数据显示给用户注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据Java代码1./** *//**2. * SimpleHttpServer.java3. */4.5.import java.io.*;6.import .*;7.import java.util.StringTokenizer;8.9./** *//**10. * 一个简单的用 Java Socket 编写的 HTTP 服务器应用, 演示了请求和应答的协议通信内容以及11. * 给客户端返回 HTML 文本和二进制数据文件(一个图片), 同时展示了 404, 200 等状态码.12. * 首先运行这个程序,然后打开Web浏览器,键入http://localhost,则这个程序能够显示出浏览器发送了那些信息13. * 并且向浏览器返回一个网页和一副图片, 并测试同浏览器对话.14. * 当浏览器看到 HTML 中带有图片地址时, 则会发出第二次连接来请求图片等资源.15. * 这个例子可以帮您理解 Java 的 HTTP 服务器软件是基于 J2SE 的 Socket 等软件编写的概念, 并熟悉16. * HTTP 协议.17. * 相反的用 Telnet 连接到已有的服务器则可以帮忙理解浏览器的运行过程和服务器端的返回内容.18. *19. * <pre>20. * 当用户在Web浏览器地址栏中输入一个带有http://前缀的URL并按下Enter后,或者在Web页面中某个以http://开头的超链接上单击鼠标,HTTP事务处理的第一个阶段--建立连接阶段就开始了.HTTP的默认端口是80.21. * 随着连接的建立,HTTP就进入了客户向服务器发送请求的阶段.客户向服务器发送的请求是一个有特定格式的ASCII消息,其语法规则为:22. * < Method > < URL > < HTTP Version > < >23. * { <Header>:<Value> < >}*24. * < >25. * { Entity Body }26. * 请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法有GET,POST,HEAD,PUT,DELETE等. 27. * 在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以":"分隔;报头行的最后是回车换行.常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等.28. * 在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个之后是请求消息的消息实体(Entity Body).具体的例子参看httpRequest.txt.29. * Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为:30. * < HTTP Version> <Status Code> [<Message>]< >31. * { <Header>:<Value> < > } *32. * < >33. * { Entity Body }34. * 应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.状态码由3位数字组成,有5类:35. * 参看:HTTP应答码及其意义36. *37. * 1XX 保留38. * 2XX 表示成功39. * 3XX 表示URL已经被移走40. * 4XX 表示客户错误41. * 5XX 表示服务器错误42. * 例如:415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:Last_Modified(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等.43. * 在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始.44. * 下面是一个应答消息的例子:45. * HTTP/1.0 200 OK46. * Date: Moday,07-Apr-97 21:13:02 GMT47. * Server:NCSA/1.148. * MIME_Version:1.049. * Content_Type:text/html50. * Last_Modified:Thu Dec 5 09:28:01 199651. * Coentent_Length:310752. *53. * <HTML><HEAD><TITLE></HTML>54. *55. * 在用Java语言实现HTTP服务器时,首先启动一个.ServerSocket在提供服务的端口上监听连接.向客户返回文本时,可以用 PrintWriter,但是如果返回二进制数据,则必须使用OutputStream.write(byte[])方法,返回的应答消息字符串可以使用 String.getBytes()方法转换为字节数组返回,或者使用PrintStream 的print()方法写入文本,用 write(byte[])方法写入二进制数据.56. *57. * </pre>58. * @author 刘长炯59. * @version 1.0 2007-07-24 Sunday60. */61.public class SimpleHttpServer implements Runnable ...{62. /** *//**63. *64. */65. ServerSocket serverSocket;//服务器Socket66.67. /** *//**68. * 服务器监听端口, 默认为 80.69. */70. public static int PORT=80;//标准HTTP端口71.72. /** *//**73. * 开始服务器 Socket 线程.74. */75. public SimpleHttpServer() ...{76. try ...{77. serverSocket=new ServerSocket(PORT);78. } catch(Exception e) ...{79. System.out.println("无法启动HTTP服务器:"+e.getLocalizedMessage());80. }81. if(serverSocket==null) System.exit(1);//无法开始服务器82. new Thread(this).start();83. System.out.println("HTTP服务器正在运行,端口:"+PORT);84. }85.86. /** *//**87. * 运行服务器主线程, 监听客户端请求并返回响应.88. */89. public void run() ...{90. while(true) ...{91. try ...{92. Socket client=null;//客户Socket93. client=serverSocket.accept();//客户机(这里是 IE 等浏览器)已经连接到当前服务器94. if(client!=null) ...{95. System.out.println("连接到服务器的用户:"+client);96. try ...{97. // 第一阶段: 打开输入流98. BufferedReader in=new BufferedReader(new InputStreamReader(99. client.getInputStream())); 100.101. System.out.println("客户端发送的请求信息: ***************");102. // 读取第一行, 请求地址103. String line=in.readLine(); 104. System.out.println(line); 105. String resource=line.substring(line.indexOf('/'),stIndexOf('/')-5);106. //获得请求的资源的地址107. resource=URLDecoder.decode(resourc e, "UTF-8");//反编码 URL 地址108. String method = new StringTokenize r(line).nextElement().toString();// 获取请求方法, GET 或者 POST109.110. // 读取所有浏览器发送过来的请求参数头部信息111. while( (line = in.readLine()) != n ull) ...{112. System.out.println(line); 113.114. if(line.equals("")) break; 115. }116.117. // 显示 POST 表单提交的内容, 这个内容位于请求的主体部分118. if("POST".equalsIgnoreCase(method) ) ...{119. System.out.println(in.readLine ());120. }121.122. System.out.println("请求信息结束 ***************");123. System.out.println("用户请求的资源是:"+resource);124. System.out.println("请求的类型是: " + method);125.126. // GIF 图片就读取一个真实的图片数据并返回给客户端127. if(resource.endsWith(".gif")) ...{128. fileService("images/test.gif", client);129. closeSocket(client);130. continue;131. }132.133. // 请求 JPG 格式就报错 404 134. if(resource.endsWith(".jpg")) ...{135. PrintW riter out=new PrintWriter(client.getOutputStream(),true); 136. out.println("HTTP/1.0 404 Not foun d");//返回应答消息,并结束应答137. out.println();// 根据 HTTP 协议, 空行将结束头信息138. out.close();139. closeSocket(client);140. continue;141. } else ...{142. // 用 writer 对客户端 socket 输出一段 HTML 代码143. PrintWriter out=new PrintWrite r(client.getOutputStream(),true);144. out.println("HTTP/1.0 200 OK") ;//返回应答消息,并结束应答145. out.println("Content-Type:text /html;charset=GBK");146. out.println();// 根据 HTTP 协议, 空行将结束头信息147.148. out.println("<h1> Hello Http S erver</h1>");149. out.println("你好, 这是一个 Java HTTP 服务器 demo 应用.<br>");150. out.println("您请求的路径是: " + resource + "<br>");151. out.println("这是一个支持虚拟路径的图片:<img src='abc.gif'><br>" +152. "<a href='abc.gif'>点击打开abc.gif, 是个服务器虚拟路径的图片文件.</a>");153. out.println("<br>这是个会反馈 404 错误的的图片:<img src='test.jpg'><br><a href='test.jpg'>点击打开test.jpg</a><br>");154. out.println("<form method=post action='/'& gt;POST 表单 <input name=username value='用户'> < input name=submit type=submit value=submit></form>"); 155. out.close();156.157. closeSocket(client);158. }159. } catch(Exception e) ...{160. System.out.println("HTTP服务器错误:"+e.getLocalizedMessage());161. }162. }163. //System.out.println(client+"连接到HTTP服务器");//如果加入这一句,服务器响应速度会很慢164. } catch(Exception e) ...{165. System.out.println("HTTP服务器错误:"+e.getLocalizedMessage());166. }167. }168. }169.170. /** *//**171. * 关闭客户端 socket 并打印一条调试信息.172. * @param socket 客户端 socket.173. */174. void closeSocket(Socket socket) ...{175. try ...{176. socket.close();177. } catch (IOException ex) ...{178. ex.printStackTrace();179. }180. System.out.println(socket + "离开了HTTP服务器");181. }182.183. /** *//**184. * 读取一个文件的内容并返回给浏览器端.185. * @param fileName 文件名186. * @param socket 客户端 socket.187. */188. void fileService(String fileName, Socket socket)189. ...{190.191. try192. ...{193. PrintStream out = new PrintStream(socket.getOu tputStream(), true);194. File fileToSend = new File(fileName); 195. if(fileToSend.exists() && !fileToSend.isDirect ory())196. ...{197. out.println("HTTP/1.0 200 OK");//返回应答消息,并结束应答198. out.println("Content-Type:application/bina ry");199. out.println("Content-Length:" + fileToSend .length());// 返回内容字节数200. out.println();// 根据 HTTP 协议, 空行将结束头信息201.202. FileInputStream fis = new FileInputStream( fileToSend);203. byte data[] = new byte[fis.available()];204. fis.read(data);205. out.write(data);206. out.close();207. fis.close();208. }209. }210. catch(Exception e)211. ...{212. System.out.println("传送文件时出错:" + e.getLocalizedMessage());213. }214. }215.216. /** *//**217. * 打印用途说明.218. */219. private static void usage() ...{220. System.out.println("Usage: java HTTPServer <port> Default port is 80.");221. }222.223.224. /** *//**225. * 启动简易 HTTP 服务器226. * @param args227. */228. public static void main(String[] args) ...{229. try ...{230. if(args.length != 1) ...{231. usage();232. } else if(args.length == 1) ...{233. PORT = Integer.parseInt(args[0]); 234. }235. } catch (Exception ex) ...{236. System.err.println("Invalid port arguments. It must be a integer that greater than 0");237. }238.239. new SimpleHttpServer();240. }241.242.}。

解决Java处理HTTP请求超时的问题

解决Java处理HTTP请求超时的问题

解决Java处理HTTP请求超时的问题在发送POST或GET请求时,返回超时异常处理办法:捕获 SocketTimeoutException | ConnectTimeoutException | ConnectionPoolTimeout 异常三种异常说明:SocketTimeoutException:是Java包下抛出的异常,这定义了Socket读数据的超时时间,即从server获取响应数据须要等待的时间;当读取或者接收Socket超时会抛出SocketTimeoutException。

ConnectTimeoutException:是Apache的HttpClient包抛出的超时异常,定义了通过⽹络与server建⽴连接的超时时间,Httpclient 包中通过⼀个异步线程去创建与server的socket连接,这就是该socket连接的超时时;当连接HTTPserver或者等待HttpConnectionManager管理的⼀个有效连接超时出错会抛出ConnectionTimeoutException。

ConnectionPoolTimeout:也是Apache的HttpClient包抛出的超时异常,定义了从 ConnectionManager 管理的连接池中取出连接的超时时间;出错会抛出 ConnectionPoolTimeoutException。

总结:SocketTimeoutException异常是⼀个通⽤的异常,⽆论是⽤原⽣的HTTP请求,还是⽤Apache下的HttpClient包,在抛出的异常中都需要捕获 SocketTimeoutException 异常。

例:public static String doGet(String url, Object params, String contentType) {try {return HttpUtils.doGetSend(url, params, contentType);} catch (SocketTimeoutException | ConnectTimeoutException e) {e.printStackTrace();System.out.println("请求连接超时:" + e.getMessage());} catch (IOException e) {e.printStackTrace();System.out.println("请求异常,异常信息:" + e.getMessage());} catch (Exception e) {e.printStackTrace();}return null;}补充:java 发送http请求(连接超时处理)业务背景:某项⽬跟第三⽅公司对接。

前端开发中常见的HTTP请求处理

前端开发中常见的HTTP请求处理

前端开发中常见的HTTP请求处理在前端开发中,处理HTTP请求是非常常见的任务。

无论是从服务器获取数据、提交表单数据或者进行其他各种交互,HTTP请求处理都是不可或缺的一环。

在本文中,我们将讨论一些常见的HTTP请求处理方式,帮助前端开发者更好地处理各种情况。

1. AJAX请求AJAX(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下,通过异步请求数据的技术。

通过使用XMLHttpRequest对象或者更现代化的fetch API,前端开发者可以向服务器发送HTTP请求,并在获取到响应后更新页面的部分内容。

AJAX请求可以是GET请求或者POST请求,可以携带各种参数和头部信息。

开发者可以注册请求的回调函数,在获取到响应后进行处理。

2. REST API请求在现代的Web开发中,使用RESTful API进行数据交互已经成为一种非常常见的方式。

REST(Representational State Transfer)是一种软件架构风格,通过使用HTTP协议进行通信,实现了不同客户端和服务器之间的解耦。

前端开发者通过发送HTTP请求,使用不同的HTTP方法(如GET、POST、PUT、DELETE等)来对资源进行操作。

比如,可以使用GET请求获取资源,使用POST请求创建资源,使用PUT请求更新资源,使用DELETE请求删除资源等。

REST API请求通常返回JSON格式的数据,前端开发者可以解析并使用这些数据。

3. 表单提交表单提交是另一种常见的HTTP请求处理方式。

当用户填写表单并点击提交按钮时,浏览器会自动发送一个HTTP请求到服务器。

在前端开发中,可以通过使用HTML的form元素配合不同的HTTP方法来实现表单提交,如GET、POST、PUT 等。

在表单提交时,可以通过JavaScript代码捕获表单的提交事件,进行一些额外的处理。

比如,可以使用JavaScript代码对表单数据进行验证,再将表单数据以合适的方式发送到服务器进行处理。

第01章 Java EE 5.0 概述

第01章 Java EE 5.0 概述

六、 统一资源定位器(URL) Internet的信息资源可能是用户磁盘中的一个文件, 也可能是地球的另一边某个连接在Internet上的计算 机的文件。 连接在Internet上的服务器数以亿计,同一个服务器 上可能还具有多种服务,如何定位Internet上的服务 器以及它的某种服务呢?解决这个问题的办法是使 用URL(Uniform Resource Locator,统一资源定位 符)
1.1 Internet基础知识
2. IP地址的表示法 IPv4地址是一个32位的二进制编码,其标准写法是4个 十进制数,即将32位的IP地址按8位一组分成4组,每组数值 用十进制数表示,每组的范围为0~255,组与组之间用小数 点分隔,称为点分十进制表示法。例如:202.117.64.5。 目前正处于试运行阶段的IPv6地址具有128位的二进制 编码,其表示法是用冒号分隔的十六进制。例如: 3FFE:0B00:0000:0000:0000:1234:AB26:0003,也可用压缩 表示法表示为:3FFE:0B00:0:0:0:1234:AB26:0003。如果前 导有若干个连续的0时,可用 :: 压缩表示,例 如,::CA75:4005是IPv4地址202.117.64.5的IPv6表示。

1.1 Internet基础知识
4. URL中的路径和文件名 URL的第3部分是主机资源的全路径和文件名,用 “/”作为分隔符。 路径和文件名指出所需资源(文件)的名称及其在计 算机(服务器)中的地址。 服务器经常将主页设置为默认路径下的默认文件。 当申请默认的文件时,文件的路径和名称可以省略。 例如,在这个URL中就 省略了文件的相关指定。
1.1 Internet基础知识
4. 域名的命名规则 一个主机的IP地址可以对应于多个域名, 一个域名只能对应—个IP地址。 域名的层次结构为: 主机名.组织机构名.网络名(机构的类别).最高层

JAVA代码实现HTTP请求的常用方法

JAVA代码实现HTTP请求的常用方法

JAVA代码实现HTTP请求的常用方法在Java中,有多种方法可以实现HTTP请求。

下面将介绍几种常用的方法。

1. 使用Java内置的URL类和HttpURLConnection类:```javaimport java.io.BufferedReader;import java.io.InputStreamReader;public class HTTPRequestExamplepublic static void main(String[] args) throws ExceptionURL obj = new URL(url);HttpURLConnection con = (HttpURLConnection)obj.openConnection(;//设置请求方法con.setRequestMethod("GET");//添加请求头con.setRequestProperty("User-Agent", "Mozilla/5.0");//获取响应码int responseCode = con.getResponseCode(;System.out.println("Response Code: " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream());String inputLine;StringBuffer response = new StringBuffer(;while ((inputLine = in.readLine() != null)response.append(inputLine);}in.close(;//打印响应内容System.out.println(response.toString();}```2. 使用第三方库HttpClient:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception //创建GET请求//发送请求并获取响应//解析响应实体内容//打印响应内容System.out.println(response);// 关闭HttpClient连接}```3. 使用第三方库OkHttp:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception// 创建OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient(;// 创建Request对象Request request = new Request.Builder.url(url).build(;//发送请求并获取响应Response response = okHttpClient.newCall(request).execute(;String responseBody = response.body(.string(;//打印响应内容System.out.println(responseBody);}```4. 使用第三方库RestTemplate(Spring框架的一部分):```javaimport org.springframework.web.client.RestTemplate;public class HTTPRequestExamplepublic static void main(String[] args)// 创建RestTemplate对象RestTemplate restTemplate = new RestTemplate(;//发送GET请求,并获取响应ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);//获取响应内容String response = responseEntity.getBody(;//打印响应内容System.out.println(response);}```这些方法提供了不同的方式来实现HTTP请求,使用Java内置的URL 类和HttpURLConnection类相对简单,但是需要自己处理底层连接和数据读取。

HTTP请求和响应报文与简单实现JavaHttp服务器

HTTP请求和响应报文与简单实现JavaHttp服务器

HTTP请求和响应报⽂与简单实现JavaHttp服务器报⽂结构HTTP 报⽂包含以下三个部分:起始⾏报⽂的第⼀⾏是起始⾏,在请求报⽂中⽤来说明要做什么,⽽在响应报⽂中⽤来说明出现了什么情况。

⾸部起始⾏后⾯有零个或多个⾸部字段。

每个⾸部字段都包含⼀个名字和⼀个值,为了便于解析,两者之间⽤冒号(:)来分隔。

⾸部以⼀个空⾏结束。

添加⼀个⾸部字段和添加新⾏⼀样简单。

主体空⾏之后就是可选的报⽂主体了,其中包含了所有类型的数据。

请求主体中包括了要发送给 Web 服务器的数据;响应主体中装载了要返回给客户端的数据。

起始⾏和⾸部都是⽂本形式且都是结构化的,⽽主体不同,主体中可以包含任意的⼆进制数据(⽐如图⽚,视频,⾳轨,软件程序)。

当然,主体中也可以包含⽂本。

HTTP 请求报⽂回车换⾏指代 \r\nHTTP 响应报⽂Http协议处理流程流程说明:1. 客户端(浏览器)发起请求,并根据协议封装请求头与请求参数。

2. 服务端接受连接3. 读取请求数据包4. 将数据包解码成HttpRequest对象5. 业务处理(异步),并将结果封装成HttpResponse对象6. 基于协议编码HttpResponse7. 将编码后的数据写⼊管道上⼀章博客就已经介绍了如何实现⼀个简单的 NIO 事件驱动的服务器,处理了包括接受连接、读取数据、回写数据的流程。

本⽂就主要针对解码和编码进⾏细致的分析。

关键步骤HttpResponse 交给 IO 线程负责回写给客户端API:java.nio.channels.SelectionKey 1.4Object attach(Object ob)将给定的对象附加到此键。

稍后可以通过{@link #attachment()}检索附件。

Object attachment()检索当前附件。

通过这个 API 我们就可以将写操作移出业务线程service.submit(new Runnable() {@Overridepublic void run() {HttpResponse response = new HttpResponse();if ("get".equalsIgnoreCase(request.method)) {servlet.doGet(request, response);} else if ("post".equalsIgnoreCase(request.method)) {servlet.doPost(request, response);}// 获得响应key.interestOps(SelectionKey.OP_WRITE);key.attach(response);// socketChannel.register(key.selector(), SelectionKey.OP_WRITE, response);// 坑:异步唤醒key.selector().wakeup();}});值得注意的是,因为我选择使⽤ select() 来遍历键,因此需要在业务线程准备好 HttpResponse 后,⽴即唤醒 IO 线程。

servlet处理http请求的基本流程

servlet处理http请求的基本流程

servlet处理http请求的基本流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!理解Servlet处理HTTP请求的基本流程Servlet是一种Java编程语言,用于扩展Web服务器的功能。

前端开发中的HTTP请求与响应处理技巧

前端开发中的HTTP请求与响应处理技巧

前端开发中的HTTP请求与响应处理技巧随着互联网的发展,前端开发在网页应用中的重要性也越来越突出。

作为前端开发人员,熟悉HTTP请求与响应的处理技巧是非常必要的。

本文将介绍一些常用的HTTP请求与响应处理技巧,帮助开发人员更好地进行前端开发。

一、HTTP请求在前端开发中,我们经常需要与后端进行数据交互,这就需要使用到HTTP请求。

我们常用的HTTP请求方式有GET和POST两种。

1. GET请求GET请求用于向服务器获取数据。

它的特点是请求参数通过URL传递,可以直接在浏览器地址栏中显示参数。

在开发中,我们可以通过axios、fetch等网络请求库来发送GET请求。

在发送GET请求时,我们可以通过URL传递参数,也可以在请求头中添加自定义的头信息。

在接收到服务器的响应后,我们可以通过回调函数来处理返回的数据。

2. POST请求POST请求用于向服务器提交数据。

与GET请求不同,POST请求的参数是放在请求体中的,不会在URL中显示。

同样地,我们可以使用axios、fetch等网络请求库来发送POST请求。

在发送POST请求时,我们需要使用FormData对象或JSON字符串来封装请求的参数,并在请求头中指定数据的类型。

在接收到服务器的响应后,我们同样可以通过回调函数来处理返回的数据。

二、HTTP响应HTTP响应是服务器对HTTP请求的返回结果。

在前端开发中,我们常常需要根据服务器的响应来进行数据处理。

1. 响应状态码HTTP响应中的状态码描述了服务器对请求的处理结果。

常见的状态码有200、404和500等。

我们可以根据状态码来判断请求是否成功,并作出相应的处理。

2. 响应头信息HTTP响应头提供了有关响应的额外信息。

我们可以通过它来获取服务器返回的头部信息,如Content-Type、Content-Length等。

在处理响应时,我们可以根据响应头的信息决定下一步的操作。

3. 响应数据处理在接收到服务器的响应数据后,我们需要对其进行处理。

servlet 的请求和响应处理机制

servlet 的请求和响应处理机制

servlet 的请求和响应处理机制Servlet是JavaEE中的一种技术,用于处理Web请求和生成Web响应。

它是一个服务器端组件,运行在Web服务器中,可以接收HTTP 请求并返回HTTP响应。

在本文中,将详细介绍Servlet的请求和响应处理机制。

一、Servlet请求处理机制1. 请求的触发:当客户端发起HTTP请求时,请求会首先到达Web 服务器。

Web服务器根据URL的映射规则将请求转发给相应的Servlet组件进行处理。

2. Servlet的生命周期:Servlet的生命周期包括初始化、服务和销毁三个阶段。

在初始化阶段,Servlet会被实例化并执行一些初始化操作;在服务阶段,Servlet会根据请求的类型(GET、POST等)调用相应的方法进行处理;在销毁阶段,Servlet会被销毁并释放资源。

3. 请求参数的获取:Servlet可以通过HttpServletRequest对象获取请求中的参数。

可以通过getParameter()方法获取单个参数的值,也可以通过getParameterValues()方法获取多个参数的值。

4. 请求的处理:Servlet可以根据请求的类型(GET、POST等)执行相应的处理逻辑。

可以通过HttpServletRequest对象获取请求的URL、请求头、请求体等信息,并根据这些信息进行相应的处理。

二、Servlet响应处理机制1. 响应的生成:Servlet可以通过HttpServletResponse对象生成Web响应。

可以通过设置响应头、写入响应体等方式生成具体的响应内容。

2. 响应头的设置:Servlet可以通过HttpServletResponse对象设置响应头。

可以设置Content-Type、Content-Length、Cache-Control等头信息,以控制响应的内容类型、大小和缓存策略等。

3. 响应体的写入:Servlet可以通过HttpServletResponse对象将响应内容写入响应体。

42种常见的HTTP响应代码

42种常见的HTTP响应代码

42种常见的HTTP响应代码本内容摘抄⾃《RESTful WebServices》中⽂译本附录B '42种常见的HTTP响应代码'。

原⽂作者:Leonard Ricbardson & Sam Ruby1、三⾄七种最基本的响应代码200("OK")⼀切正常。

实体主体中的⽂档(若存在的话)是某资源的表⽰。

400("Bad Request")客户端⽅⾯的问题。

实体主题中的⽂档(若存在的话)是⼀个错误消息。

希望客户端能够理解此错误消息,并改正问题。

500("Internal Server Error")服务期⽅⾯的问题。

实体主体中的⽂档(如果存在的话)是⼀个错误消息。

该错误消息通常⽆济于事,因为客户端⽆法修复服务器⽅⾯的问题。

301("Moved Permanently")当客户端触发的动作引起了资源URI的变化时发送此响应代码。

另外,当客户端向⼀个资源的旧URI发送请求时,也发送此响应代码。

404("Not Found") 和410("Gone")当客户端所请求的URI不对应于任何资源时,发送此响应代码。

404⽤于服务器端不知道客户端要请求哪个资源的情况;410⽤于服务器端知道客户端所请求的资源曾经存在,但现在已经不存在了的情况。

409("Conflict")当客户端试图执⾏⼀个”会导致⼀个或多个资源处于不⼀致状态“的操作时,发送此响应代码。

SOAP Web服务只使⽤响应代码200("OK")和500("Internal Server Error")。

⽆论是你发给SOAP服务器的数据有问题,还是服务器在处理数据的过程中出现问题,或者SOAP服务器出现内部问题,SOAP服务器均发送500("Internal Server Error")。

java servlet 的请求和响应处理机制

java servlet 的请求和响应处理机制

java servlet 的请求和响应处理机制
Java Servlet 是JavaEE 规范中用于处理Web请求和响应的组件。

它是运行在Web服务器上的Java程序,用于接收来自客户端
的请求并生成响应。

Java Servlet的请求和响应处理机制如下:
1. 客户端发送HTTP请求到Web服务器。

2. Web服务器接收到请求后,根据请求的URL路径找到相应
的Servlet。

3. Web服务器创建一个代表该请求的ServletRequest对象,以
及一个代表该响应的ServletResponse对象,并将这两个对象
传递给Servlet的service()方法。

4. Servlet的service()方法根据请求的类型(GET, POST等)调
用相应的doGet()或doPost()等方法来处理请求。

5. Servlet通过调用ServletRequest对象的方法来获取请求参数、头信息等。

6. Servlet生成要返回给客户端的响应内容,并将其设置到ServletResponse对象中。

7. Servlet调用ServletResponse对象的方法将响应写回给Web
服务器。

8. Web服务器将ServletResponse的内容封装成HTTP响应消息,并将其发送回客户端。

9. 客户端接收到响应后,根据HTTP响应消息的内容进行相应的处理。

Servlet的请求和响应处理机制是基于HTTP协议的,通过
ServletRequest和ServletResponse对象来获取和设置请求和响应的相关信息。

这使得开发人员可以轻松处理Web请求和生成Web响应。

java htttp编程

java htttp编程

java htttp编程
JavaHTTP编程是指使用Java编程语言进行HTTP协议的通信和交互。

HTTP协议是Web应用程序中最常用的协议之一,它负责在Web 浏览器和Web服务器之间传输数据。

Java HTTP编程提供了一种可靠和灵活的方式来构建Web应用程序,它可以帮助开发人员轻松地创建和维护可靠的Web服务。

Java HTTP编程的核心是Java的网络编程API,它提供了一些重要的类和接口,如URL、URLConnection、HttpURLConnection等。

这些类和接口让开发人员能够轻松地创建HTTP请求和处理HTTP响应。

Java HTTP编程还可以使用一些流行的HTTP客户端库,如Apache HttpClient和OkHttp等,这些库提供了更高级的HTTP功能,如连接池、缓存、认证等。

在Java HTTP编程中,开发人员需要熟悉HTTP协议的基本知识,如HTTP请求方法、HTTP响应状态码、HTTP请求头和响应头等。

此外,开发人员还需要了解如何处理HTTP响应的内容,如文本、XML和JSON 等。

最后,开发人员需要了解如何使用Java Servlet API和JavaServer Pages (JSP)来构建Web应用程序,这些技术可以帮助开发人员创建Web应用程序的用户界面和业务逻辑。

总之,Java HTTP编程是Java开发人员必须掌握的重要技能之一,它可以帮助开发人员构建可靠、高效和可扩展的Web应用程序。

- 1 -。

JavaWeb程序之HttpServletResponse与HttpServletRequest介绍

JavaWeb程序之HttpServletResponse与HttpServletRequest介绍

02 它封装了HTTP响应的所有 信息,包括响应状态码、响 应头、响应体等。
03 通过
04 HttpSer vletResponse是
HttpSer vletResponse ,
Servlet容器与开发者之间
开发者可以设置响应状态码、
的桥梁,帮助开发者构建动
添加响应头、设置响应内容
态的Web应用。
等操作。
应用实例
响应网页请求: 向客户端发送 HTML、CSS、 JavaScript等文 件
重定向:将客户 端请求重定向到 另一个URL
设置响应头:设 置Content-Type、 Cache-Control 等响应头信息
输出数据:使用 PrintWriter输出 文本、图片等数 据
发送错误信息: 向客户端发送错 误代码和错误信 息
HttpServletRequ est用于获取客户端 的HTTP请求信息, 包括请求头、请求 体等。
在实际应用中,可 以通过这两个对象 实现前后端数据交 互、页面跳转、文 件下载等功能。
谢谢
对象的方法设置响应信息
7
服务器将响应数据发送回客户端
ห้องสมุดไป่ตู้
8
客户端接收到响应数据,解析并显 示在浏览器上
实际应用
STEP1
STEP2
STEP3
STEP4
在JavaWeb程序中, HttpSer vletRespo nse和 HttpSer vletReque st是处理HTTP请求 和响应的核心对象。
HttpServletRespo nse用于响应客户端 的HTTP请求,将处 理结果返回给客户 端。
应用实例
● 获取客户端请求参数:通过getParameter()方法获取客户端提交的请求参数 ● 获取客户端请求头信息:通过getHeader()方法获取客户端请求头信息 ● 获取客户端请求URL:通过getRequestURI()方法获取客户端请求的URL ● 获取客户端请求方法:通过getMethod()方法获取客户端请求的方法,如GET、POST等 ● 获取客户端请求的Cookie信息:通过getCookies()方法获取客户端请求的Cookie信息 ● 获取客户端请求的Session信息:通过getSession()方法获取客户端请求的Session信息 ● 获取客户端请求的ServletContext信息:通过getServletContext()方法获取客户端请求的

java http服务器端开发教程

java http服务器端开发教程

java http服务器端开发教程在本教程中,我将向你展示如何使用Java编写一个简单的HTTP服务器端。

HTTP服务器是一个可以处理HTTP请求的应用程序,它可以接收客户端发送的请求,并返回相应的数据。

首先,我们需要导入Java的一些类库,以便能够处理HTTP请求和响应。

可以使用Java的内置类库javax.servlet和javax.servlet.http,这些类库提供了处理HTTP请求和响应的功能。

接下来,我们需要创建一个类,它将充当HTTP服务器的入口点。

我们可以将该类命名为HttpServer,并在其中创建一个main方法,该方法将作为程序的入口点。

在main方法中,我们首先需要创建一个ServerSocket对象,它将监听指定的端口以接收客户端的连接请求。

可以使用Java的包来创建和管理网络连接。

然后,我们可以使用ServerSocket的accept方法,来等待客户端的连接请求。

一旦收到请求,accept方法将返回一个代表客户端连接的Socket对象。

接下来,我们可以使用Socket对象的输入输出流来处理来自客户端的HTTP请求和响应。

可以使用Java的java.io包来读取和写入数据。

在处理HTTP请求时,我们需要解析请求的方法、URL和头部信息。

可以使用java.util包中的Scanner类来解析请求行和头部字段。

一旦我们解析了HTTP请求,我们可以根据请求的方法和URL来执行相应的逻辑。

例如,如果请求的是GET方法和/路径,我们可以返回一个简单的HTML页面。

可以使用Java的字符串拼接来构建响应的内容。

最后,我们可以使用Socket对象的输出流将响应返回给客户端。

可以使用PrintWriter类来写入响应的头部和内容。

在处理完一个请求后,我们可以继续等待下一个客户端的连接请求。

可以使用一个while循环来不断接受新的连接。

在编写HTTP服务器端时,还需要考虑到多线程和并发处理。

JavaEE使用JavaEE技术进行Web应用程序开发

JavaEE使用JavaEE技术进行Web应用程序开发

JavaEE使用JavaEE技术进行Web应用程序开发随着互联网的发展,Web应用程序的开发成为了现代化企业开发中的关键环节。

JavaEE作为一个成熟稳定的技术平台,已被广泛应用到企业级应用开发中。

本文介绍JavaEE技术在Web应用程序开发中的应用。

一、JavaEE技术概述JavaEE是Java Platform, Enterprise Edition的缩写,是Java平台的企业版。

JavaEE包括许多技术规范和框架,例如Servlet、JSP、JDBC、JPA、EJB、JMS等。

这些规范和框架提供了一系列的API和服务,用于开发、部署和管理企业级Java应用程序。

二、Web应用程序开发基础在JavaEE中,Web应用程序通常是基于Servlet和JSP技术构建的。

Servlet是一个Java程序,可以接收HTTP请求并生成HTTP响应。

Servlet程序可以通过API访问请求参数、表单数据、HTTP头和cookie等信息,也可以操作响应状态、响应头和响应体等信息。

JSP是Java Server Pages的缩写,是一种动态HTML页面技术,可以嵌入Java代码和JavaEE标签库。

JSP通过Servlet容器被编译成Servlet程序,然后被执行生成动态HTML页面。

三、JavaEE技术在Web应用程序开发中的应用1. Servlet APIServlet API是JavaEE提供的服务,用于处理HTTP请求和响应。

开发者可以创建一个Servlet类,继承HttpServletRequest和HttpServletResponse类,实现对HTTP请求的处理。

在处理一次HTTP请求时,Servlet容器会创建一个ServletRequest和ServletResponse对象,把它们传递给Servlet类的doGet()或doPost()方法。

以下是一个简单的Servlet程序示例:```java@WebServlet("/hello")public class HelloServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println("<html><head><title>Hello Servlet</title></head>");out.println("<body><h1>Hello Servlet</h1></body></html>");}}```这个程序处理了一个HTTP GET请求,输出了一个简单的HTML 页面。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HTTP响应体
• 类型由响应头确定。 • 可以使任何类型。 • 常用类型: 1)纯文本:text/plain 2)HTML:text/html 3)图片:image/gif, image/jpeg等
常见响应MIME类型
doc application/msword
dot
gif
application/msword
文本类型响应的编程
(1)设置响应类型ContentType response.setContentType(“text/html”); //响应类型为 HTML文档 (2)设置响应字符编码 response.setCharacterEncoding(“GBK”); //字符编码使 用GBK (3)取得字符输出流对象 PrintWriter out=response.getWriter(); (4)向流对象中发送文本数据 out.println(“<html><body></body></html>”); //输出 文本字符 (5)清空流中缓存的字符 out.flush(); (6)关闭流 out.close();
响应对象方法-向客户端传送Cooke
• public void addCookie(Cookie cookie); 此方法功能将Cookie对象放置在响应头 中,随响应内容到浏览器客户端,并保 存到客户端的PC的本地目录中。
发送Cookie案例代码
Cookie cookie01=new Cookie(“userid”,”9001”); response.addCookie(cookie01);
二进制类型响应编程
(1)设置响应类型ContentType response.setContentType(“image/jpeg”); //响应类 型为JPEG图片 (2)取得字节输出流对象 OutputStream out=response.getOutputStream(); // 取得字节输出流 (3)向流对象中发送字节数据 out.println(200); //输出字节数据 (4)清空流中缓存的字节 out.flush(); (5)关闭流 out.close();
Java EE 第5章
HTTP响应处理编程
授课大纲
• • • • • • • • HTTP响应基本知识 HTTP响应内容 响应状态行 响应头 HTML响应 文本HTML响应 二进制响应 HTTP响应响应案例
HTTP响应内容类型
• 在Web服务器接收请求处理后,向客户 端发送HTTP响应(Response). • 响应的内容: 1) 响应状态(Status Code) 2) 响应头(Response Header) 3) 响应体(Response Body) • JavaWeb中响应由响应对象Response完 成。
image/gif
htm
html jpe
text/html
text/html image/jpeg
jpeg
jpg moviห้องสมุดไป่ตู้ mp2
image/jpeg
image/jpeg video/x-sgi-movie video/mpeg
mp3 mpeg
mpg pdf
audio/mpeg video/mpeg
文本HTML响应案例
response.setContentType(“text/html;charset=gb2312”); PrintWriter out=response.getWriter(); out.println(“<html><head>”); out.println(“</head><body>”); out.println(“hello”); out.println(“</body></html>”); out.close();
video/mpeg application/pdf
Servlet-响应对象
• 响应对象类型: javax.servlet.http.HttpServeletResponse • 响应对象职责: (1)设置状态行 (3)发送响应头 (2)向Web浏览器发送HTTP响应体。 (3) 控制页面的重定向。即将告诉浏览器 再发送一次请求。
JavaEE响应对象生命周期
• Web容器自动为每次Web组件的请求生 成一个响应对象。 • Web容器创建响应对象后,传入到doGet 或doPost方法。 • 通过响应对象向浏览器发响应。 • 响应结束后,Web容器销毁响应对象, 释放所占的内存。
响应对象主要方法
• PrintWriter getWriter() //取得字符输出流 • ServletOutputStream getOutputStream() //取得字 节输出流 • void setContentType(String type) //设置响应类型 • void setContentLength(int length) //设置响应长度 • String getContentType() //取得响应类型 • void sendRecirect(String url) //重定向到URL • void setStatus(int statusCode) //设置状态码 • void setHeader(String name,String value) //设置响 应头
HTTP响应状态行(Status)
• • • • • 表明响应的状态信息,如成功,失败,错误。 状态行组成:版本/状态代码/状态信息 状态行例子:HTTP/1.1 200 ok 版本:使用的HTTP协议版本,如HTTP/1.1 状态代码:3位数字。 1xx: 收到请求,没有处理完。 2xx: 成功,响应完毕。 3xx:重定向,到另一个请求中去。 4xx:失败,没有请求的文档等。 5xx:内部错误,代码出现异常。 • 状态描述:
设置响应头便捷方法
• public void setContentType(String type) 直接设置相应内容类型MIME响应头 • public void setContentLength(int len) 设置响应体长度,以字节为单位。 • void setCharacterEncoding(String charset) 设置响应字符集,包括响应状态,响应头和 响应体。 • public void setBufferSize(int size) 设定响应体的缓存字节数。
响应头(Response Header)
• 功能:指示响应的类型信息,如响应类 型,大小等。 • 常见响应头内容: 1)响应类型:content-type 2)响应大小:content-length 3)到期时间:Expires 4)缓存情况:Cache-Control 5)刷新时间:Refresh 6)自动跳转:Refresh, "5; URL="
响应对象方法-请求重定向
• public void sendRedirect(String url) 将对客户的响应重定向到新的URL上,让 客户端浏览器对此URL进行请求。
重定向导航案例
• 通过响应对象的sendRedirect()方法实现动态 导航。 String url=“../admin/login.jsp”; response.sendRedirect(url); //重定向到登录页面,相当于在IE地址栏上 再输入一次URL地址,进行一次HTTP请求。 public void sendRedirect(String url) 执行到URL的自动重定向。
响应对象的方法-设置响应头
• public void setHeader(String name, String value) 将指定名称和值的响应头发送到客户端 • public void setIntHeader(String name,int value) 设置整数类型的响应头的名和值。 • public void setDateHeader(String name,long date) 设定日期类型的响应头。
二进制响应案例示意代码
//设置响应内容类型 response.setContentType(fileType); //取得响应输出流 OutputStream out=response.getOutputStream(); //取得图片的输入流 InputStream in=rs.getBinaryStream("PHOTO") while((len=in.read(data))!=-1) { out.write(data, 0, len); } in.close(); out.close();
相关文档
最新文档