web-day10
第10章WEB10-requet&response篇
今日任务
- 登录系统后完成文件下载
- 商城系统注册功能.
教学导航
教学目标 |
掌握response设置响应头 掌握response重定向和转发的区别 掌握request接收请求参数 掌握request域的作用范围 |
教学方法 |
案例驱动法 |
1.1 上次课内容回顾:
HTTP协议:
* HTTP协议请求部分:
* 请求行 :请求方式 请求路径 协议版本
* 请求头 :一个key对应一个value ,也有一个key对应多个value
* Referer,User-Agent,If-Modified-Since
* 请求体 :POST方式的参数.
* HTTP协议响应部分:
* 响应行 :协议版本 状态码 状态码描述
* 状态码:200 302 304 404 500
* 响应头 :一个key对应一个value ,也有一个key对应多个value
* Location,Refresh,Last-Modified,禁用本地缓存,Content-Dispostion
* 响应体 :显示到页面的内容.
Servlet:服务器端程序.
* 编写Servlet:
* 编写一个类,实现Servlet接口.继承GenericServlet,HttpServlet.
* 配置Servlet.在web.xml中配置Servlet
* Servlet的执行原理:
* Servlet的生命周期:
* 第一次访问Servlet的时候,服务器创建一个Servlet的对象.init方法就会执行.任何一次请求服务器都会创建一个新的线程执行service方法.service的方法内部根据请求方式调用doXXX方法.当服务器关闭的时候,servlet就会被销毁.destroy方法就会执行.
* Servlet的接口实现关系:
* Servlet的登录的案例:
* 页面提交Servlet
* 获得请求参数:request.getParameter();
* 封装请求参数:
* 调用业务层类:
* 根据处理结果作出响应:
* 页面定时刷新:
* ServletConfig对象:(了解)
* ServletContext对象:(重要)-被多个用户共享.
* 记录网站被登录的次数.
* 在服务器启动的时候ServletContext就会被创建.一个WEB项目创建一个ServletContext对象.
在服务器关闭的时候销毁.域对象-存的数据有作用范围.
* 功能:
* 1.获得文件的MIME的类型.
* 2.获得全局初始化参数.
* 3.存取数据-作为域对象来使用.
* setAttribute(String name,String value);
* getAttribute(String name);
* removeAttribute(String name);
* 4.读取WEB项目的文件:
* getResourceAsStream(String path);
* getRealPath(String path);
1.2 案例一:完成登录用户对他提供文件的下载的功能.
1.2.1 需求:
之前的案例中已经完成的了一个登录的功能,登录失败后回到登录页面.登录成功以后,服务器提供多个文件的下载的链接,点击链接可以完成文件的下载的功能.
1.2.2 分析:
1.2.2.1 技术分析:
【响应对象-Response对象】
- 响应行:
Response设置状态码:
- 响应头:
Response设置响应头:
* 一个key对应一个value
* 一个key对应多个value
- 响应体:
Response设置响应体:
【response处理中文乱码】
- 字节流:
设置浏览器默认打开编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
中文转成字节数组编码
response.getOutputStream().write("王守义".getBytes("UTF-8"));
- 字符流:
设置response的缓冲区的编码
response.setCharacterEncoding("UTF-8");
设置浏览器默认打开的编码.
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");相当于上面两句
【文件下载】
一种:超链接方式.(不推荐)
* <a href=”aa.zip”>下载</a>
* <a href=”1.jpg”>下载</a>
二种:手动编码方式完成文件下载.
* 设置两个头和一个流:
* Content-Type:文件MIME的类型.
* Content-Dispostion:
* 文件的输入流:
1.2.2.2 步骤分析:
- 之前的登录案例已经存在:
- 登录成功跳转的页面上提供一组链接:
- 当点击下载的链接之后,提交到Servlet:
- 设置两个头和一个流:
1.2.3 代码实现:
1.在页面中提供一组下载的链接:
response.getWriter().println("<h2>手动编码方式下载</h2>");
response.getWriter().println("<a href='/WEB10/downloadServlet?filename=a.bmp'>a.bmp</a><br/>");
response.getWriter().println("<a href='/WEB10/downloadServlet?filename=WEB01.zip'>WEB01.zip</a>");
2.编写DownloadServlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 接收参数:
* 设置两个头和一个流:
* 文件输入流和响应的输出流对接:
*/
// 接收参数:get乱码 new String("中文".getBytes("ISO-8859-1"),"UTF-8");
String filename = request.getParameter("filename");
System.out.println(filename);
// 设置两个头和一个流:
// 设置Content-Type头
String fileType = this.getServletContext().getMimeType(filename);
response.setContentType(fileType);
// 设置Content-Disposition:
response.setHeader("Content-Disposition", "attachment;filename="+filename);
// 设置文件的输入流:
String path = this.getServletContext().getRealPath("/download/"+filename); //
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!=-1){
os.write(b, 0, len);
}
is.close();
}
1.2.4 总结:
1.2.4.1 中文文件名下载:
中文文件在不同的浏览器中编码方式不同:
IE :URL编码
Firefox :Base64编码
if(agent.contains("Firefox")){
// 火狐浏览器
filename = base64EncodeFileName(filename);
}else{
// IE,其他浏览器
filename = URLEncoder.encode(filename, "UTF-8");
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
1.3 案例二:网站的注册的功能的实现:
1.3.1 需求:
在商城的网站上完成一个注册的功能:
1.3.2 分析:
1.3.2.1 技术分析
【请求对象-request对象】
- 获得客户机信息:
* getMethod(); ---获得请求方式.
* getQueryString(); ---获得请求路径后的参数.
* getRemoteAddr(); ---获得客户机的IP地址.
* getRequestURI(); ---获得请求的路径
* getRequestURL(); ---获得请求的路径
* getContextPath(); ---获得工程名
- 获得请求头
* request.getHeader(“User-Agent”);
* request.getHeader(“Referer”);
- 请求参数:
- 用来作为域对象存取值:
1.3.2.2 步骤分析:
- 步骤一:设计注册页面:
- 步骤二:点击页面中的注册的按钮:提交到Servlet中.
- 步骤三:在Servlet中接收参数:
- 步骤四:封装实体中.
- 步骤五:调用业务层.处理数据.
- 步骤六:根据处理的结果做出响应.
1.3.3 代码实现:
1.创建数据库
create database web10;
use web10;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
email varchar(20),
name varchar(20),
sex varchar(10),
birthday date,
hobby varchar(50)
);
2.接收参数:
* request.getParameter(String name);
* request.getParameterValues(String name);
* request.getParamaterMap();
3.参数接收中的乱码处理.
POST乱码处理:
* <form method=”post”>的时候,这种提交才是POST提交.其他的都是get.
* POST方式提交的参数在请求体中.request对象在后台接收参数.request对象有缓存区.默认缓冲区的编码ISO-8859-1.
* 处理方式:设置request的缓冲区的编码.
* request.setCharacterEncoding(“UTF-8”);
GET方式乱码处理:
* GET方式提交的参数会在地址栏上显示 在请求行的路径后面.浏览器就会对路径进行一次编码.将编码后内容取出来.再进行一次编码.
* 处理方式:
* 修改服务器提交的编码.
* 采用URLEncoder 和 URLDecoder类对中文进行编码和解码.
* 使用String类的构造方法:
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(username);
4.数据的封装:BeanUtils.(内省技术)
1.3.4 总结:
1.3.4.1 转发和重定向的区别:
【重定向】
response.sendRedirect(String path); -- 完成重定向
【转发】
request.getRequestDispatcher(String path).forward(request,response);
【区别】
1.转发的地址栏不变的.重定向的地址栏发生变化的.
2.转发是一次请求一次响应,重定向是两次请求两次响应.
3.request域对象存取的值在转发中是有效的,在重定向无效的.
4.转发的路径不需要加工程名.重定向的路径需要加工程名.
1.3.4.2 使用转发和重定向对登录的功能优化:
使用request域保存一个值:在一次请求范围内有效的.
登录失败就可以保存一个错误信息到request中在动态页面中取出这个值${msg}
web-day10的更多相关文章
- Web大前端面试题-Day10
1. px和em的区别? px和em都是长度单位; 区别是: px的值是固定的,指定是多少就是多少, 计算比较容易. em得值不是固定的,并且em会继承父级元素的字体大小. 浏览器的默认字体高都是16 ...
- day10(java web之request&respone&访问路径&编码问题)
day10 请求响应流程图 response response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletR ...
- 撩课-Web大前端每天5道面试题-Day10
1. px和em的区别? px和em都是长度单位; 区别是: px的值是固定的,指定是多少就是多少, 计算比较容易. em得值不是固定的,并且em会继承父级元素的字体大小. 浏览器的默认字体高都是16 ...
- [译]36 Days of Web Testing(二)
Day 7: Http 和 Https Why? 当在网络上传输一些私人,敏感信息时,应该采用加密的手段来保证这些信息在传输的过程中不被侦测到.Https协议正是这种实现机制. Https是一种广泛使 ...
- servlet(二):Servlet的web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...
- Python线程和协程-day10
写在前面 上课第10天,打卡: 感谢Egon老师细致入微的讲解,的确有学到东西! 一.线程 1.关于线程的补充 线程:就是一条流水线的执行过程,一条流水线必须属于一个车间: 那这个车间的运行过程就是一 ...
- robotframework·WEB端基础
date:2018526 day10 一.导入库 导入的库分两种,一种是导入常用库,如String.Collections等(Library String.Collections,再运用库中的关键字) ...
- 学习日常笔记<day10>servlet编程
1 如何开发一个Servlet 1.1 步骤: 1)编写java类,继承HttpServlet类 2)重新doGet和doPost方法 3)Servlet程序交给tomcat服务器运行!! 3.1 s ...
- servlet得到web应用路径
package context; import java.io.IOException; import javax.servlet.ServletContext; import javax.servl ...
- web笔记全
1.项目流程与数据库 1.课程体系 阶段1(服务器开发): 项目导入/数据库/JS基础/NodeJS 阶段2(前端核心技术): HTML/AJAX/CSS/bootstrap 阶段3(前端进阶技术): ...
随机推荐
- Jenkins+Jmeter+Ant自动化集成及邮件正文以html输出
一.工具的安装与环境变量配置 1.依次安装Jenkins+Jmeter+Ant,具体安装步骤,此文不再详述 2.配置Jmeter&ant环境变量 Jmeter变量: 验证是否配置成功:cmd窗 ...
- otool
一.简介 二.实例 1)查看动态链接库 otool -L /usr/bin/vim
- js 逻辑运算符
两个逻辑运算符的操作顺序在自己的脑海里一直理不清,用js做了个实验 <script type="text/javascript"> if(false && ...
- 解决loadrunner录制页面的乱码问题
以下亲自验证了的:好用. 三步解决loadrunner录制页面的乱码问题 第一步:去lr 的vugen的Tools -> Recoding Options -> Advanced ...
- iOS.Library.Architecture
在用file查看library的architechture时有以下输出: $ file WebPWebP: Mach-O universal binary with 3 architecturesWe ...
- UIButton 设置图片文字垂直居中排列
#pragma mark 按钮图片文字垂直居中排列 -(void)setButtonContentCenter:(UIButton *)button { CGSize imgViewSize,titl ...
- nodejs TLS 只加密,未授权,进一步完善
const tls = require('tls'); const fs = require('fs'); const options = { key: fs.readFileSync('my_key ...
- C++ 的虚析构函数
当一个基类的指针指向一个派生类的对象,并用该基类的指针去删除或者析构派生类对象时,如果基类的析构函数不是声明为虚函数,那么在析构时基类的析构函数将会被直接调用,派生类的析构函数应为没被调用而导致内存泄 ...
- include 指令和 include 动作引入 jsp 页面时中文乱码
include指令:<%@ include file="new.jsp" %> include动作:<jsp:include page="new.jsp ...
- 存储过程和函数 PROCEDURE & FUNCTION
SQL语句执行的时候,要首先编译,然后在被执行.在大型数据库系统中,为了提高效率,将为了完成特定功能的SQL语句集进行编译优化后,存储在数据库服务器中,用户通过指定存储过程的名字来调用执行. 具体而言 ...