一、response
ServletResponse -- 最基本的response对象,提供了一个响应对象应该具有的最基本的功能
|
|-HttpServletResponse 针对于HTTP协议进行了增强提供了很多和HTTP协议相关的属性和方法

1.向浏览器输出一段数据--乱码问题
response.getOutputStream();
response.getWriter();

2.实现文件下载
URL编码:URLEncoder URLDEcoder
美:1000 1100 1110
%2C%3d%4e
女:0111 0011 0001
%5a%6b%71


%2C%3d%4e%5a%6b%71

3.实现定时刷新
利用<meta>可以用来模拟HTTP响应头的功能


4.控制浏览器是否缓存资源
Expires
Cache-Control
Pragma


可以利用这三个头明确的通知浏览器是否缓存资源
可以指定不缓存资源,这时无论浏览器是什么样的缓存机制都不会缓存发送过去的数据了
可以指定缓存资源,并且可以指定缓存的时间,这样无论浏览器是什么样的缓存机制都会缓存发送过去的数据,并且缓存到指定的时间,在指定的时间到来之前,这个缓存一直存在,多次开关浏览器后都能使用这个缓存
5.请求重定向
response.setState(302);
response.setHeader("Location","...");


response.sendRedirect("...");




**重点细节:
response.getWriter()和response.getOutputStream()这两个方法是互斥的,一旦调用了其中一个就不能再去调用另外一个
response.getWriter()和response.getOutputStream()拿到的流在service方法结束后服务器会检查是否关闭过,如果没有关闭过则会帮我们关闭,所以推荐大家平时自己就不用关这俩流

~6.验证码

二、request
ServletRequest -- 通用的请求对象定义了一个请求应该具有的最基本的方法
|
|--HttpServletRequest -- 针对于HTTP协议进行了增强增加和很多和HTTP协议相关的属性和方法


1.获取客户机信息
getRequestURL方法返回客户端发出请求完整URL
!!getRequestURI方法返回请求行中的资源名部分
getQueryString 方法返回请求行中的参数部分
!!getRemoteAddr方法返回发出请求的客户机的IP地址
!!getMethod得到客户机请求方式
!!getContextPath 获得当前web应用虚拟目录名称


2.获取请求头信息
getHeader(name)方法 --- String
getHeaders(String name)方法 --- Enumeration<String>
getHeaderNames方法 --- Enumeration<String>


getIntHeader(name)方法 --- int
getDateHeader(name)方法 --- long(日期对应毫秒)

*利用referer头防盗链
3.获取请求参数
String getParameter(String)
String [] getParameterValues(String)
Map<String,String[]> getParameterMap()


*乱码问题:
浏览器以什么编码打开表单页面就用什么编码发送提交的数据
而服务器如果不指定默认使用iso8859-1来解码请求参数,此时如果发送的编码和打开的编码不同必然乱码

可以设置request.setCharacterEncoding设置服务器以什么编码打开数据,以此解决乱码问题,但是这个方法只对请求中的实体内容起作用,所以只能解决POST提交的乱码问题

如果和解决GET提交的乱码呢?只能手动的编解码来解决乱码
String username = request.getParameter("username");//有乱码
byte [] bs =username.getBytes("iso8859-1");//反响查回二进制
username = new String(bs,"utf-8")//再使用正确的码表进行解码就可以了


4.利用请求域传递对象
request本身也是一个域对象

作用范围:整个请求链
生命周期:一次请求开始,创建代表请求的request对象,request域开始.一次请求结束,销毁request对象request域销毁
作用:在整个请求链中共享数据


*通常我们在Servlet中处理好数据后,存入request域再请求转发到jsp页面进行显示,从而实现servlet做处理jsp做显示,各自做各自最擅长的事情


setAttribute()
getAttribute()
removeAttribute()




请求参数:浏览器提交的请求参数数据 parameter
request.getParameter()
request.getParameterValues()
request.getParameterMap()


初始化参数:在web.xml中为Servlet或整个web应用配置的初始化信息参数 initparameter
ServletConfig.getInitParamter()
ServletConfig.getInitParamterNames()
ServletContext.getInitParamter()
ServletContext.getInitParamterNames()

域属性:在四大作用于保存的属性信息 attribute
setAttribute
getAttribute
removeAttribute


5.request实现请求转发
ServletContext.getRequestDispatcher("").forward(request,response);
request.getRequestDispatcher("").froward(request,response);

!转发和重定向的区别,什么时候用转发什么时候重定向
~转发和重定向都是资源跳转的方式,
~但是原理不同,重定向基于HTTP协议的302+Location进行,转发是服务器内部资源跳转
~转发一次请求一次响应,重定向两次请求两次响应
~转发地址栏不变,重定向地址栏发生变化
~转发后request域中属性会仍然存在,重定向后由于是新的request找不到之前的域属性
~~如果需要在资源跳转时利用request域带一些属性过去,必须用请求转发
~~如果明确需要在资源跳转后地址栏想要发生变化必须用重定向
~~如果既不需要利用request域带属性也不需要改变地址栏,这是重定向和转发都可以,但是推荐使用转发,因为转发可以减少对服务器的请求次数,减少服务器的压力
!转发细节:
~如果在请求转发之前已经有数据被打给了浏览器那么转发将会失败会抛出异常
~如果在调用forward之前向response缓冲区中写入了内容,只要写入到其中的内容还没有真的被输出到客户端,forward方法就可以正常执行,但原来写入到缓冲区中的数据将被清空,注意只是实体内容被清空,之前写入的响应头信息仍然存在。
~在一个Servlet中多次转发也是不行的
~但是连续转发是可以的
~转发就像是在程序调用,转发之后的代码仍然会执行,如果不想执行需要做return
~!!总之一句话,请求转发最终只能由一个Servlet对外输出数据,试图在一个请求中利用转发让多个Servlet输出数据是不行的



6.请求包含
ServletContext.getRequestDispatcher("").include(request,response);
request.getRequestDispatcher("").include(request,response)
请求包含:将源组件和目标组件的输出进行合并后再输出


!被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略




三、路径专题
相对路径和绝对路径和硬盘路径
绝对路径:以/开头的路径叫做绝对路径,在计算路径时,在一个参考路径上直接拼接给定的绝对路径得到路径
相对路径:不以/开头的路径叫相对路径,在计算路径时,相对于当前位置计算一个新的路径
硬盘路径:以盘符开头的路径叫硬盘路径

虚拟路径 -- 请写绝对路径,如果路径是给浏览器用的请将web应用名称写上,如果路径是给服务器用的web名称一定不要写
request.getRequestDispatcher("/index.jsp").forward();
ServletContext.getRequestDIspatcher("/index.jsp");
response.setHeader("Location","/Day04/index.jsp")
response.sendRedirect("/Day04/index.jsp");
response.setHeader("refresh","3;url=/Day04/index.jsp")
<a href="/Day04/...."></a>
<img src="/Day04/..."/>
<form action="/Day04/...">

真实路径 -- 相对路径 根据原理具体分析应该相对于哪个目录写路径
File file = new File("");//--相对于程序的启动目录
new FileInputStream("");//--相对于程序的启动目录
servletContext.getRealPath("");//--相对于当前web应用的目录
ClassLoader.getResource("");//--相对于类加载的目录