Java 笔记十 Servlet

436 阅读7分钟

Servlet

  • 概念: 运行在服务端的小程序(服务器的连接器)

    servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则
    
  • 快速入门:

    1. 创建JavaEE项目
    2. 定义一个类,实现Servlet接口
    3. 实现接口中的抽象方法
    4. 配置Servlet,在web.xml中配置
    
  • 执行原理:

    1. 当服务器接收到客户端浏览器的请求后,会解析请求url路径,获取访问的servlet的资源路径
    2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容
    3. 如果有,则再找到对应<servlet-class>全类名
    4. tomcat会将字节码文件加载进内存,并且创建其对象
    5. 调用其方法
    
  • Servlet生命周期

    1. 被创建: 执行init方法,只执行一次
        Servlet什么时候被创建?
        1. 默认情况下,第一次被访问时,Servlet被创建
        2. 可以配置执行Servlet的创建时机
            在<servlet>标签下配置
            1. 第一次被访问时,创建
                <load-on-startup>的值为负数
            2. 在服务器启动时,创建
                <load-on-startup>的值为0或正整数
    2. 提供服务: 执行service方法,执行多次
        每次访问Servlet时,service方法都会被调用一次
        
    3. 被销毁: 执行destory方法,只执行一次
        Servlet被销毁时执行。服务器关闭时,Servlet被销毁
        只有服务器正常关闭时,才会执行destory方法
        destory方法在Servlet被销毁之前执行,一般用于释放资源
    
  • Servlet3.0

    好处: 支持注解配置。可以不需要web.xml
    步骤:
        1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
        2. 定义一个类,实现Servlet接口
        3. 重写方法
        4. 在类上使用@webServlet注解,进行配置
            @webServlet("资源路径")
    
  • IDEA与tomcat的相关配置

    1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件
        查看catalina.base路径
    2. 工作空间目录和tomcat部署的web目录
        tomcat真正访问的是tomcat部署的web项目,tomcat部署的web项目对应着工作空间项目的web目录下的所有资源
        WEB-INF目录下的资源不能被浏览器直接访问
    
  • Servlet相关配置

    1. urlpartten: servlet访问路径
        1. 一个Servlet可以定义多个访问路径: @webServlet({"/d4", "/dd4"})
        2. 路径定义规则:
            1. /xxx: 匹配路径
            2. /xxx/xxx: 多层路径,目录结构
            3. *.do: 扩展名匹配
    
  • Request 1. 请求行

         // 1. 请求方法
        String method = req.getMethod();
    
        // 2. 虚拟目录
        String contextPath = req.getContextPath();
    
        // 3. servlet目录
        String servletPath = req.getServletPath();
    
         // 4. uri,url
        String requestURI = req.getRequestURI();
        StringBuffer requestURL = req.getRequestURL();
    
        // 5. 客户端地址
        String remoteAddr = req.getRemoteAddr();
        String remoteHost = req.getRemoteHost();
    
        // 6. http协议
        String protocol = req.getProtocol();
    
        // 7. get请求参数
        String queryString = req.getQueryString();
    
    2. 请求头
        getHeader(String name): 获取请求头
    3. 获取请求体数据
        请求体: 只有Post请求方式才有请求体,在请求体中封装了Post请求的请求参数
        步骤:
            1. 获取流对象
                BufferedReader getReader(): 获取字符输入流, 只能操作字符数据
                ServletInputStream getInputStream(): 获取字节输入流,可以操作所有类型数据
            2. 再从流中拿数据
    
    1. 其他功能

      1.获取请求参数通用方式

       1. String getParameter(String name): 根据参数名称获取参数值
       2. String[] getParameterValues(String name): 根据参数名称获取参数值的数组
       3. Enumeration<String> getParameterNames(): 获取所有请求的参数名称
       4. Map<String, String[]> getParameterMap(): 获取所有参数的map集合
       中文乱码问题:
           get方式: tomcat 8 已经将get方式乱码问题解决
           post方式: 会乱码
               解决: 在获取参数前,设置request的编码request.setCharacterEncoding("utf-8")
      
      1. 请求转发

        1. 步骤:

          1. 通过request对象获取请求转发器对象: RequestDispatch getRequestDispatcher(String path)
          2. 使用RequestDispatcher对象来进行转发: forward(ServletRequest request, ServletResponse response)
        2. 特点:

          1. 浏览器地址栏路径不发生变化
          2. 只能转发到当前服务器内部资源中
          3. 转发是一次请求
      2. 共享数据

        域对象: 一个有作用范围的对象,可以在范围内共享数据

        request域: 代表一次请求的范围,一般用于请求转发的多个资源中共享数据

        方法:

         1. void setAttribute(String name, Object obj)存储数据
         2. Object getAttribute(String name): 通过键获取值
         3. void removeAttribute(String name): 通过键移除键值对
        
      3. 获取servletContext

        ServletContext getServletContext()

  • Response

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

      数据格式:

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

      功能: 设置响应消息

      1. 设置响应行
          1. 格式: HTTP/1.1 200 OK
          2. 设置状态码 setStatus(int sc)
      2. 设置响应头
          setHeader(String name, String value)
      3. 设置响应体
          1. 获取输出流
              字符输出流 PrintWrite getWrite()
              字节输出流: ServletOutputStream getOutputStream
          2. 使用输出流,将数据输出到客户端浏览器
      

      案例:

      1. 重定向: 资源跳转的方式
          代码实现:
              1. 设置状态码302
              response.setStatus(302)
              2. 设置响应头location
              response.setHeader("location", "/**/**")
              简单方式
              response.sendRedirect("/**/**")
          重定向的特点: redirect
          1. 地址栏发生变化
          2. 重定向可以访问其他站点(服务器资源)
          3. 重定向是俩次请求。不能使用request来共享数据
          转发的特点: forward
          1. 转发地址栏路径不变
          2. 转发只能访问当前服务器下的资源
          3. 转发是一次请求,可以使用request对象来共享数据
      
      1. 路径写法

        1. 相对路径: 通过相对路径不可以确定唯一资源

           找到当前资源和目标资源之间的相对位置关系
           * ./: 当前目录
           * ../: 后退一级目录
          
        2. 绝对路径: 通过绝对路径可以确定唯一资源

           判断定义的路径是给谁用的,判断请求将来从哪发出
               1. 给客户端浏览器使用: 需要加虚拟目录(项目的访问路径)
               2. 给服务器使用: 不需要加虚拟目录
               转发路径
          
      2. 服务器输出字符数据到浏览器

        步骤:

         1. 获取字符输出流
         2. 输出数据
         注意:
             乱码问题:
             1. PrintWrite pw = response.getWrite();获取流的默认编码为ISO-8859-1
             2. 设置该流的默认编码
             3. 告诉浏览器响应体使用的编码
             // 简单形式,设置编码,在获取流之前
             response.setContentType("text/html;charset=utf-8")
        
  • ServletContext对象

    1. 概念: 代表整个Web应用,可以和程序的容器(服务器)来通信
    2. 获取:
        1. 通过request对象获取
            request.getServletContext()
        2. 通过HttpServlet获取
            getServletContext()
    3. 功能
        1. 获取MIME功能
            MIME类型: 在互联网通信过程中定义的一种文件数据类型
            获取: 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)
            // web目录下资源访问
            String b = context.getRealPath("/b.txt");
            // WEB-INF目录下的资源访问
            String c = context.getRealPath("/WEB-INF/c.txt")
            // src目录下的资源访问
            context.getRealPath("/WEB-INF/Classes/a.txt")