HttpServletRequest 和HttpServletResponse

本文深入讲解Servlet技术,包括Servlet生命周期、编程步骤、HttpServletResponse与HttpServletRequest的使用技巧。涵盖响应重定向、自动刷新、禁用缓存、生成文件及验证码图片等实战案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中 ,实现类由服务器提供,在请求发生时,由服务器构造RequestResponse对象
* requestresponse 实现类 在tomcat源码中
1302 + 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.
2refresh完成自动刷新页面
refresh 格式: 时间();url=跳转页面路径
例如: response.setHeader("refresh", "5;url=/day6/hello.html"); === 生成响应头信息中
HTMLmeta标签,可以产生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)getOutputStreamgetWriter相互排斥不能同时使用
3)getOutputStreamgetWriter生成响应体内容,不能改变状态行和头信息的
4)tomcat服务器会自动调用response输出流 close方法,调用close时自动flush缓冲区内容
*** 生成XML练习
5response生成验证码图片
为什么需要验证码? 防止程序恶意攻击
弧度 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 获得工程虚拟目录名称
URIURL区别 ?
URI/day6/request1
URLhttp://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() 将参数namevalue 保存到一个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 转发一起使用!!!
RequestDispatcherinclude 最常用场景就是网页布局
* 页面显示 主要由JSP技术完成,RequestDispatcher.include 很少会使用
* JSP中提供 <%@include%> <jsp:include> 完全实现页面包含效果
request执行forward操作 或者 response执行redirect操作时,清除response缓冲区 !!!!
* 效果只有转发和重定向的最后一个资源 生成响应内容会显示在浏览器上
==================================================================================================
内容小结:
1response核心API setStatus setHeader getWriter getOutputStream
2、登陆错误重定向案例 *
3refresh自动刷新 *
4、禁用浏览器缓存 三句代码必须要回写 *
5Servlet生成任何类型文件 XML文件生成、验证码图片生成 *  ----- 验证码图片生成可以不会写,必须会改
6request.getRemoteAddr 获取ip地址 、 request.getRequestURI().substring(request.getContextPath().length());
7referer防止盗链、user-agent获得浏览器类型
8request获取请求参数,解决乱码问题 ***
9request转发传递数据 *
10、转发和重定向区别 (面试题)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值