Servlet&HTTP请求协议&Request&Response

一、Servlet

1.Servlet执行原理
  1. 当服务器接收到客户的段浏览器的请求后,会解析请求URL路径,获取访问的Servlet资源路径
  2. 查询web.xml文件,是否有对应的标签内容
  3. 如果有,则再找到对应的标签内容
  4. Tomcat会将字节码文件加载进内存,并且创建其对象
  5. 调用其方法
2.Servlet方法

(1)init():初始化方法,在Servlet被创建时执行,只会执行一次
(2)service():提供服务方法,每一次Servlet被访问时执行,执行多次
(3)destroy():销毁方法,在服务器正常关闭时执行,执行一次
*(4)servletConfig():获取servletConfig对象(Servlet的配置对象)
*(5)getServletInfo():获取Servlet的一些信息——版本、作者等

3.Servlet的生命周期
  1. 被创建:执行init方法,只执行一次
    (1)Servlet什么时候被创建?
    默认情况下,第一次访问时,Servlet被创建;
    可以配置指定Servlet的创建时机
    ——在<servlet>标签下配置:
           a. 第一次被访问时,创建<load-on-startup>的值为负数
           b. 在服务器启动时,创建<load-on-startup>的值为0或正整数
    (2)Servlet的init方法只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
    ——当多个用户同时访问时,可能存在线程安全问题
    ->解决:尽量不要在Servlet方法中定义成员变量,即使定义了成员变量也不要对其修改值
  2. 提供服务:执行service方法,执行多次
    每次访问Servlet时,service方法都会被调用一次
  3. 被销毁:执行destroy方法,只执行一次
    Servlet被销毁时执行,服务器关闭时Servlet被销毁
    只有在服务器正常关闭时,才会执行destroy方法
    destroy()在Servlet被销毁之前执行,一般用于释放资源
4.Servlet3.0注解配置

好处:支持注解配置,不需要web.xml了
步骤:1.创建JavaEE项目,选择版本3.0以上,可以不创建web.xml
           2.定义一个类,实现Servlet接口
           3.复写方法
           4.在类上使用@WebServlet注解——@WebServlet(“资源路径”)

5.Servlet的体系结构

Servlet - - 接口
      |
GenericServlet - - 抽象类
      |
HttpServlet - - 抽象类

  • GenericServlet:将Servlet接口中其他方法做了默认空实现,只将service()定义为抽象,将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
  • HttpServlet: 对http协议的一种封装,简化操作
     1.定义类继承HttpServlet
     2.复写doGet/doPost方法
6.Servlet相关配置
  1. urlpattern:Servlet访问路径
    (1)一个Servlet可以定义多个访问路径:@WebServlet({"/d4","/dd4","/ddd4"})
    (2)路径定义规则:
             a. /xxx
             b. /xxx/xxx:多层路径,路径结构
             c. *.do

二、HTTP协议

1.概念:Hyper Text Transfer Protocol超文本传输协议

传输协议: 定义了客户端和服务器端通信时,发送数据的格式
特点:
    1. 基于TCP/IP的高级协议
    2. 默认端口:80
    3. 基于请求/响应模型的:一次请求对应一次响应
    4. 无状态的:每次请求之间相互独立,不能交互数据
历史版本: (了解即可)
    1.0:每一次请求响应都会建立新的连接
    1.1:复用连接

2.请求消息数据格式

请求消息:客户端发送给服务器端的数据

  1. 请求行
    格式:请求方式  请求url  请求协议/版本
    GET    /login.html   http/1.1
    请求方式:HTTP协议中有7种请求方式,常用的有2种
            GET
                   (1)请求参数在请求行中,在url后
                   (2)请求的url长度有限制
                   (3)不太安全
            POST
                   (1)请求参数在请求体中
                   (2)请求的url长度没有限制
                   (3)相对安全
  2. 请求头
    格式:请求头名称:请求头值
    常见的请求头:
         1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
             可以在服务器端获取该头的信息,解决浏览器的兼容性问题
         2. Referer:http://localhost/login.html
             告诉服务器,我(当前请求)从哪里来
             —— 作用:a.防盗链
                                b.统计工作
  3. 请求空行
    空行,就是用于分割POST请求的请求头和请求体的
  4. 请求体(正文)
    封装POST请求消息的请求参数的

3.响应消息数据格式

响应消息:服务器端发送给客户端的数据

  1. 响应行
    组成:协议/版本  响应状态码  状态码描述
    响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
         1. 状态码都是3位数字
         2. 分类:
               (1) 1xx:服务器接收客户端消息,但没有接收完成,等待一段时间后,发送1xx多状态码
               (2) 2xx:成功。代表:200
               (3) 3xx:重定向。代表:302(重定向),304(访问缓存)
               (4) 4xx:客户端错误。代表:404(请求路径没有对应的资源),405(请求方式没有对应的doxxx方法)
               (5) 5xx:服务器端错误。代表:500(服务器内部出现异常)
  2. 响应头
    格式:头名称:值
    常见的响应头:
         1. Content-Type:服务器告诉客户端本次响应数据格式以及编码格式
         2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
    响应头的
         in-line:默认值,在当前页面打开
         attachment;filename-xxx:以附件的形式打开响应体。文件下载
  3. 响应空行
  4. 响应体:传输的数据

三、Request

1.request对象和response对象的原理

  (1)request和response对象是由服务器创建的,我们来使用它们
  (2)request对象是用来获取请求消息,response对象是用来设置响应消息

2.request对象继承体系结构

ServletRequest - - 接口
      |      继承
HttpServletRequest - - 接口
      |      实现
org.apache.catalina.connector.RequestFacade - - 类(tomcat)

3.request:获取请求消息

  1. 获取请求消息数据
      (1)获取请求行数据
                eg.GET /day01/demo1?name=zhangsan HTTP/1.1
                方法:
                        1. 获取请求方式:GET
                            String getMethod()
                        2. 获取虚拟目录:/day01
                            String getContextPath()
                        3. 获取Servlet路径:/demo1
                            String getServletPath()
                        4. 获取get方式请求参数:name=zhangsan
                            String getQueryString()
                        5. 获取请求URI:/day01/demo1
                            String getRequestURI():day01/demo1
                            StringBuffer getRequestURL():http://localhost/day01/demo1
                            URL:统一资源定位符(http://localhost/day01/demo1)
                            URI:统一资源标识符(day01/demo1)(范围更大)
                        6. 获取协议及版本:HTTP/1.1
                            String getProtocol()
                        7. 获取客户机的IP地址:
                            String getRemoteAddr()
      (2)获取请求头数据
                方法:
                        String getHeader(String name):通过请求头的名称获取请求头的值
                        Enumeration<String> getHeaderNames():通过请求头的名称获取请求头的值
      (3)获取请求体数据
                请求体:只有POST方式才有请求体, 在请求体中封装了POST请求的请求参数
                步骤:
                        1. 获取流对象
                            BufferedReader getHeader():获取字符输入流,只能操作字符数据
                            ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
                        2. 再从流对象中拿数据
  2. 其他功能:
      (1)获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
                (i) String getParameter(String name):根据参数名称获取参数值   username=zhangsan&password=123456
                (ii) String[] getParameterValues(String name):根据参数名称获取参数值的数组   hobby=xx&hobby=game
                (iii) Enumeration<String> getParameterNames():获取所有请求的参数名称
                (iiii) Map<String,String[]> getParameterMap():获取所有参数的map集合
      (2)请求转发:一种在服务器内部的资源跳转方式
                (i) 步骤:
                        a. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
                        b. 通过RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
                (ii) 特点: (面试题,记住)
                        a. 浏览器地址栏路径不发生变化
                        b. 只能转发到当前服务器内部资源中
                        c. 转发是一次请求
      (3)共享数据
                域对象:一个有作用范围的对象,可以在范围内共享数据
                request域:代表一次请求范围,一般用于请求转发的多个资源中共享数据
                方法:
                        a. void setAttribute(String name,Object obj):存储数据
                        b. Object getAttribute(String name):通过键获取值
                        c. void removeAttribute(String name):通过键移除键值对
      (4)获取ServletContext
                ServletContext getServletContext()

         中文乱码问题:
                get方式:Tomcat 8 已经将get方式乱码问题解决了
                post方式:会乱码——解决:在获取参数前,设置request的编码(request.setCharacterEncoding(“utf-8”))

四、Response

Response对象:获取响应消息数据

  1. 功能
      (1)设置响应行
                a. 格式:HTTP/1.1 200 ok
                b. 设置状态码:setStatus(int sc)
      (2)设置响应头:setHeader(String name,String value)
      (3)设置响应体:
               使用步骤:
                       a. 获取输出流:
                           字符输出流:PrintWriter getWriter()
                           字节输出流:ServletOutputStream getOutputStream()
                       b. 使用输出流,将数据输出到客户端浏览器
  2. 其他功能
      (1)完成重定向:资源跳转的方式
                a. 代码实现
                      i. 设置状态码为302:response.setStatus(302);
                      ii. 设置响应头location:response.setHeader(“location”,"/day02/responseDemo");

                      iii. 简单的重定向方法:response.sendRedirect("/day02/responseDemo");
                b. 重定向的特点
                      1. 地址栏发生变化
                      2. 重定向可以访问其他站点(服务器的资源)
                      3. 重定向是两次请求,不能使用request对象来共享数据
                c. 路径写法:
                      1. 相对路径:通过相对路径不可以确定唯一资源
                      规则:找到当前资源和目标资源之间的相对位置关系
                      2. 绝对路径:通过绝对路径可以确定唯一资源
                      规则:判断定义的路径是给谁用的?判断请求从哪儿发出
                                 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)——建议虚拟目录动态获取:request.getContextPath()
                                 给服务器使用:不需要加虚拟目录
      (2)服务器输出字符数据到浏览器
                a. 步骤:1.获取字符输出流;2.输出数据
                b. 注意:乱码问题——
                    i. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8895-1
                    ii. 设置该流的默认编码
                    iii. 告诉浏览器响应体使用的编码

                      简单的形式,设置编码,是在获取流之前设置
                      response.setContentType(“text/html;charset=utf-8”)
      (3)服务器输出字节数据到浏览器
                步骤:
                    i. 获取字节输出流
                    ii. 输出数据
      (4)验证码
                1. 本质:图片
                2. 目的:防止恶意表单注册

ServletContext对象

  1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信
  2. 获取:
      (1)通过request对象获取——request.getServletContext();
      (2)通过HTTPServlet获取——this.getServletContext();
  3. 功能:
      (1)获取MIME类型
               MIME类型:在互联网通信过程中的一种文件数据类型
               MIME格式:大类型/小类型 text/html image/jpeg
               获取:String getMimeType(String file)
      (2)域对象:共享数据
               a. setAttribute(String name,Object value)
               b. getAttribute(String name)
               c. removeAttribute(String name)
               ServletContext对象范围:所有用户所有请求的数据
      (3)获取文件的真实(服务器)路径
               方法:String getRealPath(String path)
                         String b = context.getRealPath("/b.txt"); // web目录下的资源访问
                         String b = context.getRealPath("/WEB_INF/c.txt"); // WEB-INF目录下的资源访问
                         String b = context.getRealPath("/a.txt"); // src目录下的资源访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值