(9)http请求与响应(两部分:HttpServletRequest,HttpServletResponse,java文件读入写出需掌握)

1  http协议

是对浏览器和服务器端数据传输格式的规范!

GET /day08/first HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-GB,en-US;q=0.8,zh-CN;q=0.6,zh;q=0.4,en;q=0.2

Accept-Encoding: gzip, deflate

Connection: keep-alive

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Content-Length: 24

Date: Mon, 08 Jun 2015 01:51:04 GMT

2  http请求(4部分)

GET /day08/first HTTP/1.1          --请求行

Host: localhost:8080                    --请求头(以键值对形式出现)

User-Agent: Mozilla/5.0 (Windows NT 6.1;WOW64; rv:37.0) Gecko/20100101 Firefox/37.0

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language:en-GB,en-US;q=0.8,zh-CN;q=0.6,zh;q=0.4,en;q=0.2

Accept-Encoding: gzip, deflate

Connection: keep-alive

                                              ----一个空行

name=eric&password=123456    --- 实体内容

2.1请求行

GET /day08/first HTTP/1.1(注意:这里分为三个部分,空格隔开)

                   http协议版本:

                                     http1.0:当浏览器和服务器连接之后,在一次连接中只能发出一个请求

                                     http1.1:当浏览器和服务器连接之后,在一次连接中可以发出多次请求。(效率比1.0更高)

                   请求资源:

                             请求服务器的哪个资源文件

                             /day08/first : URI:统一资源描述符。可以描述任何文件,本地,互联网                       

                    http://localhsot:8080/day08/first:URL : 统一资源定位符,互联网(基于http协议) ,是URI的子集。                                                       

                  请求方式(提交方式):

                            http协议中的请求方式:GET、POST、HEAD、PUT、CONNECT。。。。   

                            最常用的的请求方式: GET  和 POST

                            GET:

                            1)提交的参数显示到地址栏

                            原理: get方式提交的参数会跟在请求行内容的URI后面。以?开始,每个参数使用=号分开,name=jacky,第二个参数之后使用&符合连接(GET /day08/testMethod.html?name=jacky&password=123456 HTTP/1.1)

                             POST:

                            1)提交的参数不会显示到地址栏      

                            原理:post提交的参数跟在请求的实体内容中。第二个参数用&连接(name=jacky&password=123456    -实体内容)

2.2请求头

Accept: text/html,image/*     --浏览器接受的数据类型

Accept-Charset: ISO-8859-1     --浏览器接受数据编码格式

Accept-Encoding: gzip,compress    --浏览器接受的数据压缩格式

Accept-Language: en-us,zh-       ---浏览器接受的语言 

Host: www.it315.org:80           --请求发出的主机和端口(必须)

If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT   --浏览器缓存的最后修改时间

Referer: http://www.it315.org/index.jsp   -- 当前请求来自于哪里 (防止非法链接)

User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)   --浏览器的类型

Cookie:name=eric                 ---浏览器保存的cookie数据

Connection: close/Keep-Alive       ---浏览器和服务器的连接状态。close:关闭。keep-alive:保持连接

Date: Tue, 11 Jul 2000 18:23:51 GMT  --请求发出的时间

2.3 空行不叙述
2.4 关于实体内容(post才有),get是URI后

 get:  放在请求行的URI后面
 post: 放在请求的实体内容
			
		    reuqest.getParameter("name")  获取一个值的参数
		    request.getParameterValue("name")  获取具有多个值的参数
		    request.getParameterNames() 获取所有参数名称
		    request.getParameterMap()   获取所有参数对象

2.5总结request

/**
 * 使用HttpServletRequest获取请求信息
 *   HttpServletRequest对象:获取请求数据
 *   	请求行:
 *   		请求方式: request.getMethod()
 *   		请求资源: request.getRequestURI() /  request.getRequestURL()
 * 		http协议版本: request.getProtocol();
 * 	请求头  request.getHeader("name") 
 * 	        request.getHeaderNames()
 * 	实体内容:
 * 		request.getInputStream();
 */
//1)tomcat服务器接收到浏览器发送的请求数据
//2)tomcat服务器把请求数据封装成HttpServletRequest对象
//3)tomcat服务器调用doGet方法,把request对象传入servlet
(1)因为请求头中全部为键值对,
 request.getHeader("name") //表示获取键为name的值
 String value = request.getHeader("host");// 根据头名称获取头值
 System.out.println("host:"+value);
-------------------------------------------------------------------------------------------------------------------
//遍历所有头
 Enumeration<String> enums = request.getHeaderNames();// 获取所有头名称(获取所有键)
 while(enums.hasMoreElements()){
     String headerName = enums.nextElement();//把键给headerName
     String headerValue = request.getHeader(headerName);//根据键获取值
     System.out.println(headerName+":"+headerValue);
}
(2)java中读取(上一篇博客8更为详细)

InputStream in = request.getInputStream();//字节流
byte[] buf = new byte[1024];
int len = 0;
while(  (len=in.read(buf))!=-1   ){//文件还未结束
	String str = new String(buf,0,len);
	System.out.print(str);
}
(3)service方法和doXXX方法的关系?

答:  1)service方法是程序的入口。我们的代码逻辑就在这个方法被调用到。
         2)在HttpServlet的service方法源码中,根据不同请求方式调用了不同的doXX方法,所以我们在开发servlet的时候,就不需要去覆盖service方法,而是去doXX方法。因为get和post是最常用的的两种请求方式,所以只需要覆盖doGet和doPost方法即可!

3  http响应

HTTP/1.1 200 OK       --响应行

Server: Apache-Coyote/1.1   --响应头

Content-Length: 24

Date: Mon, 08 Jun 2015 01:51:04 GMT

                             --一个空行

                             -实体内容

3.1 响应行

         http协议版本

              状态码:当前服务器处理请求的状态(结果)

                            常见的状态码:

                                              200     :  请求处理完成,成功返回!        

                                               302:       需要浏览器进一步请求,才能完成。

                                               404:      浏览器端的错误。没有找到资源。

                                               500:       服务器端的错误。

              状态描述:对状态码的文字补充       

  3.2 响应头         

Location: http://www.it315.org/index.jsp   --重定向的地址。结合302状态使用完成重定向的效果

Server:apache tomcat    --服务器的类型

Content-Encoding: gzip     --服务器发送给浏览器的数据压缩格式

Content-Length: 80         --服务器发送给浏览器的数据长度

Content-Language: zh-cn    --服务器支持语言

Content-Type: text/html; charset=GB2312     --服务器发送给浏览器的数据类型和数据编码格式

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT    --服务器资源的最后修改时间

Refresh: 1;url=http://www.it315.org        ---定时刷新或每隔n秒跳转资源

Content-Disposition: attachment; filename=aaa.zip   -- 以下载方式打开资源

Transfer-Encoding: chunked           

Set-Cookie:SS=Q0=5Lb_nQ; path=/search     -- 服务器发送给浏览器的cookie数据

Expires: -1            --通知浏览器不使用缓存

Cache-Control: no-cache

Pragma: no-cache   

Connection: close/Keep-Alive    连接状态

Date: Tue, 11 Jul 2000 18:23:51 GMT   响应发出的时间

3.3 总结

/**
 *  使用HttpServletResponse修改响应数据
 *      response.setStatus(404) 设置状态码
 *      response.setHeader("name","value")  修改响应头
 *      response.getWriter().write()   以字符形式发送实体内容
 *      response.getOutputStream().write()以字节形式发送实体内容
 * 响应头依然是键值对;故修改响应头需要键与值
 *
 */
/**
 * 请求重定向(  跳转到其他页面 )
 * response.sendRedirect("/day08/adv.html");
 *原理:1.设置302状态码
 *      response.setStatus(302);
 *    2.设置location响应头
 *      response.setHeader("location", "/day08/adv.html");*/
 */
package gz.itcast.c_response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 案例【refresh】--定时刷新或每隔n秒跳转页面
 * @author 王磊
 *
 */
public class ResponseDemo3 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		//设置refresh响应头
		//设置秒数
		//response.setHeader("refresh", "2");
		//每隔n秒跳转页面
		response.getWriter().write("注册成功!3秒之后会跳转到主页");
		//设置refresh
		response.setHeader("refresh", "3;/day08/adv.html");
	}
}
//设置content-type响应,以后会经常用
		response.setHeader("content-type", "text/html;charset=utf-8");
//本节最重要的案例

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 案例【Content-Disposition】 -- attachment; filename=aaa.zip   -- 以下载方式打开资源
 *
 */
public class ResponseDemo5 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		File file = new File("e:/mm.jpg");
		/**
		 * 告诉浏览器以下载的方法打开
		 */
		response.setHeader("content-disposition", "attachment;filename="+file.getName());
		
		/**
		 * 文件下载
		 */
		//1)读取本地文件
		FileInputStream in = new FileInputStream(file);
		
		//2)写出给浏览器(字节内容)
		OutputStream out = response.getOutputStream();
		byte[] buf = new byte[1024];
		int len = 0;
		//边读边写
		while( (len=in.read(buf))!=-1  ){
			out.write(buf, 0, len);
		}
		//关闭
		in.close();
		out.close();
		
		
	}

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值