Servlet编写post和get表单
Posted studywithme
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet编写post和get表单相关的知识,希望对你有一定的参考价值。
个人项目地址:https://gitee.com/FaithLong/PracticeCode
题目
让我们先来看看题目吧:
解题思路
分别编写一个post和get表单,抓包查看二者的不同
本项目使用的工具:
-
maven
-
idea
-
Tomcat
项目搭建
该项目为一个maven项目:
-
创建一个空的maven项目
-
填写好信息后点击finish
-
导入web框架依赖
因为没有使用web框架,所以我们在搭建项目时需要导入web框架依赖
在项目名中右键,然后点击Add Framework Support
选中Web Application,点击OK
成功导入Web框架依赖后,发现项目中多出web包
-
导入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>
-
编写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>
-
-
编写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); } }
-
-
配置Tomcat服务器
这里我就不多说了
注意端口号
然后注意项目打上war包就OK了
-
运行项目,分别操作两个表单
1、首先访问get表单
按下F12,我们看抓包结果
发现页面显示error(此处为请求转发方式)
原因是我们输入的账号和密码错误!!!
在这里,我们可以发现,url中出现了我们用户输入的username和password!
下面的返回值出现username和password的值
2、让我们来试试post方法吧!
我们发现页面跳转到success上(此处为重定向方式)
而且状态码为302
在这里,我们可以发现,url中没有出现我们用户输入的username和password!
下面的返回值依然出现username和password的值
总结
先来聊聊post和get请求方式的区别
- GET提交的数据放在URL中,POST则不会。这是最显而易见的差别。这点意味着GET更不安全(POST也不安全,因为HTTP是明文传输抓包就能获取数据内容,要想安全还得加密)
- GET回退浏览器无害,POST会再次提交请求(GET方法回退后浏览器再缓存中拿结果,POST每次都会创建新资源)
- GET提交的数据大小有限制(是因为浏览器对URL的长度有限制,GET本身没有限制),POST没有
- GET可以被保存为书签,POST不可以。这一点也能感受到。
- GET能被缓存,POST不能
- GET只允许ASCII字符,POST没有限制
- 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表单的主要内容,如果未能解决你的问题,请参考以下文章
用form表单想servlet提交数据时,get和post之间的区别是啥?