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、转发和重定向区别 (面试题)