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