A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-5-23 15:01 编辑

day13-Tomcat与Servlet入门


### 【HTTP的协议的概述】

协议:

​    \* 什么是协议:规定双方需要遵守的规则.

HTTP协议:

​    * HTTP协议的作用:规范浏览器和服务器之间的数据传递

HTTP协议的特点:

​    \* 基于请求和响应的模型.

       * 必须先有请求后有响应.

        * 请求和响应必须成对出现.

        * 默认的端口号是80.

HTTP协议的版本:

​    * 1.0   :每次响应后即刻关闭了连接.

​    * 1.1   :现在使用.不是每次响应后挂断,等待长时间以后没有请求会挂断.

###【HTTP协议的详解】

**请求部分**

​    ***** **请求行**

            * 提交方式:

                        * 提交方式有很多,常用的GET和POST:

                        * GET和POST的区别:

                            * GET的提交的参数会显示到地址栏上,而POST不显示.

                           * GET往往是有大小限制的,而POST没有大小的限制.

                           * GET没有请求体,而POST有请求体.

          * 提交路径:

           * 协议版本:

***** **请求头**

        * 都是键值对的形式显示的.一般一个key对应一个value,也有个别的是一个key对应多个value.

        * User-Agent             :代表浏览器的类型. --- 文件下载:下载中文文件:IE使用URLEncodor进行编码,而Firefox使用Base64编码.

            * Referer                :代表的是网页的来源.--- 防盗链.

       * If-Modified-Since      :通常与响应中的头Last-Modified一起使用查找本地缓存.

***** **请求体**

​        * 就是POST提交方式的提交的参数

**响应部分**

***** **响应行:**

​    * 协议版本

* 状态码

  * 200    :成功
  * 302    :重定向
  * 304    :查找本地缓存
  * 404    :资源不存在
  * 500    :服务器内部错误

* 状态码描述

* **响应头:键值对,一般一个key对应一个value,也有一个key对应多个value.**

  * Last-Modified              :与请求中的If-Modified-Since一起使用查找本地缓存.


  * Content-Dispostion     :文件下载的使用使用的一个头信息.


  * Location                       :重定向的跳转的路径.
  * Refresh                     :定时刷新 / 定时跳转

* **响应体:显示浏览器的页面的内容**

###【Servlet的概述】

* 什么是Servlet:
  * 就是一个运行在WEB服务器上的小的Java程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议.
  * Servlet就是SUN公司提供的一个动态网页开发技术.
* Servlet的作用:用来处理从客户端浏览器发送的请求,并且可以对请求作出响应
* 使用Servlet:
  * 编写一个类实现Servlet接口.
  * 将编写的这个类配置到服务器中

```html
* 配置:
  <!-- 配置Servlet -->
  <servlet>
      <!-- Servlet的名称 -->
      <servlet-name>test1</servlet-name>
      <!-- SErvlet的全路径 -->
      <servlet-class>com.itheima.a_servlet.ServletDemo1</servlet-class>
  </servlet>
  
  <!-- Servlet的映射 -->
  <servlet-mapping>
      <!-- Servlet的名称 -->
      <servlet-name>test1</servlet-name>
      <!-- Servlet的访问路径 -->
      <url-pattern>/ServletDemo1</url-pattern>
  </servlet-mapping>

* 访问:
http://localhost:8080/day09/ServletDemo1
```

###【使用ServletRequest接收参数】

* String getParameter(Stringname);       ---用于接收一个名称对应一个值的数据.
* String[]getParameterValues(String name);---用于接收一个名称对应多个值的数据.
*  Map getParameterMap();                    ---用于接收表单中的所有的数据,Map的key是表单提交的参数名称,Map的value是提交参数的值.
* Enumeration getParameterNames()                  ---用于获取表单中提交的所有的参数的名称

### 【Servlet的实现的关系】

```html
Servlet            :接口
   |
GenericServlet    :通用的Servlet
   |
HttpServlet        :HttpServlet
* 编写一个类继承HttpServlet,重写doGet和doPost方法.
* 配置
```

###Servlet的生命周期

```tex
* 生命周期:就是一个对象从创建到销毁的过程.
* Servlet生命周期:Servlet从创建到销毁的过程.
    * 何时创建:用户第一次访问Servlet创建Servlet的实例
    * 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.
* 用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.
```

### Servlet的相关的配置:

**【启动时创建Servlet】**

​    Servlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置:

​    在web.xml中在< servlet > < /servlet>标签中配置:

​    *< load-on-startup>2< /load-on-startup>  --- 传入正整数,整数越小,被创建的优先级就越高.

**【url-pattern的配置】**

​    url-pattern配置方式共有三种:

​        1.完全路径匹配    :以 / 开始   例如:    /ServletDemo4, /aaa/ServletDemo5 /aaa/bbb/ServletDemo6

​        2.目录匹配       :以 / 开始需要以 * 结束. 例如: /* ,/aaa/* ,/aaa/bbb/*

​        3.扩展名匹配     :不能以 / 开始 以 * 开始的. 例如: *.do , *.action *

​        * 错误的写法  : /*.do

如果访问地址:

<http://localhost:8080/day09/ServletDemo4>        :第一个

<http://localhost:8080/day09/aaa.do>              :第二个

***** 完全路径匹配 > 目录匹配 > 扩展名匹配

### 开发中的路径的编写

相对路径:都是需要找位置相对关系.不能以 / 开始的.

​    * ./ 当前路径  ../上一级目录

​    * 使用相对路径访问:

​    * <http://localhost:8080/day09/demo4-url/demo1.html>

​    * http://localhost:8080/day09/ServletDemo6

绝对路径:不需要找位置相对关系. 以 / 开始的.

​    * 绝对路径中分为客户端路径和服务器端路径:

​    * 客户端路径一定要加工程名.     /day09/ServletDemo6

​        * 服务器端路径不需要加工程名 . /ServletDemo6

**【response中设置响应头】**

​    * addHeader(String name,String value);        --- 针对一个key对应多个value的响应头.

​    addDateHeader(String name,long date);

​    addIntHeader(String name,int value);

​    *** setHeader(Stringname,String value);      ---** **针对一个key对应一个value的响应头.**

​    *** setDateHeader(String name,long date);**

​    *** setIntHeader(String name,int value);**

**【ServletContext对象】**

​    ServletContext对象存取数据,存的数据都是有一定的作用的范围的.这种对象称为是域对象

用来存取数据:

​    void setAttribute(String name, Onject object)

用来向ServletContext中存入数据

​    object getAttribute(String name)

用来从ServletContext中获取数据.

​    void romove Attribute(String name)

**用来从ServletContext中移除数据.**


ServletContext:重要

* ServletContext的作用:
  * 1.用来获得全局初始化参数.
  * 2.用来获得文件的MIME的类型.
  * **3.作为域对象存取数据.**
* **ServletContext是一个域对象.**
  * **作用范围:整个web工程.**
  * **创建:服务器启动的时候,tomcat服务器为每个web项目创建一个单独ServletContext对象**.
  * **销毁:服务器关闭的时候,或者项目从服务器中移除的时候.**
* **4.用来读取web项目下的文件.**
  * **getResourceAsStream(Stringpath);**
  * **getRealPath(Stringpath);**


### 【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");相当于上面两句**

### 【文件下载】

一种:超链接方式.(不推荐)

​    * < ahref=”aa.zip”>下载</a>

​    * < ahref=”1.jpg”>下载</a>

二种:手动编码方式完成文件下载.

       * 设置两个头和一个流:   

​        *Content-Type:文件MIME的类型.

        *Content-Dispostion:

      * 文件的输入流:

### 中文文件名下载

```html
中文文件在不同的浏览器中编码方式不同:
IE            :URL编码
Firefox        :Base64编码

if(agent.contains("Firefox")){
            // 火狐浏览器
            filename = base64EncodeFileName(filename);
        }else{
            // IE,其他浏览器
            filename = URLEncoder.encode(filename, "UTF-8");
        }
```

### 【请求对象-request对象】

​     getMethod();           ---获得请求方式.

​    * getQueryString();     ---获得请求路径后的参数.

​    * getRemoteAddr();      ---获得客户机的IP地址.

​    * getRequestURI();      ---获得请求的路径

​    * getRequestURL();      ---获得请求的路径

​    * getContextPath();     ---获得工程名

### 转发和重定向的区别

​    【重定向】

​        response.sendRedirect(String path); -- 完成重定向

​    【转发】

​        request.getRequestDispatcher(Stringpath).forward(request,response);

​    【区别】

​        1.转发的地址栏不变的.重定向的地址栏发生变化的.

​        2.转发是一次请求一次响应,重定向是两次请求两次响应.

​        3.request域对象存取的值在转发中是有效的,在重定向无效的.

​        4.转发的路径不需要加工程名

​    **重定向的路径需要加工程名**

​        使用request域保存一个值:在一次请求范围内有效的.

​        登录失败就可以保存一个错误信息到request中在动态页面中取出这个值${msg}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马