第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的更多相关文章

  1. Web大前端面试题-Day10

    1. px和em的区别? px和em都是长度单位; 区别是: px的值是固定的,指定是多少就是多少, 计算比较容易. em得值不是固定的,并且em会继承父级元素的字体大小. 浏览器的默认字体高都是16 ...

  2. day10(java web之request&respone&访问路径&编码问题)

    day10 请求响应流程图 response response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletR ...

  3. 撩课-Web大前端每天5道面试题-Day10

    1. px和em的区别? px和em都是长度单位; 区别是: px的值是固定的,指定是多少就是多少, 计算比较容易. em得值不是固定的,并且em会继承父级元素的字体大小. 浏览器的默认字体高都是16 ...

  4. [译]36 Days of Web Testing(二)

    Day 7: Http 和 Https Why? 当在网络上传输一些私人,敏感信息时,应该采用加密的手段来保证这些信息在传输的过程中不被侦测到.Https协议正是这种实现机制. Https是一种广泛使 ...

  5. servlet(二):Servlet的web.xml配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  6. Python线程和协程-day10

    写在前面 上课第10天,打卡: 感谢Egon老师细致入微的讲解,的确有学到东西! 一.线程 1.关于线程的补充 线程:就是一条流水线的执行过程,一条流水线必须属于一个车间: 那这个车间的运行过程就是一 ...

  7. robotframework·WEB端基础

    date:2018526 day10 一.导入库 导入的库分两种,一种是导入常用库,如String.Collections等(Library String.Collections,再运用库中的关键字) ...

  8. 学习日常笔记<day10>servlet编程

    1 如何开发一个Servlet 1.1 步骤: 1)编写java类,继承HttpServlet类 2)重新doGet和doPost方法 3)Servlet程序交给tomcat服务器运行!! 3.1 s ...

  9. servlet得到web应用路径

    package context; import java.io.IOException; import javax.servlet.ServletContext; import javax.servl ...

  10. web笔记全

    1.项目流程与数据库 1.课程体系 阶段1(服务器开发): 项目导入/数据库/JS基础/NodeJS 阶段2(前端核心技术): HTML/AJAX/CSS/bootstrap 阶段3(前端进阶技术): ...

随机推荐

  1. 有关JVM处理Java数组方法的思考

    在Java中,获取数组的长度和String的长度是两种不同的方法,这引起了本文作者的一番思考.本文从JVM的角度,探讨了Java数组在JVM中是什么对象,有哪些成员,以及声明方法. 作者:jarfie ...

  2. 使用/\_ 打印正三角形 C/C++

    输入size,level,使用/\_,打印正三角形 #include<stdio.h> int main() { int level, size; printf("Enter l ...

  3. 如何在angularjs里面选择一个按钮而不改变其他按钮的颜色

    var selectJson = { "background-color": "#FF0000", /* Green */ "border" ...

  4. 谁说delphi没有IOCP库,delphi新的IOCP类库,开源中: DIOCP组件JSON流模块说明

    单元:JSonStream.pas 简介:本单元实现 流和json对象的相互转换,其中有一些保留的key. 依赖:superobject 保留key: __result.errCode  返回的错误编 ...

  5. 什么是DevOps?DevOps简明教程

    我希望每个测试人员经过..功能测试-接口测试-安全测试-自动化测试-性能测试的洗礼后 都可以进入DevOps阶段.具体什么以及为什么 我稍后会给你大家讲解...

  6. java 多态的深入理解

    简单来说 : 多态 能够很好的解决代码耦合性的问题 考虑这样一个场景 有个人 买了辆捷达汽车 .这个系统应该如何设计呢? public class JettaCar { public void run ...

  7. Emacs, Nano, or Vim 编辑器“三剑客”

    # Vim 强大,多种模式相互切换,不同于传统“录入式“写东西 对后续两个编辑器不熟悉 # nano 退出ctrl + x http://man.linuxde.net/nano # emacs ht ...

  8. one or more

    想到以后如果一直都是这样,那么以后的生活是多么多么可怕啊. 感觉毫无期盼.没有意义. 如果变得理所当然那是多么多么让人害怕的事,吓得让人发抖. 所以在以后漫长的岁月里,还是一个人吧 如果相互看不惯,感 ...

  9. HTML and CSS学习概述

    一·Web浏览器是一个连接到Web服务器,向Web服务器请求信息,然后解析返回来的HTML标记,并将其显示在浏览器窗口内的程序.1.Microsoft 2.Internet Explorer(IE)3 ...

  10. extjs如何使用

    刚学ExtJs 不知道如何使用.. 我的操作步骤如下: 1. 在项目中导入ExtJs 2. 创建了一个one.js 和 helloworld.html 3. one.js中的代码如下: Ext.Mes ...