HttpServletRequest 和HttpServletResponse

Servlet 生命周期
init(ServletConfig) service(ServletRequest,ServletResponse) destroy
Servlet 编程步骤:
1、编写 class 继承 HttpServlet
2 、覆盖 doGet doPost
3 、配置 web.xml 进行注册
doGet(HttpServletRequest req, HttpServletResponse resp)
doPost(HttpServletRequest req, HttpServletResponse resp)
一、 HttpServletResponse
常用 API
setStatus 设置响应状态码
setHeader 设置响应头信息
getWriter 获得响应体字符输出流
getOutputStream 获得响应体字节输出流
* getWriter getOutputStream 生成内容 是 Http 协议响应体,不能够生成状态行和头信息
ServletResponse 接口不提供与协议相关 API HttpServletResponse 面向 Http 协议 ,提供协议相关 API
HttpServletResponse 实现类不在 JavaEE API 中 ,实现类由服务器提供,在请求发生时,由服务器构造 Request Response 对象
* request response 实现类 在 tomcat 源码中
1 302 + Location 完成请求重定向
addHeader 用于 一个 key 多个 value 情况 ------- key:value,value,value ... 在原有值添加新值
setHeader 用于 一个 key 一个 value 情况 ------- 用新的 value 覆盖 之前 value
案例:用户登陆时,用户名密码错误,重定向回登陆页面
登陆页面,提交用户名和密码
登陆处理 Servlet 程序,判断用户名和密码是否正确,如果正确显示 登陆成功,否则重定向登陆页面
response.setStatus(302);
response.setHeader("Location", "/day6/response/demo2.html");
以上两行代码可以简化,通过 sendRedirect 方法
response.sendRedict("/day6/response/demo2.html");
void
[url=]sendRedirect[/url](java.lang.String location)
          Sends a temporary redirect response to the client using the specified redirect location URL and clears the buffer.
2 refresh 完成自动刷新页面
refresh 格式: 时间 ( );url= 跳转页面路径
例如: response.setHeader("refresh", "5;url=/day6/hello.html"); === 生成响应头信息中
HTML meta 标签,可以产生 Http 响应头信息相同效果
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
http-equiv 响应头信息 name
content 响应头信息 value
例如: <meta http-equiv="refresh" content="5;url=/day6/hello.html" /> === 生成响应体中
读秒 JavaScript 效果
        var i = 5;
        function init(){
                document.getElementById("mytimes").innerHTML = i;
                // 每隔 1 秒重复调用 init 方法 i--
                i--;
                // 通过 window 内置对象 setTimeOut 完成每隔 1 秒重复调用
                window.setTimeout("init();", 1000);
        }
3 、设置三个 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);
4 、生成 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 缓冲区内容
*** 生成 XML 练习
5 response 生成验证码图片
为什么需要验证码? 防止程序恶意攻击
弧度 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 地址   (::1 IPV6 地址 )
* 127.0.0.1 localhost 加入本机 hosts 文件
getContextPath 获得工程虚拟目录名称
URI URL 区别 ?
URI /day6/request1
URL http://localhost/day6/request1
URI 范围比 URL 大, http://localhost/day6/request1 URL 也是 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 = new String(username.getBytes("ISO-8859-1"),"utf-8");
结论:能用 post 时 不用 get ---- form 提交都用 post
<a href="url?name= 中国 "> ---- 手动处理 get
非空有效校验
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) 转发中 / 属于服务器内部路径 不写工程名,重定向 / 来自客户端必须要写工程名
创建 RequestServlet4 RequestServlet5
* 使两个 Servlet 连续执行
1) 重定向
2) 转发
最佳应用: Servlet 处理数据得到数据处理结果,通过请求转发,将处理结果传递 JSP 显示
* Servlet 处理数据获得结果, JSP 负责数据显示
request.setAttribute 传递数据,必须要结合 request.getRequestDispatcher().forward 转发一起使用!!!
RequestDispatcher include 最常用场景就是网页布局
* 页面显示 主要由 JSP 技术完成, RequestDispatcher.include 很少会使用
* JSP 中提供 <%@include%> <jsp:include> 完全实现页面包含效果
request 执行 forward 操作 或者 response 执行 redirect 操作时,清除 response 缓冲区 !!!!
* 效果只有转发和重定向的最后一个资源 生成响应内容会显示在浏览器上
==================================================================================================
内容小结:
1 response 核心 API setStatus setHeader getWriter getOutputStream
2 、登陆错误重定向案例 *
3 refresh 自动刷新 *
4 、禁用浏览器缓存 三句代码必须要回写 *
5 Servlet 生成任何类型文件 XML 文件生成、验证码图片生成 *  ----- 验证码图片生成可以不会写,必须会改
6 request.getRemoteAddr 获取 ip 地址 、 request.getRequestURI().substring(request.getContextPath().length());
7 referer 防止盗链、 user-agent 获得浏览器类型
8 request 获取请求参数,解决乱码问题 ***
9 request 转发传递数据 *
10 、转发和重定向区别 (面试题)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值