Servlet

本文详细介绍了Servlet的概念、生命周期以及手动实现Servlet的步骤,包括如何在web.xml中配置。此外,还讲解了ServletConfig和ServletContext的作用,以及如何处理GET和POST请求。最后,讨论了HTTP协议的请求和响应格式,包括常见的请求头和响应状态码,以及HttpServletRequest和HttpServletResponse类的关键方法。
摘要由CSDN通过智能技术生成

1.Servlet技术

  • 什么是Servlet

    • Servlet是JavaEE规范之一
    • Servlet是JavaWeb三大组件之一,三大组件是:Servlet程序、Filter过滤器、Listener监听器
    • Servlet是运行在服务器上的一个java小程序,可以接收客户端发来的请求,并响应数据给客户端
  • 手动实现Servlet程序

    • 编写一个类去实现Servlet接口
    • 实现service方法,处理请求,并响应数据
    • 到web.xml中去配置servlet程序的访问地址
    package com.fan.servlet;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class HelloServlet implements Servlet {
    
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
        /**
        service方法专门用来处理请求和响应
        
        **/
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("Hello Servlet!");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
    
    <!-- Servlet标签给Tomcat配置Servlet程序  -->
    <servlet>
        <!-- servlet-name 标签是Servlet程序起的一个别名,一般是类名-->
    	<servlet-name>HelloServlet</servlet-mapping>
        <!-- servlet-class是Servlet程序的全类名-->
    	<servlet-class>com.fan.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--  servlet-mapping  标签给servlet程序配置访问地址  -->
    <servlet-mapping>
        <!-- servlet-name 告诉服务器,配置的地址给哪个Servlet程序使用-->
    	<servlet-name>HelloServlet</servlet-name>
        <!--  url-pattern标签配置访问地址
      		/hello表示地址为:http://ip:port/工程路径/hello
    	-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
  • Servlet的生命周期

    • 执行Servlet构造器方法
    • 执行init初始化方法
    • 执行Service方法
    • 执行destroy方法

    前两步在第一次访问的时候创建Servlet程序调用,第三步每次访问都会调用,第四步在web工程停止的时候调用。

  • GET和POST请求的分发处理

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
            String method=httpServletRequest.getMethod();
            if(method.equals("GET")){
                doGet();
            }
            else if(method.equals("POST")){
                doPost();
            }
        }
        public void doGet(){
            System.out.println("get方法");
        }
        public void doPost(){
            System.out.println("post方法");
        }
    
    
  • 通过继承HttpServlet实现Servlet程序

    • 编写一个类去继承HttpServlet类
    • 根据业务需要重写doGet或doPost方法
    • 到web.xml中配置Servlet程序的访问地址
    public class HelloServlet2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("doGet");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("doPost");
        }
    }
    
  • Servlet类的继承体系

2.ServletConfig类

Servlet程序和ServletConfig对象都是由Tomcat负责创建,Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象

  • ServletConfig类的三大作用
    • 可以获取Servlet程序的别名servlet-name的值
    • 获取初始化参数init-param
    • 获取ServletContext对象
public void init(ServletConfig servletConfig) throws ServletException {
        //获取Servlet程序别名
        System.out.println("HelloServlet程序的别名:"+servletConfig.getServletName());
        //获取初始化参数init-param
        System.out.println("初始化参数user的值:"+servletConfig.getInitParameter("user"));
        //获取ServletContext对象
        System.out.println(servletConfig.getServletContext());
    }

3.ServletContext类

  • ServletContext概念

    • ServletContext是一个接口,表示Servlet上下文对象

    • 一个web工程,只有一个ServletContext对象实例

    • ServletContext对象是一个域对象

    • ServletContext是在web工程部署启动的时候创建,在web工程停止的时候销毁

  • ServletContext类的四个作用

    • 获取web.xml中配置的上下文参数context-param
    • 获取当前的工程路径,格式:/工程路径
    • 获取工程部署后在服务器硬盘的绝对路径
    • 像map一样存取数据

    web.xml中的配置

    <!--context-param是上下文参数,属于整个web工程 -->
        <context-param>
            <param-name>username</param-name>
            <param-value>user</param-value>
        </context-param>
    
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context=getServletConfig().getServletContext();
            //获取web.xml中配置的上下文参数context-param
            System.out.println("context-param参数username的值是:"+context.getInitParameter("username"));
            //获取当前的工程路径,格式:/工程路径
            System.out.println("当前工程路径"+context.getContextPath());
            //获取工程部署后在服务器硬盘上的绝对路径
            System.out.println("工程部署的路径是:"+context.getRealPath("/"));
        }
    
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context=getServletConfig().getServletContext();
            //获取ServletCOntext对象
            context.setAttribute("key","value");
            System.out.println("context中key的值是:"+context.getAttribute("key"));
        }
    

4.HTTP协议

4.1 请求的HTTP协议格式

客户端给服务器发送数据叫请求,服务器给客户端传回数据叫响应

请求分为GET请求和POST请求

GET请求

  • 请求行

    • 请求的方式 GET
    • 请求的资源路径[+?+请求参数]
    • 请求的协议版本号 HTTP/1.1
  • 请求头

    由key:value组成,不同的键值对,表示不同的含义

POST请求

  • 请求行
    • 请求的方式 POST
    • 请求的资源路径[+?+请求参数]
    • 请求的协议版本号 HTTP/1.1
  • 请求头
    • key:value 不同的请求头,有不同的含义
  • 请求体 发送给服务器的数据

常用请求头的说明

  • Accept:表示客户端可以接收的数据类型
  • Accept-Languege:表示客户端可以接收的语言类型
  • User-Agent:表示客户端浏览器的信息
  • Host:表示请求时的服务器ip和端口号

GET请求与POST请求

  • GET请求:
    • form标签 method=get
    • a标签
    • link标签引入css
    • Script标签引入js文件
    • img标签引入图片
    • iframe引入html页面
    • 在浏览器输入地址栏后敲回车
  • POST请求
    • form标签 method=post

4.2 响应的HTTP协议格式

  • 响应行
    • 响应的协议和版本号
    • 响应状态码
    • 响应状态描述符
  • 响应头
    • key:value 不同的响应头,有其不同含义
  • 响应体
    • 回传给客户端的数据

常用的响应码说明

  • 200 表示请求成功
  • 302 表示请求重定向
  • 404 表示请求服务器已经收到了,但是数据不存在(请求地址错误)
  • 500 表示服务器已经收到请求,但是服务器内部错误(代码错误)

5.HttpServletRequest类

  • 作用

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

  • HttpServletRequest类的常用方法

    • getRequestURI() 获取请求的资源路径
    • getRequestURL() 获取请求的统一资源定位符(绝对路径)
    • getRemoteHost() 获取客户端的ip地址
    • getHeader() 获取请求头
    • getParameter() 获取请求的参数
    • getParameterValues() 获取请求的参数(多个值的时候使用)
    • getMethod() 获取请求的方式GET或POST
    • setAttribute(key,value) 设置域数据
    • getAttribute(key) 获取域数据
    • getRequestDispatcher() 获取请求转发对象
  • doGet请求的中文乱码解决

    String username=req.getParameter("username");
    //先以iso8859-1进行编码,再以utf-8进行解码
    username=new String(username.getBytes("iso-8859-1"),"UTF-8");
    
  • POST请求的中文乱码解决

    设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题

    req.setCharacterEncoding("UTF-8");
    
  • 请求的转发

    请求的转发是指服务器收到请求后,从一次资源跳转到另一个资源的操作

    RequestDispatcher requestDispatcher=req.getRequestDispatcher("/servlet2");
    
    requestDispatcher.farward(req,resp);
    
  • base标签的作用

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

    <base href="http://localhost:8080/servlet/a/b"/>
    
  • web中/的不同意义

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

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

6.HttpServletResponse类

  • HttpServletResponse类的作用

    HttpServletResponse表示所有响应的信息

  • 输出流

    • 字节流 getOutputStream 常用于下载(传递二进制数据)
    • 字符流 getWriter() 常用于回传字符串
    • 两个流同时只能使用一个
  • 往客户端回传数据

    PrintWriter writer=resp.getWriter();
    writer.write("response's content");
    
  • 响应的乱码解决

    • 方案一

      //设置服务器字符集为UTF-8
      resp.setCharacterEncoding("UTF-8");
      //通过响应头,设置浏览器也使用UTF-8字符集
      resp.setHeader("Content-Type","text/html;charset=UTF-8");
      
    • 方案二

      resp.setContentType("text/html";charset="UTF-8");
      
  • 请求重定向

    请求重定向,是指客户端给服务器发送请求,然后服务器告诉客户端去访问新地址

    • 请求重定向的第一种方案:

      //设置响应状态码302,表示重定向
      resp.setStatus(302);
      //设置响应头,说明新的地址在哪里
      resp.serHeader("Location","http://localhost:8080");
      
    • 请求重定向的第二种方案

      resp.sendRedircet("http://localhost:8080");
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值