java基础——HttpServletResponse和HttpServletRequest

来源:互联网 发布:针织开衫淘宝 编辑:程序博客网 时间:2024/05/29 18:54

HttpServletResponse:

1HttpServletResponse(请求)

      常用的API:

           setStatus设置响应状态码

           setHeader设置响应头信息

           getWriter获得响应体字符输出流

      getWriter和getOutputStream生成内容是Http协议响应体,不能够生成状态行和头信息

ServletResponse接口不提供与协议相关的API,HttpServletResponse是面向协议的,提供协议相关的API,HttpServletResponse实现类不再JavaEE API中,实现类由服务器提供,在反生请求时,由服务器构造Resquest和Response对象,resquest和Response实现类在tomcat源码中

2302+Location完成请求重定向

addHeader用于一个key多个value情况,在原有值上添加新值

setHeader用于一个key一个value情况,用新的value覆盖之前的value

应用:用户登陆时,用户名和密码错误,重定向回登陆页面,登陆页面有提交用户名和密码,登陆处理Servlet程序,判断用户名和密码是否正确,如果正确显示,则登陆成功,否则重定向登陆页面

方法:response.setstatus(302);

      response.setHeader(”Location”,”/day6/response/demo2.html”(重定向页面))

以上两行代码就可以实现重定向,也就是让页面跳转到自定义的页面上,这两行代码可以由一条代码来实现,就是通过sendRedirect方法

      response.sendRedict(“/day6/response/demo2.html”);

3refresh完成自动刷新页面

refresh格式:时间(秒);url=跳转页面路径

例:response.setHeader(“refresh”,”5;url=/day06/hello.html”);===>>生成响应头信息中

HTML中有meta标签,可以产生Http响应头信息相同的效果

<meta http-equiv=”Content-type”content=”text/html”;charset=UTF-8>

http-equiv:响应头信息name

content:响应头信息value

例:<metahttp-equiv="refresh" content="5;url=/day6/hello.html"/>  生成响应体中

读秒JavaScript效果

      vari = 5;

      functioninit(){

           document.getElementById("mytimes").innerHTML= i;

           //每隔1秒重复调用 init方法 i--

           i--;

           //通过window 内置对象 setTimeOut 完成每隔1秒重复调用

           window.setTimeout("init();",1000);

      }

4、设置三个Http头信息禁用浏览器缓存

Cache-Control : no-cache

Pragma : no-cache

Expires: Thu, 01 Dec 1994 16:00:00 GMT (非常特殊,转换特定日期格式才可以)

有些动态页面,每次访问内容都不同--->>但是如果浏览器缓存页面,则无法查看最近内容

存放缓存文件夹:工具—>internet选项—>设置—>查看文件

response.setHeader(“Cache-Control”,”no-cache”);

response.setHeader("Pragma","no-cache");

response.setDateHeader("Expires",-1);

5、生成Http响应体内容

getWriter     getOutputStream

响应是一个数据文件 ---- 设置文件MIME类型,与文件字符集

setContentType 设置文件MIME类型

setCharacterEncoding 设置字符集

* 设置字符集代码 必须要位于getWriter/ getOutputStream 之前

setCharacterEncoding 设置响应内容编码集,无法通知浏览器用哪种编码查看该页面

需要通知浏览器查看编码类型response.setContentType("text/html;charset=utf-8");

response.setContentType 指定charset 具备对响应编码功能,完全取代 setCharacterEncoding

注意问题

1)、文件复制时 getOutputStream , 手动生成响应内容时 getWriter

2)、getOutputStream和getWriter相互排斥不能同时使用

3)、getOutputStream和getWriter生成响应体内容,不能改变状态行和头信息的

4)、tomcat服务器会自动调用response输出流 close方法,调用close时自动flush缓冲区内容

6response生成验证码图片

为什么需要验证码? 防止程序恶意攻击

弧度 2PI弧度 = 360角度

点击图片切换验证码 使用JavaScript 代码 ---- 重新载入图片

document.getElementById("myimg").src="/day6/response7"; ---- 加载本地缓存图片

解决1 :禁用response7 程序缓存

// 禁止浏览器缓存 验证码图片

response.setHeader("cache-control","no-cache");

response.setHeader("pragma","no-cache");

response.setDateHeader("expires",-1);

解决2 : 重新载入response7 程序路径每次都不同

document.getElementById("myimg").src="/day6/response7?"+new Date().getTime();

HttpServletRequest

1、获得客户机常用信息

      getMethod请求方式

      getProtocol协议

      getRequestURI和 getRequestURL 获得请求资源路径

      getRemoteAddr获得客户机IP地址  (::1IPV6地址)

      *将 127.0.0.1 localhost 加入本机 hosts文件

      getContextPath获得工程虚拟目录名称

URIURL区别

URI:/day6/request1

URL:http://localhost/day6/request1

URI范围比URL大,http://localhost/day6/request1URL也是 URI /day6/request1 是URI 不是 URL

思考:

如何获得当前请求 访问资源路径? 服务器网站内部路径

uri : /day6/request1

contextpath : /day6

request.getRequestURI().substring(request.getContextPath().length());--> /request1

2、获得请求头信息

getHeader(name) 获得指定头信息

防止盗链案例 referer

User-Agent 客户端浏览器类型 (文件下载)

MSIE IE浏览器

Firefox 火狐浏览器

Chrome google浏览器

 

3、获得请求参数

GET方式请求,参数位于请求行中

POST方式请求,参数位于请求体中

getParameter(name) 根据参数名称获得参数值 (一个值)

getParameterValues(name)  根据参数名称获得参数值 (多个值) -------- 结合checkbox 一起使用

getParameterNames() 获得所有参数名称

getParameterMap() 将参数name和value 保存到一个map中,返回map

乱码问题解决:

POST请求乱码request.setCharacterEncoding("utf-8");

GET请求乱码

解决方案一:修改server.xml

   <Connector port="80" protocol="HTTP/1.1"

              connectionTimeout="20000"

               redirectPort="8443"URIEncoding="utf-8"/>

* 必须有修改tomcat服务器配置文件权限,不建议使用

解决方案二:逆向编解码

username = URLEncoder.encode(username,"ISO-8859-1");

username = URLDecoder.decode(username,"utf-8");

简化

username = newString(username.getBytes("ISO-8859-1"),"utf-8");

非空有效校验

if (username != null &&username.trim().length() > 0) {

      System.out.println("username有效");

}else{

  // username 无效

}

URL编码和解码

1) 浏览器提交一次请求,请求中中文字符,自动进行URL编码 (由浏览器完成)

2) web服务器接收到内容之后,自动URL解码

URLEncoder 完成URL编码 , URLDecoder 完成URL解码

 

服务器端接收请求,请求url :http://localhost/day6/request3?name=aaa+bbb

问题:在服务器端执行request.getParameter("name"); 值 aaa bbb

4、请求转发传递数据

请求转发forward 和 请求重定向redirect 区别 ???

1) 转发一次请求 一次响应; 重定向两次请求 两次响应

2) 转发URL地址 不变,重定向URL地址改变第二个资源地址

3) 转发只能转发给同一个网站内部资源,重定向可以定向到任何网站

4) 转发中 / 属于服务器内部路径 不写工程名,重定向/ 来自客户端必须要写工程名

最佳应用:Servlet处理数据得到数据处理结果,通过请求转发,将处理结果传递JSP显示 , Servlet处理数据获得结果,JSP负责数据显示

request.setAttribute传递数据,必须要结合request.getRequestDispatcher().forward 转发一起使用!!!

写路径诀窍(独家秘方):

先写斜杠,问斜杠给谁用,是给浏览器还是给web应用用的

若是给浏览器就是代表localhost

若是给web工程用的就是代表web跟目录

0 0
原创粉丝点击