JavaWeb零基础入门之Servlet

学完之后学习JavaWeb零基础入门之JSP
视频链接:https://www.bilibili.com/video/BV1Y7411K7zz?p=1
参考手册:https://www.w3school.com.cn/html5/index.asp

一、Servlet介绍

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

二、手动实现Servlet程序

  1. 编写一个类实现Servlet接口,并重写service方法处理请求、响应数据

  2. 在WEB-INF文件夹中的web.xml文件中配置Servlet程序的访问地址

  3. 代码演示:

    1. 新建一个module,选择Java Enterprise➡️Web Application➡️选取适合的服务器

    2. 在src下创建一个Hello Servlet类

      public class HelloServlet implements Servlet {
          @Override
          public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
              System.out.println("TestServlet被访问了!");
          }
      }
      
    3. 在web.xml中的配置

      
      <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>
          
          <servlet-name>HelloServletservlet-name>
          
          <servlet-class>com.servlet.HelloServletservlet-class>
        servlet>
      
        
        <servlet-mapping>
          
          <servlet-name>HelloServletservlet-name>
          
          <url-pattern>/hellourl-pattern> 
        servlet-mapping>
      web-app>
      
    4. 运行结果:

      • 点击绿色按钮开启Tomcat服务器之后,会自动打开默认的地址http://localhost:8080/servlet
      • 在地址栏继续输入/hello,会执行指定类的service方法,控制台输出:TestServlet被访问了!

三、Servlet程序的访问原理

JavaWeb零基础入门之Servlet_第1张图片

四、Servlet程序的常见错误

1. url-pattern中配置的路径没有以斜杠打头

JavaWeb零基础入门之Servlet_第2张图片

2. servlet-name中的两个映射值不一致

JavaWeb零基础入门之Servlet_第3张图片

3. servlet-class标签的全类名配置错误

JavaWeb零基础入门之Servlet_第4张图片

五、Servlet的生命周期

Servlet程序被访问以后按以下顺序执行:

  1. 执行Servlet程序的构造方法:初次访问并创建Servlet程序时会执行(每次启动服务只执行一次)
  2. 执行init方法:初次访问并创建Servlet程序时会执行(每次启动服务只执行一次)
  3. 执行service方法:每次刷新 (访问)都会执行
  4. 执行destroy方法:点击停止时会执行一次

六、GET和POST请求的不同处理

代码演示:1. 在src目录下创建此类

public class HelloServlet implements Servlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //转换的原因:HttpServletRequest有getMethod方法,可以得到请求的类型
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        //method值为GET或POST,取决于表单提交的method
        if (method.equals("POST")){
            System.out.println("POST方式");
        } else if (method.equals("GET")) {
            System.out.println("GET方式");
        }
    }

代码演示:2. 在web目录下创建Test.html页面

<body>
    <form action="http://localhost:8080/servlet/hello" method="post">
        
        <input type="submit">
    form>
body>

七、继承HttpServlet类实现Servlet程序

在实际的项目开发中,都是使用继承HttpServlet类实现Servlet程序的方式,步骤如下:

  1. 编写一个类继承HttpServlet类
  2. 根据需求重写doGet或doPost方法,由service方法根据表单的method属性值调用二者之一
  3. 到web.xml中配置Servlet程序的访问地址

代码演示:

  1. 在src目录下创建此类

    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方法执行");
        }
    }
    //HttpServlet的service方法会根据method方式调用二者之一
    
  2. 在web.xml中继续写配置

    
    <servlet>
        <servlet-name>HelloServlet2servlet-name>
        <servlet-class>com.servlet.HelloServlet2servlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet2servlet-name>
        <url-pattern>/hello2url-pattern>
    servlet-mapping>
    
  3. 在web中创建Test.html页面

    <body>
        <form action="http://localhost:8080/servlet/hello2" method="post">
            
            <input type="submit">
        form>
    body>
    
  4. 运行结果:服务器启动之后,在浏览器的地址栏中的后缀加上Test.html,即可访问此页面,点击提交标签, 即可跳转到http://localhost:8080/MyTest/Test2,执行service方法,进而执行doPost方法

八、使用IDEA创建Servlet程序

  1. 新建一个Servlet程序

JavaWeb零基础入门之Servlet_第5张图片

  1. 配置Servlet信息

JavaWeb零基础入门之Servlet_第6张图片

  1. 创建之后,会在包下创建此类(类名为全类名中的类名),此类继承于HttpServlet类,其中有doGet和doPost方法(无函数体),并自动的在web.xml 文件中补充新的标签,但无标签,需自己补充

九、Servlet接口的继承体系

JavaWeb零基础入门之Servlet_第7张图片

十、ServletConfig接口

  1. 从名字来看,得知此接口中是Servlet程序的配置信息:

    • Servlet程序和ServletConfig对象都是由Tomcat负责创建,编程人员负责使用
    • Servlet程序默认是第一次访问时创建,每个Servlet程序创建时对应的创建ServletConfig对象,二者相互对应,某个Servlet程序只可以获得他对应的ServletConfig对象,无法获得别的 Servlet程序的ServletConfig对象
  2. ServletConfig接口的三大作用:

    • 可以获取Servlet程序的别名(即web.xml的的内容)
    • 可以获取web.xml的初始化参数的值
    • 可以获取ServletContext对象
  3. 代码演示:在web.xml中继续写配置(写在标签中)

    <servlet>
        <servlet-name>TestServlet4servlet-name>
        <servlet-class>com.qizegao.servlet.TestServlet4servlet-class>
        
        <init-param>
            
            <param-name>usernameparam-name>
            
            <param-value>rootparam-value>
        init-param>
        <init-param>
            <param-name>urlparam-name>
            <param-value>jdbc:mysql:localhost:3306/testparam-value>
        init-param>
    servlet>
    <servlet-mapping>
        <servlet-name>TestServlet4servlet-name>
        <url-pattern>/Test4url-pattern>
    servlet-mapping>
    
  4. 代码演示:在src目录下创建此类

    public class TestServlet4 extends HttpServlet {
        @Override  //使用init方法的原因:1.一定会执行 2.参数中有ServletConfig对象
        public void init(ServletConfig config) throws ServletException {
            super.init(config);
            //1.获取Servlet程序的别名
            System.out.println("此程序的别名是:" + config.getServletName());
            //2.获取初始化参数init-param,该方法获取指定的参数名的值
            System.out.println("初始化参数username的值是:" + config.getInitParameter("username"));
            System.out.println("初始化参数url的值是:" + config.getInitParameter("url"));
            //3.获取ServletContext对象
            System.out.println(config.getServletContext());
        }
        /*运行结果(浏览器地址栏输入http://localhost:8080/MyTest/Test4):
          此程序的别名是:TestServlet4
          初始化参数username的值是:root
          初始化参数url的值是:jdbc:mysql:localhost:3306/test
          org.apache.catalina.core.ApplicationContextFacade@64d62c61 			*/
    } 
    
  5. 注意:重写init方法时,必须要在函数体内写:super.init(config);
    原因:父类GenericServlet中的init方法将参数config保存起来,子类若不调用则无法保存

十一、ServletContext接口

  1. ServletContext接口表示Servlet上下文对象

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

  3. ServletContext是在web工程启动时创建,在web工程停止时销毁

  4. ServletContext对象是一个域对象
    域对象:像Map一样存取数据的对象称为域对象,域指的是存取数据的操作范围,

  5. ServletContext的域是整个web工程

  6. ServletContext接口的四个作用:

    • 获取web.xml中配置的上下文参数标签中的值
    • 获取当前工程的路径,格式:/工程路径,也就是Edit Configurations中Deployment中的 Application context的内容(即地址中8080之后,具体的打开的页面之前的内容)
    • 获取工程部署后在硬盘上的绝对路径
    • 像Map一样存取数据
  7. 代码演示:在web.xml中继续写配置(在标签中)

    
    
    <context-param>
        <param-name>usernameparam-name>
        <param-value>rootparam-value>
    context-param>
    <context-param>
        <param-name>passwordparam-name>
        <param-value>rootparam-value>
    context-param>
    
    
  8. 代码演示:在src目录下创建此类

    public class MyContextServlet extends HttpServlet {
        //默认执行doGet方法,故只重写doGet方法
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //GenericServlet类中有public ServletConfig getServletConfig()方法,返回this.config
            ServletContext servletContext = getServletConfig().getServletContext();
            //1.获取web.xml中配置的上下文参数标签中的值
            String username = servletContext.getInitParameter("username");
            System.out.println("context-param参数的username值是" + username);
            /* 运行结果:context-param参数的username值是root */
            System.out.println("context-param参数的password值是" + servletContext.getInitParameter("password"));
            /* 运行结果:context-param参数的password值是root */
            //2.获取当前工程的路径
            System.out.println("当前工程路径:" + servletContext.getContextPath());
            /* 运行结果:当前工程路径:/MyTest */
            //3.获取工程部署后在硬盘上的绝对路径
            /* /斜杠(默认路径)对应IDEA代码的web目录 */
            System.out.println("工程部署的路径是:" + servletContext.getRealPath("/"));
            //在web目录下创建一个css文件夹
            System.out.println("工程下css目录的绝对路径是:" + servletContext.getRealPath("/css"));
            //在web目录下创建一个img文件夹,里面放1.gif文件
            System.out.println("工程下img目录1.gif的绝对路径是:" + servletContext.getRealPath("/img/1.gif"));
        }
    }
    //记得要在浏览器的地址栏输入http://localhost:8080/servlet/MyContextServlet才可访问到此类
    
    
  9. 代码演示:在src中创建此类,并在web.xml中写对应的配置信息

    public class Servlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //GenericServlet类中有public ServletContext getServletContext()方法,return this.getServletConfig().getServletContext();
            ServletContext servletContext = getServletContext();
            System.out.println(servletContext);
            /* 输出:org.apache.catalina.core.ApplicationContextFacade@2711c490 */
            servletContext.setAttribute("key1","value1");
            System.out.println(servletContext.getAttribute("key1"));
            /* 输出:value1 */
        }
    }
    
  10. 注意:一个web工程只会创建一个ServletContext对象实例,换其他类输出servletContext得到的结果与上述相同,且一旦给此对象赋值,即使换另一个类getAttribute(key1),得到的结果也是value1

十二、HTTP协议

1. 含义

所谓协议指的是双方或多方相互约定好,都要遵守的规则,而HTTP协议指的是客户端和服务器之间通信时发送的数据需要遵守的规则,HTTP协议中的数据又称为报文

2. 请求的HTTP协议格式

1.GET请求:

  1. 由请求行、请求头两部分组成,如下图所示:

JavaWeb零基础入门之Servlet_第8张图片

  1. 请求行:

    • 请求的方式:GET
    • 请求的资源路径:/06_servlet/a.html
    • 请求的协议的版本号:HTTP/1.1
  2. 请求头:

    • Accept:告诉服务器,客户端可以接收的数据类型
    • Accept-Language:告诉服务器,客户端可以接收的语言类型:
      • zh_CN:中文中国
      • en_US:英文美国
    • User-Agent:代表客户端浏览器的信息
    • Accept-Encoding:告诉服务器,客户端可以接收的数据编码(压缩)格式
    • Host:表示请求时的服务器ip和端口号
    • Connection:告诉服务器,当前连接如何处理:
      • Keep-Alive:回传完数据不要马上关闭,保持一小段时间的连接
      • Closed:回传完数据马上关闭

2.POST请求:

  1. 由请求行、请求头、空行、请求体组成,如下图所示:

JavaWeb零基础入门之Servlet_第9张图片

  1. 请求头(仅分析与GET请求的不同之处):

    • Referer:表示请求发起时,浏览器地址栏中的地址
    • Content-Type:表示发送的数据的类型:
      • application/x-www-form-ur lencoded:表示提交的数据的格式是 name=value&name=value,然后对其进行url编码,url编码是把非英文内容转换为:%xx%xx
      • multipart/form-data:表示以多段的形式提交数据给服务器,即以流的形式提交,用于上传
    • Content-Length:表示发送的数据的长度
    • Cache-Control:表示如何控制缓存,no-cache不缓存

3.区分GET请求和POST请求

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

3. 响应的HTTP协议格式

JavaWeb零基础入门之Servlet_第10张图片

4. 常见的响应码

  1. 200 表示请求成功
  2. 302 表示请求重定向
  3. 404 表示服务器收到请求,但是请求的数据不存在(请求地址错误)
  4. 500 表示服务器收到请求,但是服务器内部错误(代码错误)

5. MIME类型说明

MIME是HTTP协议中的数据类型,格式是:大类型/小类型,并与某一种文件的扩展名相对应:

序号 内容类型 文件类型 说明
1 application/msword doc dot Microsoft Word2003
2 application/vnd.ms-excel xIs Microsoft Excel2003
4 application/vnd.ms-powerpoint ppt Microsoft Powerpoint
5 application/pdf pdf Adobe Acrobat
6 application/octet- -stream bin exe so dll class 可执行程序
6 application/zip zip winzip
7 application/x-gzip gz gzip
8 image/gif gif GIF图像
9 image/jpeg jpg jpeg jpe JPEG图像
10 image/png png PNG图像
11 text/html html jsp 网页文档
12 2 text/plain txt 文本文档
13 text/xml xml XML文档
14 text/json json JSON字符串

十三、谷歌浏览器查看HTTP协议

首先点击F12:JavaWeb零基础入门之Servlet_第11张图片

注意点:

  1. 到目前为止除了form标签中method=post之外,其余均为GET请求
  2. 标签不一定与标签相邻,只要根据能对应上即可
  3. 默认地址值与工程路径是两个概念,上述只是将默认地址值修改为工程路径,即上述斜杠等代表访问到的是工程路径:http://localhost:8080/工程名,而非默认路径

十四、HttpServletRequest类

  1. HttpServletRequest类的作用:

    • 每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求发来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法中(调用doGet或doPost方法)供编程人员使用,编程人员通过HttpServletRequest对象,可以获取到请求的所有信息
  2. HttpServletRequest类的常用方法:

    • getRequestURI():获取请求的资源路径
    • getRequestURL():获取请求的绝对路径
    • getRemoteHost():获取客户端的ip地址
    • getHeader():获取请求头
    • getParameter():获取请求的参数
    • getParameterValues():获取请求的参数(多个值时使用)
    • getMethod():获取请求的方式(GET或POST)
    • setAttribute(key, value):设置域数据
    • getAttribute(key):获取域数据
    • getRequestDispatcher():获取请求转发对象
  3. 代码示例(在src下创建此类):

    public class RequestAPIServlet extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取请求的资源路径
        String requestURI = request.getRequestURI();
        //2.获取请求的绝对路径
        StringBuffer requestURL = request.getRequestURL();
        //3.获取客户端的ip地址
        String requestRemoteHost = request.getRemoteHost();
        //4.获取请求头
        String requestHeader = request.getHeader("User-Agent");
        //5.获取请求的方式
        String requestMethod = request.getMethod();
        //输出
        System.out.println("requestURI => " + requestURI); /* /MyTest/RequestAPI */
        System.out.println("requestURL => " + requestURL); /* http://localhost:8080/MyTest/RequestAPI */
        System.out.println("请求头 => " + requestHeader); //Mozilla/5.0 (Windows NT 10.0; Win64; x64)...
        System.out.println("请求方式 => " + requestMethod); //GET
        System.out.println("客户端IP地址 => " + requestRemoteHost); //127.0.0.1
            /*在IDEA中,使用localhost访问时得到的客户端ip地址是127.0.0.1
            					 使用127.0.0.1访问时,得到的客户端ip地址是127.0.0.1
                       使用真实ip访问时,得到的客户端地址是真实的客户端ip地址*/
      }
    }
    
  4. 获取请求参数

  5. 代码示例:

    1. 在web目录下创建form.html页面(不可在WEB-INF中创建,无法访问到):

      
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>formtitle>
      head>
      <body>
          <form action="http://localhost:8080/07_servlet/parameterServlet" method="get">
              用户名:<input type="text" name="username"><br/>
              密码:<input type="password" name="password"><br/>
              兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
                       <input type="checkbox" name="hobby" value="Java">Java
                       <input type="checkbox" name="hobby" value="JS">JavaScript<br/>
                       <input type="submit">
          form>
      body>
      html>
      
    2. 在src下创建此类

      public class ParameterServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //doPost方法会出现中文请求乱码问题
          //需要在获取任何参数之前修改字符编码集,而不仅仅获取中文参数时才修改:
          request.setCharacterEncoding("UTF-8");
          //获取请求的参数(此方法参数中放name属性值,得到value属性值)
          String username = request.getParameter("username");
          String password = request.getParameter("password");
          //获取请求的参数的多个值
          String[] hobbies = request.getParameterValues("hobby");
          //输出
          System.out.println("用户名:" + username);
          System.out.println("密码:" + password);
          //将数组转换为集合输出
          System.out.println("兴趣爱好:" + Arrays.asList(hobbies));
        }
      }
      
    3. 运行结果:

JavaWeb零基础入门之Servlet_第12张图片

十五、请求转发

JavaWeb零基础入门之Servlet_第13张图片

代码示例:

  1. 在src下创建此类,并在web.xml中配置相应的数据

    public class Servlet1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取请求的参数(查看办事的材料)
            String username = request.getParameter("username");
            System.out.println("在Servlet1(柜台1)中查看参数(材料):" + username);
            //给材料盖章
            request.setAttribute("key1","柜台1的章");
            //获得通向Servlet2的路径(请求转发对象)
            //参数必须以斜杠打头,斜杠代表http://localhost:8080/工程名/,对应IDEA代码的web目录
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Servlet2");
            //可以转发到WEB-INF目录下:request.getRequestDispatcher("/WEB-INF/xxx");
            //通过得到的路径走向Servlet2(柜台2)
            //forward方法将当前资源的request和response转发到该requestDispatcher指定的资源
            requestDispatcher.forward(request, response);
            //使得Servlet2中的request和response与Servlet1一致
        }
    }
    
  2. 在src下创建此类,并在web.xml中配置相应的数据

    public class Servlet2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取请求的参数(查看办事的材料)
            String username = request.getParameter("username");
            System.out.println("在Servlet2(柜台2)中查看参数(材料):" + username);
            //查看是否有柜台1的章
            Object key1 = request.getAttribute("key1");
            System.out.println("柜台1的章为:" + key1);
            //出处理自己的业务
            System.out.println("Servlet2处理业务");
        }
    }
    
  3. 运行结果:(在浏览器的地址栏中输入:http://localhost:8080/07_servlet/Servlet1?username=jaychou)

    JavaWeb零基础入门之Servlet_第14张图片

  4. 可以得出地址栏的内容不发生变化,但页面自动跳转(访问)到了请求转发对象Servlet2中,即显示http://localhost:8080/07_servlet/Servlet2的页面

十六、base标签的作用

  1. base标签可以设置当前页面中所有相对路径跳转时参照指定的路径来进行跳转,在href属性中设置指定路径
  2. 注:实际开发中都使用绝对路径,而不简单的使用相对路径
  3. 代码示例:
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
    
    <base href="http://localhost:8080/MyTest/a/b/">
head>
<body>
    这是a下的b下的c.html<br/>
    <a href="../../index.html">跳到web下的index.htmla>
body>

十七、"/"在不同情况下的不同意义

  1. “/”若被浏览器解析,得到的地址是:http://ip:port/ 斜杠
  2. “/”若被服务器解析,得到的地址是:http://ip:port/工程路径
    • /servlet1
    • servletContext.getRealPath(“/”);
    • request.getRequestDispatcher(“/”);
  3. 特殊情况:response.sendRedirect(“/”); 把斜杠发送到浏览器解析,得到http://ip:port/

十八、HttpServletResponse类

  1. HttpServletResponse类的作用:
    每次只要有请求进入Tomcat服务器,Tomcat服务器就会创建一个Response对象传递给Servlet程序。HttpServletResponse表示所有响应的信息(HttpServletRequest表示请求发来的信息),可以通过HttpServletResponse对象设置返回给客户端的信息

  2. 两个输出流的说明:

    • 字节流 getOutputStream(); 常用于下载(传递)二进制数据
    • 字符流 getWriter(); 常用于回传字符串
    • 注:同一个HttpServletResponse对象两个流不可同时使用,只可二选一,否则报错:JavaWeb零基础入门之Servlet_第15张图片
  3. 从服务器往客户端(浏览器)回传字符串数据

  4. 代码示例:在src下创建此类并在web.xml中进行配置

    public class ResponseIO extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //防止中文乱码问题,在获取流对象之前调用此方法:
            //同时设置服务器和客户端都使用UTF-8字符集
            response.setContentType("text/html; charset=UTF-8");
            //获取流对象
            PrintWriter writer = response.getWriter();
            writer.write("I Love China!");
        }
    }
    

十九、请求重定向

请求重定向指的是客户端给服务器发送请求,然后服务器通知客户端去访问自己的新地址(之前的地址可能被废弃)叫请求重定向

JavaWeb零基础入门之Servlet_第16张图片

代码示例:

  1. 在src下创建此类并在web.xml中进行配置

    public class Response1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("会访问到Response1");
            //1.设置响应状态码302
            response.setStatus(302);
            //2.设置响应头说明新的地址在哪里
            response.setHeader("Location","http://localhost:8080/MyTest/Response2");
        }
    }
    
  2. 在src下创建此类并在web.xml中进行配置

    public class Response2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().write("Response2's result!");
        }
    }
    
  3. 运行结果:在地址栏输入http://localhost:8080/07_servlet/Response1,得到:

在这里插入图片描述

并在控制台输出:会访问到Response1

  1. 注意:

    • 在Response1中使用以下代码替代两个步骤可得到同样的效果(推荐使用此方法):
      response.sendRedirect(“http://localhost:8080/MyTest/Response2”);
    • 在Response1中request.setAttribute(“key1”, “value1”);
      在Response2中req.getAttribute(“key1”); 无法得到key1的值,结果为null

你可能感兴趣的:(找工作前的自救,JavaWeb学习,servlet,html,tomcat,java)