zoukankan      html  css  js  c++  java
  • 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
    如果博客内容有误,请联系我修改指正,非常感谢! 如果觉得这篇博客对你有用的话,就帮我点个小小的赞吧! 一起加油鸭, 越努力,越幸运!!!
  • 相关阅读:
    502 IPO 上市
    501 Find Mode in Binary Search Tree
    500 Keyboard Row 键盘行
    498 Diagonal Traverse 对角线遍历
    Django_modelform组件
    Django_RBAC_demo2 升级版权限控制组件
    Django admin组件源码流程
    Django_rbac_demo 权限控制组件框架模型
    Django_重装系统后无法使用 sqlite 数据库报错:com.intellij.execution.ExecutionException: Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC
    python_面向对象小试题
  • 原文地址:https://www.cnblogs.com/studywithme/p/13028238.html
Copyright © 2011-2022 走看看