Servlet--基本二(请求对象,文件下载)

请求对象
1. 获取请求行数据
getMethod()获取请求方式
getContextPath()获取虚拟目录
2. 获取请求头数据
getHeader(请求头)  获取指定的请求头中的数据
3. 获取请求体数据
必须是post请求才可以
	getReader() 通过请求对象获取字符流对象(可以操作浏览器传过来的文本数据)
	getInputStream()通过请求对象获取字节流对象(可以操作浏览器传过来的所有数据)
4. 获取表单提交的数据
常用方法
	request.getParameter(name属性的值) 获取表单提交的数据(根据参数的名称获取参数的值)
	request.getParameterValues(name属性的值) 根据参数的名称获取参数的值的数组(复选框)
	request.getParameterMap();获取表单提交数据的map集合
	
封装方式
	手动封装,适合少量的数据
	反射封装,几乎不用
	工具类封装,常用(BeanUtils)
	
post请求乱码问题
	根源
		前后编码不一致
			表单提交数据:UTF-8
			服务器接收到数据并转成字符串,用的默认是ISO-8859-1(不支持中文)
		
	解决
		request.setCharacterEncoding("utf-8");	
5. 域对象临时存储数据
范围
	时间范围:一次请求开始到结束
	空间范围:当前的请求中
	
方法
	setAttribute()
	getAttribute()
	removeAttribute()
6. 实现请求转发和包含
目的
	一个资源需要多个servlet协同处理,就可以使用请求转发或者包含
	
步骤
	首先获取请求的分发器
		RequestDispatcher r = request.getRequestDispatcher("/路径");
	转发
		r.forward(request,response);
	包含
		r.include(request,response);
		
特点
	浏览器的地址不会发生改变
	转发 对于源组件为"留头不留体",目标组件为"留体不留头"(头:请求头 体:请求体, 作为了解)
	包含 对于源组件为"留头又留体",目标组件为"留体不留头"(头:请求头 体:请求体, 作为了解)
	本质都是一次请求,共享了请求和响应对象	
		
案例改进
	如果登录成功,转发到SuccessServlet,并且把用户名带过去
响应对象
1. 设置响应行
void setStatus(int sc)  设置状态码

常见的状态码描述
1XX:浏览器发送的请求不完善,需要浏览器进一步补充资料
2XX:响应正常完成
3XX:本次请求已经完成,但是需要浏览器进一步操作 
4XX:请求资源错误 404:资源找不到  405:请求方式没有对应的方法
5XX:服务器范的错
2. 设置响应头
通用的方法
	setHeader()
	
可以设置不同的头,来实现不同的功能
	1,设置缓存时间
		response.setDateHeader("Expires",0) 不缓存页面
		
	2,设置定时刷新(定时跳转)
		设置Refresh头
			response.setHeader("Refresh","3")每3秒刷新一次(当前页面) 炒股,直播
			response.setHeader("Refresh","3;url=路径")3秒之后跳转到指定页面
			
	3,实现重定向(立即跳转)
		设置location头
			response.setHeader("location","路径"); response.setStatus(302)
			简化写法 response.sendRedirect("路径")
			
		和转发的区别
			请求响应的次数
				转发:一次请求,一次响应
				重定向:两次请求,两次响应
			浏览器的地址
				转发:地址栏保持初值不变
				重定向:改为重定向之后的地址
			作用范围
				转发:只能在同一个项目中
				重定向:可以定位到其他项目或者其他服务器
			url的路径
				转发:不需要加上虚拟目录
				重定向:需要加上虚拟目录
			变量的作用域
				转发:可以使用request域对象可以共享数据
				重定向:因为重新发了一个请求,不能用request域对象可以共享数据
			各自的优点
				转发:相对的高效,可以共享同一个请求对象,可以隐藏实际的链接地址
				重定向:能够访问其他项目或者服务器上的资源
		
		
	4,实现文件下载
3. 设置响应体
response.getOutputStream()获取字节流对象,用于在页面中展示音视频,图片等
response.getWriter().获取字符流对象,用于在页面中展示文本数据

根源:前后编码不一致
	服务器发送数据:UTF-8
	浏览器接收数据并解析:GBK(中文的IE浏览器)
	
解决:response.setContentType("text/html;charset=UTF-8");
	告诉浏览器,我会以utf-8的编码去发送数据,将来浏览器接收到数据之后就会使用utf-8的格式去解码
4. 文件下载
两个头
	content-type : 文件类型/流的类型
	content-disposition: attachment 以附件的形式下载
两个流
	读服务器上的图片 输入流
	把图片数据写到浏览器 输出流
一对接
	循环读写
5. 路径问题
相对路径
	不以/开头(相同的部分去掉)
        http://localhost:8080/login.html 访问登录页面
        http://localhost:8080/LoginServlet 访问LoginServlet

        跳转路径:LoginServlet(相当于他俩在同一个目录)


        http://localhost:8080/user/login.html 访问登录页面
        http://localhost:8080/LoginServlet    访问LoginServlet

        跳转路径:../LoginServlet(LoginServlet相当于在login.html的上一层)
        
     不建议使用相对路径,总是要确定他俩的相对位置,比较麻烦
		
绝对路径
	以/开头(省略了协议和ip和端口号)
		/LoginServlet(前面省略了http://localhost:8080)
	
	研究什么时候需要加上虚拟目录
		给客户端使用(从客户端跳到服务器端)
			需要加上虚拟目录(超链接,form表单,img标签的src属性,重定向,刷新)
		给服务器端使用(在当前项目内跳转)
			不需要加上虚拟目录(请求转发,包含)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值