Javaweb基础学习总结(6) ——Servlet

6.1 Servlet简介

  • 是sun公司开发动态web的一门技术
    • 是Java中的一个接口,这个接口就叫Servlet
  • 动态web:不同人不同的页面数据
  • 如果想要开发一个Servlet程序只需要两个步骤
    • 创建一个类实现接口Servlet
    • 将开发好的Servlet部署到服务器上
  • 我们把实现了Servlet接口的Java程序称为一个Servlet

6.2 HttpServlet

​ sun公司给出了两个servlet的实现类,其中一个就是HttpServlet,所以我们在实现servlet的时候直接去继承HttpServlet也是可以的

​ 另一个实现类为GenericServlet

  1. 构建一个普通的maven项目,删除里面的src文件夹,以后我们学习的时候就在这个项目里面建立module,这个空的工程就是maven主工程
  • 这么做的好处就是后面创建的项目都是在这个maven项目的基础上创建的子项目,这些子项目称为主项目/工程的一个module,这些module就可以复用主工程中的maven仓库,这就节约了我们每次都需要创建一个新项目,还要重新为这个新项目配置pom.xml的时间
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  1. 关于maven父子工程的理解
 <!--主项目-->
	<modules>
        <module>Servlet-01</module>
    </modules>
 <!--子项目-->
	<parent>
        <artifactId>javaweb-02-servlet</artifactId>
        <groupId>com.thhh</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

主项目中的jar包子项目可以直接使用,而子项目中的jar包,主项目不能直接使用

主项目和子项目之间的关系就和Java中的子类继承父类是一样的
    父类有的我都有,我扩展的只有我自己有,父类取不到
  1. Maven环境优化
  • 修改web.xml为和当前tomcat最匹配的

​ 创建好了子module之后,由于子module是使用IDEA的maven模板创建的,所以它的web.xml版本比较低,所以我们首先需要更新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"
  metadata-complete="true">
</web-app>
  • 将maven结构搭建完整

​ 然后将使用模板创建的maven项目结构补全,即创建java文件夹和resources文件夹(maven规则大于配置)
在这里插入图片描述

  1. 编写一个servlet程序
    在这里插入图片描述
    ①编写一个普通类
    ②实现servlet接口 —— 直接继承HttpServlet
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    其实在开发中我们基本只使用doGet()/doPost(),所以在实现HttpServlet抽象类的时候,我们只覆写这个两个方法即可
    在这里插入图片描述
    注意:get和post只是客户端向服务器请求数据的两种不同方式(即来的路不同),在服务器端其实可以使用同一套代码对其进行响应(条条大路通罗马,其中大路就是客户端请求方式,罗马始终只有一个,即我们使用的响应代码可以使用同一个)
    在这里插入图片描述
//实现
package com.thhh.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;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.print("HELLO SERVLET!");
        writer.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  1. 编写servlet的映射

    为什么需要映射

    ​ 我们写的是Java程序,但是我们需要通过浏览器对数据进行访问,而浏览器只会去和web服务器交互,所以想要从浏览器中请求到我们写的Java程序,我们就需要将我们写的Java程序注册到服务器上去,并给它一个访问的路径
    在这里插入图片描述

  2. 配置tomcat
    在这里插入图片描述

  3. 启动测试
    在这里插入图片描述
    原理:

​ 浏览器地址栏输入servlet的请求地址–>web.xml–>找到servlet的路径–>进入servlet这个Java程序中,并执行它–>输出

6.3 Servlet原理

在这里插入图片描述
​ 注意:服务器本身就是一堆硬件资源,这些硬件资源一般都会配备linux的OS,而我们的tomcat就是运行在Linux之上的一个程序软件,只是这个软件的功能是监听服务器的8080端口,然后处理和响应客户端的请求,所以上图的一切都应该是在WEB容器中发生的

​ 上图中的流程都是在容器中自动发生了,对我们是不可见的,所以我们在使用的时候没有什么感觉,但是我们需要了解它的原理

6.4 Mapping问题

在这里插入图片描述

  1. 一个请求可以指定一个映射路径
    <servlet-mapping>
        <servlet-name>HELLOSERVLET</servlet-name>
        <url-pattern>/helloservlet</url-pattern>
    </servlet-mapping>
  1. 一个请求可以指定多个映射路径
<!--servlet-name都相同,只是url-pattern不同-->
	<servlet-mapping>
        <servlet-name>HELLOSERVLET</servlet-name>
        <url-pattern>/helloservlet1</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>HELLOSERVLET</servlet-name>
        <url-pattern>/helloservlet2</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>HELLOSERVLET</servlet-name>
        <url-pattern>/helloservlet3</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>HELLOSERVLET</servlet-name>
        <url-pattern>/helloservlet4</url-pattern>
    </servlet-mapping>
  1. 一个请求可以指定通用映射路径
    <servlet-mapping>
        <servlet-name>HELLOSERVLET</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
  1. 默认请求路径
    <servlet-mapping>
        <servlet-name>HELLOSERVLET</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
<!--使用这个映射的效果就是它会将index.jsp顶替了
即这个映射的效果就是设置默认请求路径-->
  1. 指定一些后缀或前缀
<!--*前面什么都不能加-->
    <servlet-mapping>
        <servlet-name>HELLOSERVLET</servlet-name>
        <url-pattern>*.hello</url-pattern>
    </servlet-mapping>
  1. web.xml中servlet映射的优先级问题

    指定了明确的mapping映射的优先级最高,如果找不到指定的mapping的servlet,才会去找/*的mapping映射

  • 指定404页面
    <!--404页面-->
    <servlet>
        <servlet-name>Error</servlet-name>
        <servlet-class>com.thhh.servlet.ErrorServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Error</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

​ 按照优先级原则,只要用户输入的地址映射存在,那么用户将跳转到指定的页面;如果用户输入的地址映射不存在,那么用户将被跳转到我们指定的404页面

6.5 ServletContext对象

在这里插入图片描述
​ 上下文:就是两个相同类型页面之间做一个连接

​ WEB容器在启动的时候,会为每一个WEB程序创建一个对应的ServletContext对象,它代表了当前的这个WEN应用

用途:

  • 共享数据

    • 共享数据说的是一个项目只会有一个ServletContext对象,这个对象被所有的servlet程序共享,一个servlet程序向ServletContext存放的数据另一个Servlet程序可以获取到
  //向ServletContext中存数据
  package com.thhh.servlet;
  
  import javax.servlet.ServletContext;
  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 HelloServlet extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          ServletContext context = this.getServletContext();//通过当前servlet对象获取ServletContext对象
    /*      context.setRequestCharacterEncoding("utf-8");*/
          context.setAttribute("username","zhangsan");
  
      }
  
  
      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          doGet(req, resp);
      }
  }
 //从ServletContext中取数据
 package com.thhh.servlet;
 
 import javax.servlet.ServletContext;
 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;
 
 public class GetServlet extends HttpServlet {
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         ServletContext context = this.getServletContext();
         String username = (String)context.getAttribute("username");
         resp.setContentType("text/html");
         resp.setCharacterEncoding("utf-8");
         PrintWriter writer = resp.getWriter();
         writer.print("<h3>姓名 = "+username+"</h3>");
         writer.close();
     }
 
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         doGet(req, resp);
     }
 }
 <!--项目的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"
          metadata-complete="true">
         <servlet>
           <servlet-name>helloservlet</servlet-name>
           <servlet-class>com.thhh.servlet.HelloServlet</servlet-class>
         </servlet>
         <servlet-mapping>
           <servlet-name>helloservlet</servlet-name>
           <url-pattern>/hello</url-pattern>
         </servlet-mapping>
 
         <servlet>
           <servlet-name>getservlet</servlet-name>
           <servlet-class>com.thhh.servlet.GetServlet</servlet-class>
         </servlet>
         <servlet-mapping>
           <servlet-name>getservlet</servlet-name>
           <url-pattern>/get</url-pattern>
         </servlet-mapping>
 </web-app>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMLbAiXN-1599665552834)(00 web的基本概念.assets/image-20200830155744240.png)]
先访问第一个servlet,使它向ServletContext中存数据
在这里插入图片描述
​ 再访问第二个servlet,使它从ServletContext中取数据

  • 获取初始化参数

再web.xml中为context配置一些参数

    <context-param>
        <param-name>DBURL</param-name>
        <param-value>jdbc:mysql://localhost:3306/DBName</param-value>
    </context-param>
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("DBURL");
        resp.getWriter().print(url);
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9qljKPI-1599665583497)(00 web的基本概念.assets/image-20200830172452149.png)]

  • 请求转发
    • 注意,我们调用的转发方法
      • context.getRequestDispatcher():传入转发的路径,获取转发对象
      • forward(req, resp):调用这个转发对象的该方法才会执行转发操作,传入req, resp原因就是当前页面只是中间的一个转发处,它不处理任何请求,而客户端的请求和响应对象应该传给真正做数据处理的servlet处理,所以需要传入req, resp
   //转发servlet
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        context.getRequestDispatcher("/sd3").forward(req, resp);
    }
 <!--WEB.XML配置-->
	<servlet>
        <servlet-name>sd4</servlet-name>
        <servlet-class>com.thhh.servlet.ServletDemo04</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>sd4</servlet-name>
        <url-pattern>/sd4</url-pattern>
    </servlet-mapping>

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

  • 读取资源文件

    创建资源文件
    在这里插入图片描述

username=zhangsan
password=123

​ 读取资源文件可以使用properties对象

​ 使用这个方法的load()即可加载文件数据,但是它要求传入的数据是一个数据流,所以我们就可以使用context对象的getResourceAsStream(“文件路径”)来获取文件的数据流

​ 然后再将其传入properties.load()中

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties properties = new Properties();
        properties.load(in);
        String username = properties.getProperty("username");
        String pwd = properties.getProperty("password");
        resp.getWriter().print("username = "+username+"\t"+"pwd = "+pwd);
    }

​ 访问该servlet
在这里插入图片描述
注意

​ 在获取资源的时候我们传入的路径是一个相对路径,那么这个相对路径怎么确定的呢?

​ 首先使用IDEA发布在Tomcat上的项目都会生成一个target文件,这个文件下的war包就是发布到tomcat上的这个WEB应用程序
在这里插入图片描述
    上面的Servlet-02-1.0-SNAPSHOT是解压状态下的Servlet-02-1.0-SNAPSHOT.war是压缩的javaweb程序

    所以我们可以通过观察Servlet-02-1.0-SNAPSHOT下的目录结构来判断应该怎么获取资源文件的相对位置

    在前面我们也说过,servletContent对象就代表了这个WEB程序,所以使用这个对象获取资源文件的时候,其实路径就是Servlet-02-1.0-SNAPSHOT
在这里插入图片描述
    所以资源文件的相对的路径就为:/WEB-INF/classes/db.properties

​ properties

  • 在java文件夹下创建一个properties文件

  • 在resources文件夹下创建一个properties文件

    可以发现,在发布的WEB程序中,所有的java文件和资源文件都被打包在同一个文件夹下,这个文件夹就是classes,我们俗称classes的路径为classpath
    在这里插入图片描述

  • ​ 从上图我我们就可以看出为什么maven项目要求我们创建一个java包和一个resources包,为的就是程序可以自动为我们生成一个classes文件夹,这个文件夹里面有我们在java文件夹中和resources文件夹中写的所有文件

6.6 HttpServletResponse对象

1.简单分类

​ 在前面的servlet原理我们就说过了,服务器应用程序在服务器上运行,当接收到客户端一个请求的时候,容器就会为这个请求创建一个HttpServletRequest对象(获取客户端传给服务器的参数)和HttpServletResponse对象(存储服务器给客户端的响应)

​ 这个对象内部的方法有很多,我们只挑选其中一部分讲解

  1. 负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
  1. 负责向浏览器发送响应头的方法
   void setCharacterEncoding(String var1);

    void setContentLength(int var1);

    void setContentLengthLong(long var1);

    void setContentType(String var1);

    void setDateHeader(String var1, long var2);
  1. 响应的状态码
    int SC_CONTINUE = 100;
    int SC_SWITCHING_PROTOCOLS = 101;
    int SC_OK = 200;
    int SC_CREATED = 201;
    int SC_ACCEPTED = 202;
    int SC_NON_AUTHORITATIVE_INFORMATION = 203;
    int SC_NO_CONTENT = 204;
    int SC_RESET_CONTENT = 205;
    int SC_PARTIAL_CONTENT = 206;
    int SC_MULTIPLE_CHOICES = 300;
    int SC_MOVED_PERMANENTLY = 301;
    int SC_MOVED_TEMPORARILY = 302;
    int SC_FOUND = 302;
    int SC_SEE_OTHER = 303;
    int SC_NOT_MODIFIED = 304;
    int SC_USE_PROXY = 305;
    int SC_TEMPORARY_REDIRECT = 307;
    int SC_BAD_REQUEST = 400;
    int SC_UNAUTHORIZED = 401;
    int SC_PAYMENT_REQUIRED = 402;
    int SC_FORBIDDEN = 403;
    int SC_NOT_FOUND = 404;
    int SC_METHOD_NOT_ALLOWED = 405;
    int SC_NOT_ACCEPTABLE = 406;
    int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
    int SC_REQUEST_TIMEOUT = 408;
    int SC_CONFLICT = 409;
    int SC_GONE = 410;
    int SC_LENGTH_REQUIRED = 411;
    int SC_PRECONDITION_FAILED = 412;
    int SC_REQUEST_ENTITY_TOO_LARGE = 413;
    int SC_REQUEST_URI_TOO_LONG = 414;
    int SC_UNSUPPORTED_MEDIA_TYPE = 415;
    int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    int SC_EXPECTATION_FAILED = 417;
    int SC_INTERNAL_SERVER_ERROR = 500;
    int SC_NOT_IMPLEMENTED = 501;
    int SC_BAD_GATEWAY = 502;
    int SC_SERVICE_UNAVAILABLE = 503;
    int SC_GATEWAY_TIMEOUT = 504;
    int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
  • 2XX:请求响应成功
  • 3XX:请求重定向
    • 重定向:请求A.HTML,A.HTML让我们去请求B.HTML
  • 4XX:找不到资源/资源不存在
  • 5XX:服务器代码错误
    • 502:网关错误
2.常见应用(文件下载)
  • 向浏览器输出消息
  • 下载文件
    • 获取下载文件的URL
    • 获取下载文件的名称名称
    • 设置浏览器使它能够支持下载我们需要的东西
    • 获取下载文件的输入流
    • 创建缓冲区
    • 获取outputstream对象
    • 将fileoutputstream流写入到buffer缓冲区
    • 将outputstream将缓冲区中的数据输出到客户端
package com.thhh.servlet;
/**
 *  实现网络文件下载
 */

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

public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//                - 获取下载文件在服务器上的URL
        String url = "D:\\IntelliJ-IDEA-2020-workspace\\javaweb-02-servlet\\Servlet-02\\target\\Servlet-02-1.0-SNAPSHOT\\WEB-INF\\classes\\bilibili.png";
        System.out.println("下载路径 = "+url);
//                - 获取文件的名称,作为下载的文件的名称
        String fileName = url.substring(url.lastIndexOf("\\")+1);
        System.out.println("文件名称 = "+fileName);
//                - 设置浏览器使它能够支持下载我们需要的东西,就是设置浏览器的响应头,让它知道这是一个下载响应
        resp.setHeader("Content-Disposition", "attachment;"+"filename="+fileName );
//                - 获取下载文件的输入流,用于服务器读取文件
        InputStream in = new FileInputStream(url);
//                - 创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
//                - 获取outputstream对象,用于服务器输出文件
        ServletOutputStream out = resp.getOutputStream();
//                - 将fileoutputstream流写入到buffer缓冲区
        while(((len = in.read(buffer))!=-1)){
            out.write(buffer,0,len);
        }
//                - 将outputstream将缓冲区中的数据输出到客户端
        in.close();
        out.close();

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print("文件下载中请稍后..");
        writer.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
    <servlet>
        <servlet-name>sd4</servlet-name>
        <servlet-class>com.thhh.servlet.ServletDemo04</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>sd4</servlet-name>
        <url-pattern>/sd4</url-pattern>
    </servlet-mapping>

在这里插入图片描述
在这里插入图片描述
​ 注意:当文件名称为中文的时候,我们下载的文件名称就会混乱,所以我们需要使用一个工具类URLEncoder.encode(fileName,“UTF-8”),参数1为原来读出来的名称,参数2为将它转为什么编码格式,这样就能保证下载的文件即使是中文,名称也不会混乱

  • 实现重定向
    void sendRedirect(String var1) throws IOException;

在这里插入图片描述

​ 一个WEB资源B收到客户端A请求之后,它会告诉客户端去访问另外一个WEB资源C,这个过程就叫重定向

​ 常见场景

  1. 用户登陆
package com.thhh.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 RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("/resp/rst");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
package com.thhh.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;

public class RedirectServletTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.print("HELLO SERVLET!");
        writer.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<servlet>
  <servlet-name>RedirectServlet</servlet-name>
  <servlet-class>com.thhh.servlet.RedirectServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>RedirectServlet</servlet-name>
  <url-pattern>/rs</url-pattern>
</servlet-mapping>

<servlet>
  <servlet-name>RedirectServletTest</servlet-name>
  <servlet-class>com.thhh.servlet.RedirectServletTest</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>RedirectServletTest</servlet-name>
  <url-pattern>/rst</url-pattern>
</servlet-mapping>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTVchVAQ-1599665827657)(00 web的基本概念.assets/image-20200831111701212.png)]
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.6 面试题

转发和重定向的区别

  • 相同点:页面都会实现跳转
  • 不同点
    • 转发的URL不会发生变化
    • 重定向的URL会变化
package com.thhh.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 RequestTest extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          resp.setContentType("text/html");
          resp.setCharacterEncoding("utf-8");
          System.out.print(req.getParameter("username"));
          System.out.print(req.getParameter("password"));
          resp.sendRedirect("/resp/success.jsp");
      }

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

  }

  <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  
  <html>
  <body>
      <h1>SUCCESS</h1>
  </body>
  </html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<html>
<body>
<form action="${pageContext.request.contextPath}/login" method="get">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit">
</form>
</body>
</html>

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

6.7 HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过HTTP协议向服务器请求数据/访问服务器,HTTP请求中的所有信息将会风封装到HttpServletRequest对象中,服务器就是通过这个对象中的方法来获取客户端所有信息的
1、获取前端传递的参数

在这里插入图片描述
​ 上面的4个方法,我们只需要使用第1和第4个即可,第2和3个基本不使用

​ 方法1返回String,方法4返回String[ ]

2、请求转发

上面两点使用一个例子演示

//后台处理servlet
package com.thhh.servlet;

import javax.servlet.ServletContext;
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.util.Arrays;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");//获取集合数据
        System.out.println(username);
        System.out.println(password);
        System.out.println("==========================");

        System.out.print(Arrays.toString(hobbys));

        //通过请求转发
       /* req.getRequestDispatcher("/success.jsp").forward(req,resp);*/
        resp.sendRedirect("/req/success.jsp");
/*        ServletContext context = this.getServletContext();
        context.getRequestDispatcher("/success.jsp").forward(req, resp);*/
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<%--登陆页面--%>
<%--
  Created by IntelliJ IDEA.
  User: 18784
  Date: 2020/9/2
  Time: 10:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
    <body>
        <h1>登陆</h1>
        <%--POST方式提交表单,提交到/login对应的servlet中--%>
        <form action="${pageContext.request.contextPath}/login" method="post">
            用户名:<input type="text" name="username"><br>
            密码:<input type="password" name="password"><br>
            <%--多选框--%>
            爱好:
            <input type="checkbox" name="hobbys" value="女孩">女孩
            <input type="checkbox" name="hobbys" value="代码">代码
            <input type="checkbox" name="hobbys" value="唱歌">唱歌
            <input type="checkbox" name="hobbys" value="电影">电影

            <input type="submit">
        </form>
    </body>
</html>
<%--登陆成功页面--%>
<%--
  Created by IntelliJ IDEA.
  User: 18784
  Date: 2020/9/2
  Time: 10:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>SUCCESS!</h2>
</body>
</html>
<!--SERVLET映射配置-->
<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"
         metadata-complete="true">
    <servlet>
        <servlet-name>Login</servlet-name>
        <servlet-class>com.thhh.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
</web-app>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:到现在我们学习了3种转发+重定向

  1. req.getRequestDispatcher("/success.jsp").forward(req,resp);
    //使用req进行请求转发——URL不变
    
  2. resp.sendRedirect("/req/success.jsp");
    //使用resp重定向——URL改变
    
  3. ServletContext context = this.getServletContext();
    context.getRequestDispatcher("/success.jsp").forward(req, resp);
    //使用ServletContext进行请求转发——URL不变
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值