标签:提交 get 存储 doget 服务 ESS repos jsp extends
个人项目地址: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的值
总之,两者之间没有本质区别,区别就在于数据存储的位置。各自有适用环境,根据需求选择合适的方法即可。
重定向:
B一个web资源收到客户端A请求后,B他会通知A客户端去访问另外一个web资源C,这个过程叫重定向
转发:
比如说你是A,你想访问B,B把你的请求转发给了C,所以现在就由C来处理你的请求,当C处理完后,C再把请求转发给B,B最后把请求交给你,从始至终,C都没有露面,C是一个潜伏者,所以没有发生页面的跳转(交互动作都只在你和B之间)
详情请见下图:
面试题:请你谈谈重定向和转发的区别?
相同点
不同点
标签:提交 get 存储 doget 服务 ESS repos jsp extends
原文地址:https://www.cnblogs.com/studywithme/p/13028238.html