尚硅谷-JavaWeb Day5 Servlet

1. Servlet 技术

  ① 是 JavaEE 规范之一(规范就是接口)

  ② JavaWeb 三大组件之一;(Servlet程序、Filter过滤器、Listener监听器)

  ③ 是运行在服务器上的一个 java 小程序,可以接收客户端发过来的请求,并响应数据给客户端

2. 实现 Servlet 程序

  ① 编写一个类去实现 Servlet 接口

  ② 实现 service 方法,处理请求,并响应数据

    service 方法:专门用来处理请求和响应的;

  ③ 在 web.xml 中配置 Servlet 程序的访问地址

    <servlet> 标签:    

      • 添加<servlet> 标签给 Tomcat 配置 servlet 程序;
      • <servlet> 的 <servlet-name> 标签:给 Servlet 程序起一个别名(一般是类名);
      • <servlet> 的 <servlet-class> 标签:是 Servlet 程序的全类名;

    <servlet-mapping> 标签

      • 给 Servlet 程序配置访问地址;
      • <servlet-name> 标签:告诉服务器,当前配置的地址给哪个 Servlet 程序使用;
      • <url-pattern> 标签:配置访问地址;

    <url-pattern> 标签(<url-pattern>/hello</url-pattern>)  

      • /:在服务器解析的时候,表示地址为 http://ip:port/工程路径
      • /hello:表示访问地址为 http://ip:port/工程路径/hello
      • 工程路径的更改见上面

3. Servlet 的生命周期

  • 执行 Servlet 构造器方法(只有在第一次访问的时候,创建 Servlet 程序会调用;)
  • 执行 init 初始化方法(只有在第一次访问的时候,创建 Servlet 程序会调用;)
  • 执行 service 方法(每次访问都会调用)
  • 执行 destroy 方法(只有 web 工程停止时会调用)

4. 通过继承 HttpServlet 实现 Servlet 程序

  一般在实际项目开发中,都使用继承 HttpServlet 类的方式去实现 Servlet 程序

  • 编写一个类去继承 HttpServlet 类
  • 根据业务需要重写 doGet() 和 doPost() 方法
  • 到 web.xml 中的配置 Servlet 程序的访问地址

5. (推荐)可以在 项目结构—Facet 界面—勾选左下角源根—返回右击新建 Servlet;

  注:不要勾选 Create Java EE 6 + annotated class

6. 整个 Servlet 类的继承体系

  Interface Servlet:Servlet 接口,只是负责定义 Servlet 程序的访问规范

  Class GenericServlet:实现Servlet接口并做了空实现,有ServletConfig类的引用,并对ServletConfig的使用做一些方法;

  Class HttpServlet:HttpServlet抽取类实现了 service() 方法,并实现了请求的分发处理

  自定义的Servlet程序:根据业务需要重写 doGet() 或 doPost() 方法

7. ServletConfig 类(Servlet 配置信息类)

  Servlet 程序和ServletConfig类都是由 Tomcat 创建,我们负责使用;

  Servlet 程序默认第一次访问的时候创建,ServletConfig是每个 Servlet 程序创建时,就创建一个对应的ServletConfig 对象;

  三大作用:

    • 可以获取 Servlet 程序的别名 servlet-name 的值(servletConfig.getServletName())
    • 获取初始化参数 init-param(配置文件下,是键值对)(servletConfig.getInitParameter(String param))
    • 获取 ServletContext 对象(servletConfig.getServletContext())

8. ServletContext 类

  ServletContext 类介绍

    • 是一个接口,表示 Servlet 上下文对象
    • 一个 web 工程,只有一个 ServletContext 实例
    • ServletContext 对象是一个域对象(可以像Map一样存取数据的对象,这里的域指存取数据的操作范围(整个web))

  ServletContext 类四个作用

    • 获取 web.xml 中配置的上下文参数 context-paramter(getServletConfig.getServletContext())
    • 获取当前的工程路径,格式:/工程路径(Context.getContextPath())
    • 获取工程部署后在服务器硬盘上的绝对路径(Context.getRealPath("/"))
    • 像 Map 一样存取数据(context.serAttribute(key, value),context.getAttribute(key))

9. Http协议

  ① get 请求

    请求行:(1)请求的方式 get();(2)请求的资源路径[+?+请求参数];(3)请求的协议的版本号(HTTP/1.1)

    请求头:key:value 组成,不同的键值对表示不同含义,包含以下几个点:

      • Accept:告诉服务器客户端可以接收的数据类型
      • Accept-Language:告诉服务器客户端可以接受的语言类型(zh_CN、en_US)
      • User-Agent:浏览器的信息
      • Accept-Encoding:告诉服务器客户端可以接收的数据编码(压缩)格式Host:表示请求的服务器ip和端口号
      • Connection:告诉服务器请求连接如何处理(Keep-Alive保持一段时间连接后关闭、Closed马上关闭)

  ② post 请求

    请求行:(1)请求的方式 post();(2)请求的资源路径[+?+请求参数];(3)请求的协议的版本号(HTTP/1.1)

    请求头:key:value 组成,不同的键值对表示不同含义,包含以下几个点

                 空行

    请求体: 

      • Accept:告诉服务器客户端可以接收的数据类型
      • Accept-Language:告诉服务器客户端可以接受的语言类型(zh_CN、en_US)
      • Referer:表示请求发起时,浏览器地址栏中的地址(从哪来)
      • User-Agent:浏览器的信息
      • Content-Type:表示发送的数据类型
      • Content-Length:表示发送的数据长度
      • Cache-Control:表示如何空值缓存 no-cache 不缓存

       Content-Type 可以分为两种:

        application/x-www-form-urlencoded:数据格式(name=value&name=..),然后对其url编码(把非英文->%xx%xx);

        multipart/form-data:表示以多端的形式提交数据给服务器(流的形式提交,用于上传)

  ③ get请求和post请求

    get请求:form 标签 method = get,a 标签,link 标签引入 css,Script 标签引入 js 文件,

         img 标签引入图片,iframe 引入 html 界面,浏览器地址栏敲回车等等

    post请求:form标签 method = post

  ④ 响应的 HTTP 协议格式

    响应行:(1)响应的协议和版本号;(2)响应状态码;(3)响应状态描述符;

    响应头:(1)key-value  不同响应头有不同含义

                空行

    响应体:回传给客户端的数据;

      • Server:表示服务器的信息
      • Content-Type:响应体的数据类型
      • Content-length:响应体长度
      • Date:请求响应的时间(格林时间)

    响应状态码:200 成功、302 请求重定向、404 请求服务器已经收到,但是数据(请求地址)不存在、500 内部错误  

10. HttpServletRequest

  作用:只要每次有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 http 协议信息解析封装到 Request 对象中。

     然后传递到 service 方法(doGet 和 doPost)中给我们使用;可以通过 HttpServletRequest 获取到所有请求的信息;

  常用方法:

    • getRequestURL():获取请求的资源路径
    • getRequestURI():获取请求的统一资源定位符(绝对路径)
    • getRemoteUser():获取客户端的ip
    • getHeader():获取请求头
    • getParameter():获取请求参数
    • getParameterValues():获取请求参数(多个值的时候用)
    • getMethod():获取请求方式get/post
    • setAttribute():设置域数据
    • getAttribute():获取域数据
    • getRequestDispatcher():获取请求转发对象

11. 获取请求的参数:使用 HttpServletRequest 接收即可;

12. 解决 post 请求中文乱码:HttpServletRequest.setCharacterEncoding("UTF-8") //设置请求体的字符集编码为 utf-8;

13. 请求的转发:服务器收到请求后,从一个资源跳转到另一个资源的操作;

14. base 标签:结合转发操作使用,设置页面相对路径工作时参照的地址,href 属性就是参数的地址值;

15. web 中 "/" 的不同意义

  如果被浏览器解析,得到的地址是:http://ip:port/

    <a href="/">斜杠</>

  如果被服务器解析,得到的地址是:http://ip:port/工程路径 

    <url-pattern>/servlet</url-pattern>

    servletContext.getRealPath("/")

    request.getRequestDispatcher("/")

  特殊情况:response.sendRediect("/");把斜杠发送给浏览器解析,得到 http://ip:port/

11. HttpServletResponse 类

  作用:只要每次有请求进入 Tomcat 服务器,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用,

     HttpServletResponse表示所有响应的信息;需要设置返回给客户端的信息时可通过HttpServletResponse对象;

  两个输出流的说明:

    字节流(getOutputDStream()):用于下载(传递二进制数据)

    字符流(getWriter()):用于回传字符串(常用

    两个流只能同时使用一个

  往客户端回传字符串数据:

    设置服务器字符集为UTF-8:resp.setCharacterEncoding("UTF-8");

    通过响应头,设置浏览器也是用 utf-8:rsep.setHeader("Context-Type","text/html;charset=UTF-8");

    同时设置服务器和浏览器:resp.setContentType("text/html;charset=UTF-8");在获取流对象之前调用才有效

12. 请求重定向(客户端给服务器发请求,服务器给出一个新地址去访问(因为之前地址可能被废弃))

  特点:

    • 浏览器地址栏会发生变化
    • 两次请求
    • 不共享 Request 域中数据
    • 不能访问 WEB-INF 下的资源
    • 可以访问工程外的资源

  

13. 重定向方法

  方法一:

    resp.setStatus(302);// 设置响应状态码 302,表示重定向(已搬迁)

    resp.setHeader("Location","http://localhost:8080");// 设置响应头,说明新地址

  方法二:推荐使用

    resp.sendRedirect("http://localhost:8080");

posted @   LinxhzzZ  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示