(一)Request
(0)组成
- Request
- 作用:获取浏览器发送过来的数据,比如请求的方法是GET还是POST,比如URL请求后面的参数
- 组成:请求行 请求头 请求体
- 获取请求行
- String getMethod():获取请求方式
- getRequestURI():获取部分路径比如/BasicDemo6/Login
- getRequestURL(): 获取完整路径比如http://localhost/BasicDemo6/Login
- request.getRemoteAddr(): Returns the Internet Protocol (IP) address of the client or last proxy that sent the request.
- 操作请求参数
- getParameter():比如可以用来得到表单提交的数据或者地址栏提交的数据
- getParameterMap()
- 编码问题
- 了解原理:出现乱码是因为客户端和服务器之间的编码方式不同导致的
- 对于get请求:参数追加到地址栏之后,会使用utf-8编码提交到服务器,而服务器会使用iso-8859-1进行解码
- 对于post请求:参数放在请求体中,同样服务器使用iso-8859-1进行解码
- 针对POST请求下表单乱码的问题:
request.setCharacterEncoding("utf-8");
(1)请求转发
- 将发送到一个Servlet的数据转发给另外一个Servlet
- request.getRequestDispatcher(“/servlet2”).forward(request,response);
- 重定向和请求转发的去呗
- 重定向发送两次请求,请求转发发送一次请求
- 重定向由浏览器发起,请求转发是在服务器内部进行
- 重定向是response对象的方法,请求转发是request对象的方法
(二)Response
(0)组成
- Response组成
- 响应行
- 相应头
- 相应体
- 相应行
- setStatus(int state)方法:设置HTTP请求的状态码
- 相应头Response Header
- setHeader(String key, String value):比如设置相应的编码方式以及返回方式(”text/html”)
- addHeader():添加字符串形式的响应头
- 常见的相应头:
- location 重定向
- refresh 定时刷新
- content-type
- response.sendRedirect(“/BasicDemo6/Loc2”):重定向(到另一个地址,Status Code 302)
- 相应体
(1)实现页面的跳转
- response.sendRedirect(“/BasicDemo6/Loc2”)
- 使用HTML中meta的http-equiv标签
(2)操纵相应体
- response.setContentType(“text/html;charset=UTF-8”); //避免写回HTML页面时的中文乱码
- 等价于 response.setHeader(“content-type”,”text/html;charset=UTF-8”);
(3)输出流
- 互斥的输出流
- Writer getWriter() 字符流
- ServletOutputStream getOutputStream() 字节流
(1)实现文件下载
- 文件下载:从服务器发送数据到浏览器
(1)超链接下载
- 在HTML中直接插入下载链接,使用较少
<a href="/BasicDemo6/download/headShot.png">下载这张图片</a> //直接使用资源地址进行下载
(2)编码下载
- 使用Servlet进行文件的下载
//1.得到文件的mime类型
String mimeType = context.getMimeType(文件名);
response.setContentType(mimeType);
//2.设置下载的头信息
response.setHeader("content-disposition","attachment;filename=" + fileName);
//3. 提供流
InputStream is = servletContext.getResourceAsStream("/download/" + fileName);
ServletOutputStream os = response.getOutputStream();
int len = -1;
byte[] b = new byte[1024];
while((len=is.read(b)) != -1){
os.write(b,0,len);
}
(2)动态验证码
- 使用awt库绘制验证码图片
- 鼠标点击图片会触发事件
- 修改图片的src,让每次传参不同,防止缓存不能及时刷新图片
<script>
function changeImg(obj){
obj.src="/BasicDemo6/Code?i=" + Math.random();
}
</script>
<img src="/BasicDemo6/Code" alt="验证码" onclick="changeImg(this)"/>