在javaWeb阶段,前端页面发送请求有两种:

  1.同步请求 

  2.异步请求

同步请求与异步请求的区别是:同步请求跳转界面,异步请求只传递数据,不会跳转界面

(即使用同步请求,servelt响应的是一个界面,前台需要加载这个新的界面的图片样式脚本等诸多资源,而是用异步请求的话,只传递数据,不会刷新资源)

做一个简单的案例:

1.新建一个页面login.jsp

servlet的同步请求异步请求以及请求转发与重定型的区别_异步请求servlet的同步请求异步请求以及请求转发与重定型的区别_html_02

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="ServletDemo1">
用户名:<input type="username">
密码:<input type="password">
<input type="submit">
</form>
</body>
</html>

View Code

然后创建一个简易的servlet

servlet的同步请求异步请求以及请求转发与重定型的区别_异步请求servlet的同步请求异步请求以及请求转发与重定型的区别_html_02

package com.zs.servlet;

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;

@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}

View Code

运行tomcat后,在浏览器输入login网页地址打开网页,然后打开F12,找到网络后点击发送可以看到如下页面

servlet的同步请求异步请求以及请求转发与重定型的区别_异步请求_05

选中发送的请求,点开后可以看到如下页面:

servlet的同步请求异步请求以及请求转发与重定型的区别_html_06

 可以看出,响应的是一个页面,同步请求响应的是页面,下面的是响应的页面的源代码,而是用异步请求的话,不会刷新网页,只是传递数据,响应只有数据。下面 使用ajax来实现异步请求,还是使用之前的login.jsp页面,修改表单为发送异步请求:

servlet的同步请求异步请求以及请求转发与重定型的区别_异步请求servlet的同步请求异步请求以及请求转发与重定型的区别_html_02

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%--需要导入jquery包--%>
<script src="jquery-1.8.3.min.js"></script>
</head>
<body>
<form>
用户名:<input type="text" name="username" id="username">
密码:<input type="password" name="password" id="password">
<input type="button" onclick="check()" value="登录">
</form>
<script>
function check() {
$.post("/servletbk/ServletDemo1",
{"username":username.value,
"password":password.value},
function(data){
console.log(data)
})
}
</script>
</body>
</html>

View Code

修改servlet:

servlet的同步请求异步请求以及请求转发与重定型的区别_异步请求servlet的同步请求异步请求以及请求转发与重定型的区别_html_02

package com.zs.servlet;

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;

@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("hello world");
}
}

View Code

然后再次输入表单发送请求并查看请求的响应

servlet的同步请求异步请求以及请求转发与重定型的区别_html_11

可以看出,响应只有数据,不刷新页面了,还是原来的页面,使用异步请求的方式为用户节省了流量,避免了多次加载网页的内容。

在同步请求中,有两种响应方式,一种是请求转发,一种是重定向。

请求转发与重定向的区别:

还是以具体的案例来说明:

首先是请求转发的:

新建一个index.jsp作为跳转的页面:

servlet的同步请求异步请求以及请求转发与重定型的区别_异步请求servlet的同步请求异步请求以及请求转发与重定型的区别_html_02

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
${user}
</body>
</html>

View Code

然后将servlet改为请求转发:

servlet的同步请求异步请求以及请求转发与重定型的区别_异步请求servlet的同步请求异步请求以及请求转发与重定型的区别_html_02

package com.zs.servlet;

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;

@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("user","111111");
req.getRequestDispatcher("index.jsp").forward(req, resp);
}
}

View Code

运行服务器,浏览器输入请求地址   http://localhost:8080/servletbk/ServletDemo1

运行结果如下:

servlet的同步请求异步请求以及请求转发与重定型的区别_html_16

修改servlet为重定向:

servlet的同步请求异步请求以及请求转发与重定型的区别_异步请求servlet的同步请求异步请求以及请求转发与重定型的区别_html_02

package com.zs.servlet;

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;

@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("user","111111");
resp.sendRedirect("index.jsp");
}
}

View Code

然后再次发送请求结果如下:

servlet的同步请求异步请求以及请求转发与重定型的区别_java_19

我们可以注意到:使用请求转发后,地址栏发生了变化,但是共享数据内的数据没有传递过来,

我们再次修改请求转发的地址以及重定向的地址:

servlet的同步请求异步请求以及请求转发与重定型的区别_java_20

运行后可以跳转到百度的网页,使用请求转发时:

servlet的同步请求异步请求以及请求转发与重定型的区别_异步请求_21

运行结果如下:

servlet的同步请求异步请求以及请求转发与重定型的区别_java_22

可以注意到,页面报错404,找不到页面,错误原因是找不到/servletbk下的/http:www.baidu.com,因此可以知道请求转发时转发的地址是拼接在绝对地址上的,也就是说只能访问当前项目下的地址,不能访问外部地址。

因此可以得出一下结论:


/*两种跳转方式的区别:

 * 请求:

 * 1、跳转到的目标路径后,浏览器地址栏的地址不会改变,还是跳转前的路径地址

 * 2、该种跳转方式是可以带着任何程序需要带过去的参数值到目标路径的

 * 3、该种方式不可以跳转到项目的外部路径

 * 重定向:

 * 1、跳转到目标路径后,浏览器地址栏的地址显示的是最终的目标路径的url地址

 * 2、该种跳转方式没法带参数值到目标路径

 * 3、可以跳转到项目的外部资源路径

 * */