01 Servlet技术

Servlet

1、Servlet技术

1.1、什么是Servlet
  • Servlet是JavaEE规范之一。规范就是接口
  • Servlet就JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener"监听器。
  • servlet是运行在服务器上的一个java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
1.2、手动实现Servlet程序
  • 编写一个类实现Servlet接口

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

  • 到web.xml中去配置servlet程序的访问地址

    <!-- servlet标签给Tomcat配置ServLet程序-->
    <servlet>
    	<!--servLet-name标签servLet程序起一个别名(一般是类名〉-->
    	<servlet-name>Helloservlet</servlet-name>
    	<!--servlet-class是Servlet程序的全类名-->
    	<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
    </servlet>
    
    <!--servLet-mapping标签给servLet程序配置访问地址-->
    <servlet-mapping>
    	!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个ServLet程序使用-->
    	<servlet-name>Helloservlet</servlet-name>
    	<!-- urL-pattern标签配置访问地址 -->
    	<!-- 斜杠在服务器解析的时候,表示地址为;http://ip:port/工程路径 -->
    	<!-- /hello表示地址为:http:/lip:port/工程路径/heLLo -->
    	<url-pattern>/hello</url-pattern>
        </servlet-mapping>
    
1.3、Servlet的生命周期
  • 执行Servlet构造器方法
  • 执行Init初始化方法
    • 第一、二步,在第一次访问的时候创建Servlet程序会调用
  • 执行service方法
    • 第三步,每次访问都会调用
  • 执行destroy方法
    • web工程停止的时候调用
1.4、通过继承HttpServlet实现Servlet程序

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

  1. 编写一个类去继承HttpServet类
  2. 根据业务需要重写doGet或doPost方法
  3. 到web.xml中的配置Servet程序的访问地址
1.5、使用IDEA创建Servlet程序

菜单--->new--->Servlet程序

1.6、Servlet类的继承体系

image-20200914173015930

2、ServletConfig类

  • Servlet程序和servletConfig对象都是由Tomcat负责创建,我们负责使用。
  • Servlet程序认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的servletConfig对象。
2.1、ServletConfig类的三大作用
  1. 可以获联ServLet程序的别名servlet-name的值

  2. 获取韧始化参数init-param

  3. 获取ServletContext对象

servletConfig.getServletMame()

servletConfig.getInitParameter("username")
servletConfig.getInitParameter("url")

servletConfig.getsServletcontext()

注意点:重写Init方法里面一定要调用父类的init(ServletConfig)操作。

3、ServletContext类

3.1、ServletContext
  1. ServletContext是一个接口,它表示Servlet上下文对象

  2. 一个web工程,只有一个ServletContext对象实例。

  3. ServletContext对象是一个域对象。

  4. ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁。

    ​ 域对象:像Map一样存取数据的对象。
    ​ 这里的域指的是存取数据的操作范围,这里即整个web工程。

    存数据 取数据 删除数据
    Map put() get() remove()
    域对象 setAttribute() getAttribute() removeAttribute()
3.2、ServletContext类的作用
ServletContext context = getServletConfig().getServletContext();

context.getIintParameter()
context.getContextPath()
    /**
    / 斜杠被服务器解析地址为: http://ip:port/工程名/ 映射到IDEA代码的web目录
    */
context.getRealPath("/")
  1. 获取web.xml中配置的上下文参数context-param
  2. 获取当前的工程路径,格式:/工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像Map—样存取数据

4、HTTP协议

4.1、http协议
  • 所谓HTTP协议,就是指,客户端和服务器之间通信时发送数据时需要遵守的规则。
  • HTTP协议中的数据又叫报文。
4.2、请求HTTP协议格式

客户端给服务器发送数据叫请求。
服务器给吝户端回传数据叫响应。
请求又分为GET请求,和POST请求两种

  • GET

    • 请求行
    • 请求头
  • POST

    • 请求行

    • 请求头

      空行:间隔作用

    • 请求体

  • 常用请求头

    • Content-Type:表示发送的数据的类型
      application/x-www-form-urlencoded
      表示提交的数据格式是:name=value&name=value,然后对其进行url编码
      url编码是把非英文内容转换为∶%xx%xx
      multipart/form-data
      表示以多段的形式提交数据给服务器(以流的形式提交,用于上传)
  • 常见的GET or POST

    • GET
      • form标签method=get
      • a标签
      • link标签引入css
      • Script标签引入js文件
      • img标签引入图片
      • iframe引A=入html页面
      • 在浏览器地址栏中输入地址后敲回车
    • POST
      • form标签 method=post
4.3、响应HTTP协议格式
  • 响应行

    • 响应的协议和版本号
    • 响应状态码
    • 响应状态描述符
  • 响应头

    • key : value 不同的响应头,有其不同含义

    空行

  • 响应体

4.4、常用响应码
  • 200
  • 302:请求重定向
  • 404:请求地址错误
  • 500:服务器内部错误
4.5、MIME类型
  • MIME是HTTP协议中数据类型。
    MIME的英文全称是"Multipurpose Internet Mail Extensions”多功能Internet邮件扩充服务。MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应。
    常见的MIME类型:

    文件 MIME类型
    超文本标记语言文本 .html ,.htm text/html
    普通文本 .txt text/plain
    RTF文本 .rtf application/rtf
    GIF图形 .gif image/gif
    JPEG图形 .jpeg,.jpg image/jpeg
    au声音文件 .au audio/basic
    MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
    RealAudio音乐文件 .ra,.ram audio/x-pn-realaudio
    MPEG文件 .mpg,.mpeg video/mpeg
    AVI文件 .avi video/x-msvideo
    GZIP文件 .gz application/x-gzip
    TAR文件 .tar application/x-tar

5、HttpServletRequest类

5.1、HttpServletRequest类的作用

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpservletRequest对象,获取到所有请求的信息。

5.2、HttpServletRequest类的常用方法
method describe
getRequestURI() 获取请求的资源路径
getRequestURL() 获取请求的统一资源定位符(绝对路径)
getRemoteHost() 获取客户端的ip地址
getHeader() 获取请求头
getParameter() 获取请求的参数
getMethod() 获取请求的方式GET 或POST
setCharacterEncoding() 设置请求体的字符集
setAttribute(key,value); 设置域数据
getAttribute(key) 获取域数据
getRequestDispatcher() 获取请求转发对象
getParameterValues() 获取请求的参数(多个值的时候使用)
5.3、请求转发
  1. 请求转发是指服务器收到请求后,从一个资源跳转到另一个资源的操作。
  2. 请求转发的特点:
    • 浏览器地址栏不发生变化
    • 一次请求
    • 共享Request域中的数据
    • 可以转发到WEB-INF目录下
    • 不可以访问工程以外的资源
5.4、base标签
  • 当我们点击a标签进行跳转的时候,浏览器地址栏中的地址是:http:/llocalhost:8080/07_servlet/a/b/c.html
    跳转回去的a标签路径是: ../../index.html
    所有相对路径在工作时侯都会参照当前浏览器地址栏中的地址来进行跳转。
    那么参照后得到的地址是:
    http:/localhost:8080/07_servlet/index.html (正确的跳转路径)

  • 当我们使用请求转发来进行跳转的时候,浏览器地址栏中的地址是
    http:/llocalhost:8080/07_servlet/forwardC
    跳转回去的a标签路径是: ../../index.html
    所有相对路径在工作时候都会参照当前浏览器地址栏中的地址来进行跳转。
    那么参照后得到的地址是:
    http:/llocalhost:8080/index.html (错误的路径)

  • base标签可以设置当前页面中所看相对路径工作时,参照哪个路径来进行跳转

    <head>
        <base href=".../a/b/"> </head>
    </head>
    
5.5、Web中的相对路径和绝对路径
  • 在javaWeb中,路径分为相对路径和绝对路径两种:
    • 相对路径是:
      . 表示当前目录
      .. 表示上一级目录
      资源名 表示当前目录/资源名
    • 绝对路径
5.6、web中的/的不同意义

"/"也是一种绝对路径

  • “/”被浏览器解析,得到的是 ip:port

  • "/"被服务器解析,得到的是 ip:port/projectName

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

6、HttpServletResponse类

6.1、HttpServletResponse类的作用
  • HttpServletResponse类和HittpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。

  • HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息。

  • 如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置

6.2、两个输出流的说明
字节流 getOutputstream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
  • 两个流一次只能使用一个,否则报错。
6.3、向客户端回传数据
//通过响应头,设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");

//它会同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
//此方法在获取流对象之前调用才有效
resp.setContentType( "text/html; charset=UTF-8");
6.4、请求重定向
  • 请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。(因为之前的地址可能已经被废弃)

  • 状态码:302

  • 请求重定向的特点

    • 浏览器地址栏会发生变化
    • 两次请求
    • 不共享Request域中的数据
    • 不能跳到WEB-INF下的资源
    • 可以访问到外部网络资源
  • 实现方式

    //请求重定向的第一种方案:
    //1、设置响应状态码302,表示重定向,(已搬迁)
    resp.setStatus(302);
    //2、设置响应头,说明新的地址在哪里
    resp.setHeader("Location", "http://localhost:8080");
    
    //请求重定向的第二种方案(推荐使用):
    resp.setRedirect("http://localhost:8080");
    
原文地址:https://www.cnblogs.com/nojacky/p/13906096.html