JavaWeb学习之路(二):Servlet

一、Servlet技术

1、什么是Servlet

  1. Servlet是JavaEE规范之一,规范就是接口
  2. Servlet是JavaWeb三大组件之一。三大组件分别是:Servlet程序,Filter过滤器,Listener监听器
  3. Servlet是运行在服务器上的一个Java小程序,它可以接收客户端发送过来的请求,并相应数据给客户端

2、手动实现Servlet程序

  1. 编写一个类去实现Servlet接口
  2. 实现service方法,处理请求,并响应数据
  3. 到web.xml中去配置servlet程序的访问地址
package com.zc;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author ZC
 * @Description  自己写一个servlet
 * @date 2020-08-01 18:12
 */
public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * service是专门用来处理请求和响应的
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("HelloServlet 被访问了");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">


<!--    servlet标签给Tomcat配置servlet程序-->
    <servlet>
<!--        servlet-name标签,表示给Servlet程序起一个别名,一般是类名-->
        <servlet-name>HelloServlet</servlet-name>
<!--        servlet-class标签是Servlet程序的全类名-->
        <servlet-class>com.zc.HelloServlet</servlet-class>
    </servlet>


<!--    servlet-mapping标签给servlet程序配置访问地址-->
    <servlet-mapping>
<!--     servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用   -->
        <servlet-name>HelloServlet</servlet-name>
<!--        url-pattern标签配置访问地址
        / 斜杆在服务器解析的时候,表示地址为:http://ip:port/工程路径
        /hello 表示地址为:http://ip:port/工程路径/hello
-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

</web-app>

常见错误
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、url地址到Servlet程序访问

在这里插入图片描述

4、Servlet的生命周期

  1. 执行Servlet构造器方法
  2. 执行inti初始化方法
  3. 执行service方法
  4. 执行destroy销毁方法

其中
第一、二步,是在第一次访问的时候创建Servlet程序会调用
第三步,每次访问都会调用
第四步,在web工程停止的时候调用

5、GET和POST请求的分发处理

package com.zc;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author ZC
 * @Description  自己写一个servlet
 * @date 2020-08-01 18:12
 */
public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * service是专门用来处理请求和响应的
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("HelloServlet 被访问了");
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
//        System.out.println(method);
        if ("POST".equals(method)){
            doPost();
        }else if ("GET".equals(method)){
            doGet();
        }
    }

    private void doPost() {
        //TODO post请求的操作
    }

    private void doGet() {
        //TODO get请求的操作
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

6、通过继承HttpServlet实现Servlet程序

  1. 编写一个类去继承HttpServlet类
  2. 根据业务需要重写doGet或doPost方法
  3. 到web.xml中配置Servlet程序的访问地址
package com.zc;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author ZC
 * @Description 继承HttpServlet的方式来创建Servlet
 * @date 2020-08-02 15:21
 */
public class HelloServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        System.out.println("Servlet2的Get");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        System.out.println("Servlet2的Post");
    }
}

7、使用IDEA创建Servlet程序

在这里插入图片描述
在这里插入图片描述

8、Servlet类的继承体系

在这里插入图片描述

二、ServletConfig类

ServletConfig类从类名上来看,就知道是Servlet程序的配置类

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

1. ServletConfig类的三大作用

  1. 可以获取Servlet程序的别名,servlet-name的值
  2. 获取初始化参数 init-param
  3. 获取ServletContext对象
package com.zc;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author ZC
 * @Description  自己写一个servlet
 * @date 2020-08-01 18:12
 */
public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
//        1. 可以获取Servlet程序的别名,servlet-name的值
//        2. 获取初始化参数 init-param
//        3. 获取ServletContext对象
        System.out.println(servletConfig.getServletName());
        System.out.println(servletConfig.getInitParameter("username"));
        System.out.println(servletConfig.getInitParameter("url"));
        System.out.println(servletConfig.getServletContext());

    }

/**其他无关代码省略*/

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">


<!--    servlet标签给Tomcat配置servlet程序-->
    <servlet>
<!--        servlet-name标签,表示给Servlet程序起一个别名,一般是类名-->
        <servlet-name>HelloServlet</servlet-name>
<!--        servlet-class标签是Servlet程序的全类名-->
        <servlet-class>com.zc.HelloServlet</servlet-class>
<!--        init-param是初始化参数-->
        <init-param>
<!--            参数名-->
            <param-name>username</param-name>
<!--            参数值-->
            <param-value>root</param-value>
        </init-param>

        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
    </servlet>


<!--    servlet-mapping标签给servlet程序配置访问地址-->
    <servlet-mapping>
<!--     servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用   -->
        <servlet-name>HelloServlet</servlet-name>
<!--        url-pattern标签配置访问地址
        / 斜杆在服务器解析的时候,表示地址为:http://ip:port/工程路径
        /hello 表示地址为:http://ip:port/工程路径/hello
-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
</web-app>

三、ServletContext类

1. 什么是ServletContext

个人认为对ServletContext介绍比较好的一篇博客:https://blog.csdn.net/qq_36371449/article/details/80314024

  1. ServletContext是一个接口,它表示Servlet上下文对象
  2. 一个Web工程,只有一个ServletContext对象实例
  3. ServletContext对象是一个域对象
  4. ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁
  • 什么是域对象
    域对象,是可以像Map一样存取数据的对象,这里的域指的是存取数据的操作范围(整个web工程)
存数据取数据删除数据
域对象setAttribute()getAttribute()removeAttribute()
Mapput()get()remove()

2. ServletContext类的四个作用

  1. 获取web.xml中配置的上下文参数context-param
  2. 获取当前的工程路径,格式:/工程路径
  3. 获取工程部署后再服务器硬盘上的绝对路径
  4. 像Map一样存取数据
package com.zc;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author ZC
 * @Description
 * @date 2020-08-02 16:25
 */
public class ContextServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = getServletConfig().getServletContext();
		//1. 获取web.xml中配置的上下文参数context-param 
        System.out.println(context.getAttribute("user"));
		//2. 获取当前的工程路径,格式:/工程路径
        System.out.println(context.getContextPath());
        //3. 获取工程部署后再服务器硬盘上的绝对路径
        System.out.println(context.getRealPath("/"));
        System.out.println(context.getRealPath("/WEB-INF"));
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	//4. 像Map一样存取数据
        //获取Context对象
        ServletContext context = getServletContext();
        context.setAttribute("username","user");
        context.getAttribute("username");
        context.removeAttribute("username");
    }
}

四、Http协议

1. 什么时Http协议

  • 什么是协议:协议是指双方或多方相互约定好,大家都需要遵守的规则
  • http协议:就是指客户端和服务器之间通信时,发送的数据,需要遵守的协议
  • HTTP协议中的数据又叫报文

2.请求的HTTP协议格式

  • 请求:客户端给服务器发送数据
  • 响应:服务器给客户端发送数据
  • 请求又分为GET请求和POST请求

1.GET请求

  • 请求行
    1. 请求的方式 —— GET
    2. 请求的资源路径[+?+请求参数]
    3. 请求的协议的版本号 —— HTTP/1.1
  • 请求头
    1. 由key:value组成,不同的键值对表示不同的含义

在这里插入图片描述

2.POST请求

  • 请求行
    1. 请求的方式 —— POST
    2. 请求的资源路径[+?+请求参数]
    3. 请求的协议的版本号 —— HTTP/1.1
  • 请求头
    1. 由key:value组成,不同的键值对表示不同的含义
    2. 空行
  • 请求体 ===>> 就是发送给服务器的数据
    在这里插入图片描述

3.常用请求头的说明

在这里插入图片描述

4.哪些是GET请求,哪些是POST请求

在这里插入图片描述
在这里插入图片描述

3.响应的HTTP协议格式

  • 响应行
    1. 响应的协议和版本号
    2. 响应状态码
    3. 响应状态描述符
  • 响应头
    1. 由key:value组成,不同的键值对表示不同的含义
    2. 空行
  • 响应体 ===>> 就是回传给客户端的数据

在这里插入图片描述

4.常用的响应码说明

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

5.MIME类型说明

MIME是HTTP协议中数据类型。
MIME的全称是“Multipurpose Internet Mail Extensions”多功能Internet邮件扩充服务。MIME类型的格式是“大类型/小类型”,并与一种文件的扩展名相对应。
在这里插入图片描述

五、HttpServletRequest类

1. HttpServletRequest类有什么作用

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

2. HttpServletRequest类的常用方法

  1. getRequestURI():获取请求的资源路径
  2. getRequestURL():获取请求的统一资源定位符(绝对路径)
  3. gerRemoteHost():获取客户端的ip
  4. getHeader():获取请求头
  5. getParameter():获取请求的参数
  6. getParameterValues():获取请求的参数(多个值的时候使用)
  7. getMethod():获取请求的方式,GET或POST
  8. setAttribute(key,value):设置域数据
  9. getAttribute(key):获取域数据
  10. setCharacterEncoding(“UTF-8”):设置编码集为UTF-8,可解决post请求中文乱码的问题(要在获取请求参数之前调用才能生效
  11. getRequestDispatcher() :获取请求转发对象

什么是请求的转发
请求转发是指,服务器收到请求后,从一个资源跳转到另一个资源的操作叫做请求转发
在这里插入图片描述

package com.atguigu.servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet1 extends HttpServlet {
  @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       // 获取请求的参数(办事的材料)查看
       String username = req.getParameter("username");
       System.out.println("在Servlet1(柜台1)中查看参数(材料):" + username);

       // 给材料 盖一个章,并传递到Servlet2(柜台 2)去查看
      req.setAttribute("key1","柜台1的章");

       // 问路:Servlet2(柜台 2)怎么走
       /**
        * 请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到IDEA代码的web目录<br/>
        *
       */
       RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//        RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");

      // 走向Sevlet2(柜台 2)
       requestDispatcher.forward(req,resp);

   }
}
package com.atguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet2 extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      // 获取请求的参数(办事的材料)查看
      String username = req.getParameter("username");
      System.out.println("在Servlet2(柜台2)中查看参数(材料):" + username);

      // 查看 柜台1 是否有盖章
      Object key1 = req.getAttribute("key1");
      System.out.println("柜台1是否有章:" + key1);

      // 处理自己的业务
      System.out.println("Servlet2 处理自己的业务 ");
  }
}

3 base标签

在这里插入图片描述
在这里插入图片描述

4. web中 / 斜杠的不同意义

在web中,/ 斜杆是一种绝对路径

  • / 斜杆如果被浏览器解析,得到的地址是http://ip:port/
    1. <a href = "/">斜杆</a>
  • / 斜杆如果被服务器解析,得到的地址是http://ip:port/工程路径
    1. <url-pattern>/servlet</url-pattern>
    2. servletContext.getRealPath("/")
    3. request.getRequestDispatcher("/")

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

六、HttpServletResponse类

1. HttpServletResponse类的作用

HttpServletResponse类和HttpServletRequest类一样,每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息。
我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象进行设置

2. 两个输出流的说明

  • 字节流——getOutputStream()——常用于下载(传递二进制数据)
  • 字符流——getWriter()——常用于回传字符串

注意:
两个流同时只能使用一个,否则会报错

3. 解决响应的中文乱码

方式一:

设置服务器和浏览器的编码集一致

package com.zc.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author ZC
 * @Description
 * @date 2020-08-03 3:38
 */
public class ResponseServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置服务器字符集为UTF-8
        resp.setCharacterEncoding("UTF-8");
        //通过响应头,设置浏览器也使用UTF-8
        resp.setHeader("Content-type","text/html;charset=UTF-8");
        //要求:往客户端返回字符串数据
        PrintWriter writer = resp.getWriter();
        writer.write("你最帅");
    }
    
}

方式二:

设置服务器和浏览器的编码集一致

package com.zc.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author ZC
 * @Description
 * @date 2020-08-03 3:38
 */
public class ResponseServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
        //它会同时设置浏览器和服务器的编码集为UTF-8
        //此方法一定要在获取流之前调用才有效
        resp.setContentType("text/html;charset=UTF-8");
        //要求:往客户端返回字符串数据
        PrintWriter writer = resp.getWriter();
        writer.write("赵公");
    }

}

4. 请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说,我给你一些地址,你去新地址访问。叫请求重定向
在这里插入图片描述

package com.atguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Response1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("曾到此一游 Response1 ");

        req.setAttribute("key1", "value1");
        
        //重定向的方案一:
        // 设置响应状态码302 ,表示重定向,(已搬迁)
//        resp.setStatus(302);
        // 设置响应头,说明 新的地址在哪里
//        resp.setHeader("Location", "http://localhost:8080/07_servlet/response2");
//        resp.setHeader("Location", "http://localhost:8080");
        //重定向的方案二:(推荐使用)
        resp.sendRedirect("http://localhost:8080");
    }
}

package com.atguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Response2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(req.getAttribute("key1"));
        resp.getWriter().write("response2's result!");
    }
}

本课程详细讲解了以下内容:     1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程     2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例     3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题      4.session与cookie问题及application、cookie补充说明及四种范围对象作用域      5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别      6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及进制BLOB类型数据      7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)      8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析      9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)     1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)      11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet      12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题      13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove      14.过滤器、过滤器通配符、过滤器链、监听器      15.session绑定解绑、钝化活化      16.以及Ajax的各种应用      17. Idea环境下的Java Web开发
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页