Servlet编写post和get表单

Posted studywithme

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet编写post和get表单相关的知识,希望对你有一定的参考价值。

个人项目地址:https://gitee.com/FaithLong/PracticeCode

题目

让我们先来看看题目吧:

技术图片

解题思路

分别编写一个post和get表单,抓包查看二者的不同

本项目使用的工具:

  • maven

  • idea

  • Tomcat

项目搭建

该项目为一个maven项目:

  1. 创建一个空的maven项目

    技术图片

  2. 填写好信息后点击finish

技术图片

  1. 导入web框架依赖

    因为没有使用web框架,所以我们在搭建项目时需要导入web框架依赖

    在项目名中右键,然后点击Add Framework Support

    技术图片

    选中Web Application,点击OK

    技术图片

    成功导入Web框架依赖后,发现项目中多出web包

    技术图片

  2. 导入servlet的pom依赖

    <dependencies>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>
    
  3. 编写jsp页面

    • success页面(操作成功后会跳转至此页面)

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>success</title>
      </head>
      <body>
      
      <h1>success</h1>
      
      </body>
      </html>
      
    • getPage表单

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Title</title>
          <style>
              h2,form{
                  text-align: center;
              }
          </style>
      </head>
      <body>
      
      <h2>Get方式</h2>
      <form action="${pageContext.request.contextPath}/get" method="get">
          <p>账号:
              <input type="text" name="username">
          </p>
          <p>密码:
              <input type="text" name="password">
          </p>
          <input type="submit" value="提交查询内容">
      </form>
      
      </body>
      </html>
      
    • postPage表单

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Post</title>
          <style>
              h2,form{
                  text-align: center;
              }
          </style>
      </head>
      <body>
      
      <%--form表单中的action操作关联的是servlet中的@WebServlet("/post"),所以两边的url必须相同--%>
      <%--${pageContext.request.contextPath}表示当前项目路径下的/post请求--%>    
      <h2>Post方式</h2>
      <form action="${pageContext.request.contextPath}/post" method="post">
          <p>账号:
              <input type="text" name="username">
          </p>
          <p>密码:
              <input type="text" name="password">
          </p>
          <input type="submit" value="提交查询内容">
      </form>
      
      </body>
      </html>
      
  4. 编写servlet类分别操作get和post表单

    • GetServlet

      package per.hyl.servlet;
      
      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;
      import java.io.PrintWriter;
      
      //操作和Post中的操作大同小异,我就不写了
      
      //@webServlet注解等同于在xml中注册servlet的操作
      @WebServlet("/get")  //这里的/get要与get表单中的/get相同,前面说过
      public class GetServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //1.创建上下文对象
              //web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;
              ServletContext context = this.getServletContext();
      
              //处理后台接收乱码问题
              req.setCharacterEncoding("UTF-8");
              resp.setCharacterEncoding("UTF-8");
      
              String username = req.getParameter("username");
              String password = req.getParameter("password");
      
              System.out.println("========在控制台输出程序运行结果========");
              System.out.println(username);
              System.out.println(password);
      
              //请求转发,跳转到成功页面
              if (username.equals("admin")&&password.equals("123456")){
                  //和post表单里的操作一样,只是变成了请求转发的方式
                  context.getRequestDispatcher("/success.jsp").forward(req,resp);
              }else {
                  PrintWriter writer = resp.getWriter();
                  writer.print("error");
              }
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      
    • PostServlet

      package per.hyl.servlet;
      
      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;
      import java.io.PrintWriter;
      
      //post请求方式和get请求方式最大的不同就是post请求方式的url中不会出现提交的数据,比较安全,
      //而get请求方式效率高,但不安全
      @WebServlet("/post")
      public class PostServlet extends HttpServlet {
      
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //1.设置处理编码,防止乱码
              req.setCharacterEncoding("UTF-8");
              resp.setCharacterEncoding("UTF-8");
      
              //2.服务器得到用户请求,获取用户表单中提交的username和password的值
              String username = req.getParameter("username");
              String password = req.getParameter("password");
      
              //3.如果用户输入username和password,则将用户输入的值输出至控制台
              System.out.println("=======在控制台输出程序运行结果======");
              System.out.println(username);
              System.out.println(password);
      
              //4.请求重定向,跳转到成功页面
      
              //5.如果用户输入的账号为root,密码为123456,则跳转到success.jsp页面
              if (username.equals("root")&&password.equals("123456")){
                  //服务器的响应为重定向到success.jsp页面
                  //success.jsp前面的/代表当前项目路径web下的页面
                  resp.sendRedirect("/success.jsp");
              }else {
                  //PrintWriter是向文本输出流打印对象的格式化表示形式
                  //如果用户输入的账号和密码错误,则会在页面中显示error字符串
                  PrintWriter writer = resp.getWriter();
                  writer.print("error");
              }
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      
  5. 配置Tomcat服务器

    这里我就不多说了

    注意端口号

    技术图片

    然后注意项目打上war包就OK了

    技术图片

  6. 运行项目,分别操作两个表单

    1、首先访问get表单

    技术图片

    按下F12,我们看抓包结果

    技术图片

    发现页面显示error(此处为请求转发方式)

    原因是我们输入的账号和密码错误!!!

    在这里,我们可以发现,url中出现了我们用户输入的username和password!

    下面的返回值出现username和password的值

    2、让我们来试试post方法吧!

    技术图片

    我们发现页面跳转到success上(此处为重定向方式)

    而且状态码为302

    在这里,我们可以发现,url中没有出现我们用户输入的username和password!

    下面的返回值依然出现username和password的值

总结

先来聊聊post和get请求方式的区别

  1. GET提交的数据放在URL中,POST则不会。这是最显而易见的差别。这点意味着GET更不安全(POST也不安全,因为HTTP是明文传输抓包就能获取数据内容,要想安全还得加密
  2. GET回退浏览器无害,POST会再次提交请求(GET方法回退后浏览器再缓存中拿结果,POST每次都会创建新资源
  3. GET提交的数据大小有限制(是因为浏览器对URL的长度有限制,GET本身没有限制),POST没有
  4. GET可以被保存为书签,POST不可以。这一点也能感受到。
  5. GET能被缓存,POST不能
  6. GET只允许ASCII字符,POST没有限制
  7. GET会保存再浏览器历史记录中,POST不会。这点也能感受到。

总之,两者之间没有本质区别,区别就在于数据存储的位置。各自有适用环境,根据需求选择合适的方法即可。

重定向和转发的区别

重定向:

B一个web资源收到客户端A请求后,B他会通知A客户端去访问另外一个web资源C,这个过程叫重定向

转发:

比如说你是A,你想访问B,B把你的请求转发给了C,所以现在就由C来处理你的请求,当C处理完后,C再把请求转发给B,B最后把请求交给你,从始至终,C都没有露面,C是一个潜伏者,所以没有发生页面的跳转(交互动作都只在你和B之间

详情请见下图:

技术图片

面试题:请你谈谈重定向和转发的区别?

相同点

  • 页面都会实现跳转

不同点

  • 请求转发的时候,url不会产生变化 307
  • 重定向时候,url地址栏会发生变化; 302

以上是关于Servlet编写post和get表单的主要内容,如果未能解决你的问题,请参考以下文章

servlet表单中get和post方法的区别

用form表单想servlet提交数据时,get和post之间的区别是啥?

在java中写jsp网页和servlet中,form表单的提交方法get与post的区别?

servlet表单的get和post方法的实现

Servlet表单数据

表单提交中get和post方式的区别