怎们自己做网站,网站建设管理理论,高雅不俗气的公司名字,win2003建网站今日内容
1. HTTP协议#xff1a;响应消息
2. Response对象
3. ServletContext对象HTTP协议#xff1a;
1. 请求消息#xff1a;客户端发送给服务器端的数据* 数据格式#xff1a;1. 请求行2. 请求头3. 请求空行4. 请求体
2. 响应消息#xff1a;服务器端发送给客户端的…今日内容
1. HTTP协议响应消息
2. Response对象
3. ServletContext对象HTTP协议
1. 请求消息客户端发送给服务器端的数据* 数据格式1. 请求行2. 请求头3. 请求空行4. 请求体
2. 响应消息服务器端发送给客户端的数据* 数据格式1. 响应行1. 组成协议/版本 响应状态码 状态码描述2. 响应状态码服务器告诉客户端浏览器本次请求和响应的一个状态。1. 状态码都是3位数字 2. 分类1. 1xx服务器就收客户端消息但没有接受完成等待一段时间后发送1xx多状态码2. 2xx成功。代表2003. 3xx重定向。代表302(重定向)304(访问缓存)4. 4xx客户端错误。* 代表* 404请求路径没有对应的资源 * 405请求方式没有对应的doXxx方法5. 5xx服务器端错误。代表500(服务器内部出现异常)2. 响应头1. 格式头名称 值2. 常见的响应头1. Content-Type服务器告诉客户端本次响应体数据格式以及编码格式2. Content-disposition服务器告诉客户端以什么格式打开响应体数据* 值* in-line:默认值,在当前页面内打开* attachment;filenamexxx以附件形式打开响应体。文件下载3. 响应空行4. 响应体:传输的数据* 响应字符串格式HTTP/1.1 200 OKContent-Type: text/html;charsetUTF-8Content-Length: 101Date: Wed, 06 Jun 2018 07:08:42 GMThtmlheadtitle$Title$/title/headbodyhello , response/body/htmlResponse对象
* 功能设置响应消息1. 设置响应行1. 格式HTTP/1.1 200 ok2. 设置状态码setStatus(int sc) 2. 设置响应头setHeader(String name, String value) 3. 设置响应体* 使用步骤1. 获取输出流* 字符输出流PrintWriter getWriter()* 字节输出流ServletOutputStream getOutputStream()2. 使用输出流将数据输出到客户端浏览器* 案例1. 完成重定向* 重定向资源跳转的方式* 代码实现//1. 设置状态码为302response.setStatus(302);//2.设置响应头locationresponse.setHeader(location,/day15/responseDemo2);//简单的重定向方法response.sendRedirect(/day15/responseDemo2);* 重定向的特点:redirect1. 地址栏发生变化2. 重定向可以访问其他站点(服务器)的资源3. 重定向是两次请求。不能使用request对象来共享数据* 转发的特点forward1. 转发地址栏路径不变2. 转发只能访问当前服务器下的资源3. 转发是一次请求可以使用request对象来共享数据* forward 和 redirect 区别* 路径写法1. 路径分类1. 相对路径通过相对路径不可以确定唯一资源* 如./index.html* 不以/开头以.开头路径* 规则找到当前资源和目标资源之间的相对位置关系* ./当前目录* ../:后退一级目录2. 绝对路径通过绝对路径可以确定唯一资源* 如http://localhost/day15/responseDemo2 /day15/responseDemo2* 以/开头的路径* 规则判断定义的路径是给谁用的判断请求将来从哪儿发出* 给客户端浏览器使用需要加虚拟目录(项目的访问路径)* 建议虚拟目录动态获取request.getContextPath()* a , form 重定向...* 给服务器使用不需要加虚拟目录* 转发路径2. 服务器输出字符数据到浏览器* 步骤1. 获取字符输出流2. 输出数据* 注意* 乱码问题1. PrintWriter pw response.getWriter();获取的流的默认编码是ISO-8859-12. 设置该流的默认编码3. 告诉浏览器响应体使用的编码//简单的形式设置编码是在获取流之前设置response.setContentType(text/html;charsetutf-8);3. 服务器输出字节数据到浏览器* 步骤1. 获取字节输出流2. 输出数据4. 验证码1. 本质图片2. 目的防止恶意表单注册随机生成验证码图片输出到浏览器页面上的案例 package cn.web.servlet;import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;/*** 重定向*/
WebServlet(/checkCodeServlet)
public class CheckCodeServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {int width 100;int height 50;// 1.创建一个对象在内存中画图验证码图片对象BufferedImage image new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);// 2.美化图片// 2.1 填充背景色Graphics g image.getGraphics();// 画笔对象g.setColor(Color.pink); // 设置画笔颜色g.fillRect(0,0,width,height); // 填充一个矩形// 2.2 画边框g.setColor(Color.blue);g.drawRect(0,0,width-1,height-1);String str ABCDEFGHIJKLMNOPQRETUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;// 生成随机下标Random random new Random();for (int i 1; i 4; i) {int index random.nextInt(str.length());// 获取字符char c str.charAt(index); // 根据下标取出随机字符// 2.3 写验证码g.drawString(c,width/5*i,height/2);}// 2.4 画干扰线g.setColor(Color.green);// 随机生成坐标点for (int i 0; i 10; i) {int x1 random.nextInt(width);int x2 random.nextInt(width);int y1 random.nextInt(height);int y2 random.nextInt(height);g.drawLine(x1,y1,x2,y2);}// 3.将图片输出到页面展示ImageIO.write(image,jpg,response.getOutputStream());}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
} !DOCTYPE html
html langen
headmeta charsetUTF-8titleregister/titlescript/*分析点击超链接或者图片需要换一张图片1. 给超链接和图片绑定点击事件2. 重新设置图片的src属性值*/window.onload function () {// 1.获取图片对象var img document.getElementById(checkCode);var a document.getElementById(change);// 2.绑定单击事件img.onclick function () {// 加时间戳 因为浏览器会自动缓存同一个路径请求的图片通过改变请求路径给路径后面加上参数来实现var date new Date().getTime();img.src /day15/checkCodeServlet? date}a.onclick function () {// 加时间戳 因为浏览器会自动缓存同一个路径请求的图片通过改变请求路径给路径后面加上参数来实现var date new Date().getTime();img.src /day15/checkCodeServlet? date}}/script
/head
bodyimg src/day15/checkCodeServlet idcheckCode/a href# idchange看不清换一张/a/body
/htmlServletContext对象
1. 概念代表整个web应用可以和程序的容器(服务器)来通信
2. 获取1. 通过request对象获取request.getServletContext();2. 通过HttpServlet获取this.getServletContext();
3. 功能1. 获取MIME类型* MIME类型:在互联网通信过程中定义的一种文件数据类型* 格式 大类型/小类型 text/html image/jpeg* 获取String getMimeType(String file) 2. 域对象共享数据1. setAttribute(String name,Object value)2. getAttribute(String name)3. removeAttribute(String name)* ServletContext对象范围所有用户所有请求的数据3. 获取文件的真实(服务器)路径1. 方法String getRealPath(String path) String b context.getRealPath(/b.txt);//web目录下资源访问System.out.println(b);String c context.getRealPath(/WEB-INF/c.txt);//WEB-INF目录下的资源访问System.out.println(c);String a context.getRealPath(/WEB-INF/classes/a.txt);//src目录下的资源访问System.out.println(a);案例
* 文件下载需求1. 页面显示超链接2. 点击超链接后弹出下载提示框3. 完成图片文件下载* 分析1. 超链接指向的资源如果能够被浏览器解析则在浏览器中展示如果不能解析则弹出下载提示框。不满足需求2. 任何资源都必须弹出下载提示框3. 使用响应头设置资源的打开方式* content-disposition:attachment;filenamexxx* 步骤1. 定义页面编辑超链接href属性指向Servlet传递资源名称filename2. 定义Servlet1. 获取文件名称2. 使用字节输入流加载文件进内存3. 指定response的响应头 content-disposition:attachment;filenamexxx4. 将数据写出到response输出流文件目录结构
download.html文件
!DOCTYPE html
html langen
headmeta charsetUTF-8titledownload/title
/head
bodya href./img/1.jpg图片1/aa href./img/3.avi视频/ahra href/day15/downloadServlet?filename1.jpg图片1/aa href/day15/downloadServlet?filename3.avi视频/a/body
/htmlDownloadServlet.java文件
package cn.web.download;import cn.web.utils.DownLoadUtils;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;WebServlet(/downloadServlet)
public class DownloadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1.获取请求参数文件名称String filename request.getParameter(filename);// 2.使用字节输入流加载文件进内存// 2.1 找到文件服务器路径ServletContext servletContext this.getServletContext();String realPath servletContext.getRealPath(/img/ filename);// 2.2 用字节流关联FileInputStream fileInputStream new FileInputStream(realPath);// 3.设置response的响应头// 3.1 设置响应头类型 content-typeString mimeType servletContext.getMimeType(filename);response.setHeader(content-type,mimeType);// 解决中文文件名问题// 1. 获取user-agent请求头String agent request.getHeader(user-agent);// 2. 使用工具类方法编码文件名即可filename DownLoadUtils.getFileName(agent, filename);// 3.2 设置响应头打开方式 content-dispositionresponse.setHeader(content-disposition,attachment;filenamefilename);// 4.将输入流的数据写出到输出流中ServletOutputStream outputStream response.getOutputStream();byte[] buff new byte[1024*8];int len0;while ((len fileInputStream.read(buff)) ! -1){outputStream.write(buff,0,len);}fileInputStream.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}
工具类 DownLoadUtils.java文件
package cn.web.utils;import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;public class DownLoadUtils {public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {if (agent.contains(MSIE)) {// IE浏览器filename URLEncoder.encode(filename, utf-8);filename filename.replace(, );} else if (agent.contains(Firefox)) {// 火狐浏览器BASE64Encoder base64Encoder new BASE64Encoder();filename ?utf-8?B? base64Encoder.encode(filename.getBytes(utf-8)) ?;} else {// 其它浏览器filename URLEncoder.encode(filename, utf-8);}return filename;}
}
* 问题* 中文文件问题* 解决思路1. 获取客户端使用的浏览器版本信息2. 根据不同的版本信息设置filename的编码方式不// 解决中文文件名问题// 1. 获取user-agent请求头String agent request.getHeader(user-agent);// 2. 使用工具类方法编码文件名即可filename DownLoadUtils.getFileName(agent, filename);