Request对象:
发送HTTP请求用HttpServletRequest
包含3部分:请求行,请求头,请求数据
方法:
getMethod()获得请求方式
getRequestUri()和getRequestURL() 获得客户机发送的请求资源的地址(URL是URI的子集)
getHeaders(),getHeader(),getHeader(),getDateHeader(),
getIntHeader()获取请求头
getInputStream()
getparameter()
getRemoteAddr()获得客户机IP地址
getRemoteHost()获得发出请求的客户机完整主机名
getRemotePort()获取客户机使用的端口
getLocalAddr(),getLocalName()得到服务器IP和主机名
方法很多,参考文档。。。
getHeader()应用实例:
是否以压缩方式发送给客户端
request.getHeader("Accept-Encoding").contains("gzip")
getHeaders()的应用:
Enumeration e=reqeust.getHeaders("Accept");
因为可能有多个Accept 头
getHeaderNames()获取所有的请求头名字:
Enumeration e=request.getHeaderNames();
Whiel(e.hasMoreElement()){
String name=e.nextElement();
String value=requst.getHeader(name);
syso
}
获取请求参数:(即请求时发送的数据)
第一种方式:
request.getParameter("name");
第二种方式
request.getParameterValues("name"); 请求可能带有多个值
第三种方式:
Enumeration e=request.getParameterNames(); 常用于做框架
第四种方式:
Map
Key是数据名,value为数组形式,可获取多个值的情况
用表单收集数据:
数据提交会交给 action对应的Servlet处理
单选,多个选项的 name 要一样
复选框,多个选项的name也要一样
超链接收集用户数据:
发邮件,验证有用邮箱,邮件打开时激发img 标签中的servlet,将用户的邮箱地址返回
Request常见应用:防盗链
Referer头会记录来访URL
String referer=request.getHeader("Referer");
If(referer==null||!referer.startWith("http://localhost")){
response.sendRedirect("/day06/index.jsp");
Return;
}
请求转发和请求重定向区别:参考PPT
一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。
一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。
因为请求转发是面向服务器,/代表应用,请求重定向是面向浏览器,/代表整个网站
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
请求转发:服务器将数据交个servlet 处理,servlet处理后转发给JSP显示。
this.getServletContext().getRequestDispather("/1.jsp").forward(request,response);
request.getRequestDispather("/1.jsp").forward(request,response);
前一种方式麻烦,后一种比较好。
地址不变,发送一次请求。
forward细节问题:
一个请求中的forward数据提交后,不能再次forward
Forward之前,response 不能提交数据,否则会抛异常。(forward时会清空RESPONSE)
Forward之后,写入Response 的数据不会提交, 已经转到JSP。请求结束。
但是在response 中设置头,不会清掉,依然有效
请求重定向:地址改变,2次请求2次响应
Request也是一个域
setAttribute()往request中存数据
getAttribute()获得request 中数据
RemoveAttribute()移除request中的某个数据
getAttributeNames()
Request,response 和servletContext的区别
RequestDispather的include 方法:
同一个应用的多个 页面,头和体相同,则不需要多次编写相同搞得部分,直接引入即可。(这里不是重定向,不是给浏览器用,所以/代表应用)
request.getRequestDiptcher("/header.jsp").include(request,response);//include 内部使用了getWriter()输出数据,所以下面写出数据只能用writer,因为getOutPutStream和getWriter互斥
Xxxxxxxxxxxxxxxxxxxxxxxxx
String data="jkdjka";
response.getWriter().write(data);
request.getRequestDiptcher("/body.jsp").include(request,response);
注意:如果servlet类名错误,重构后,还要在配置文件中修改名字。
java