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

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

  1.同步请求 

  2.异步请求

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

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

做一个简单的案例:

1.新建一个页面login.jsp

<%@ 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>

然后创建一个简易的servlet

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);
    }
}

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

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

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

<%@ 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>

修改servlet:

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");
    }
}

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

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

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

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

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

首先是请求转发的:

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

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

然后将servlet改为请求转发:

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);
    }
}

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

运行结果如下:

修改servlet为重定向:

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");
    }
}

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

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

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

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

运行结果如下:

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

因此可以得出一下结论:

/*两种跳转方式的区别:
 * 请求:
 * 1、跳转到的目标路径后,浏览器地址栏的地址不会改变,还是跳转前的路径地址
 * 2、该种跳转方式是可以带着任何程序需要带过去的参数值到目标路径的
 * 3、该种方式不可以跳转到项目的外部路径
 * 重定向:
 * 1、跳转到目标路径后,浏览器地址栏的地址显示的是最终的目标路径的url地址
 * 2、该种跳转方式没法带参数值到目标路径
 * 3、可以跳转到项目的外部资源路径
 * */

原文地址:https://www.cnblogs.com/Zs-book1/p/11077508.html

时间: 2024-10-30 16:16:13

servlet的同步请求异步请求以及请求转发与重定型的区别的相关文章

在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)

两种请求在请求的Header不同,Ajax 异步请求比传统的同步请求多了一个头参数 1. 传统同步请求参数 accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 accept-charset gb2312,utf-8;q=0.7,*;q=0.7 accept-encoding gzip,deflate accept-language zh-cn,zh;q=0.5 cache-control max-age=0

x-requested-with 请求头 区分ajax请求还是普通请求

在服务器端判断request来自Ajax请求(异步)还是传统请求(同步): 两种请求在请求的Header不同,Ajax 异步请求比传统的同步请求多了一个头参数 1.传统同步请求参数 accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 accept-charset  gb2312,utf-8;q=0.7,*;q=0.7 accept-encoding  gzip,deflate accept-languag

HTTP请求中同步与异步有什么不同

普通的B/S模式就是同步,而AJAX技术就是异步,当然XMLHttpReques有同步的选项. 同步:提交请求->等待服务器处理->处理完毕返回.这个期间客户端浏览器不能干任何事. 异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕. 举个生动的例子吧: 同步就是你叫我去吃饭,我听到了就和你去吃饭:如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭. 异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭.豪享博娱乐

UI13-GET POST 同步,异步-代理 Block请求方式。

http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213 http://project.lanou3g.com/teacher/yihuiyun/lanouproject/activitylist.php 两个接

同步和异步请求

// //  ViewController.m //  UI-NO-18 // //  Created by Bruce on 15/8/13. //  Copyright (c) 2015年 Bruce. All rights reserved. // #import "ViewController.h" #import "InfoModel.h" @interface ViewController () @end @implementation ViewCont

iOS中的请求(GET请求,POST请求,同步请求,异步请求)

1.用到的一些第三方 PostTableViewController.m #import "PostTableViewController.h" @interface PostTableViewController () @property(nonatomic,retain) NSArray *dataArr; @end @implementation PostTableViewController - (void)viewDidLoad { [super viewDidLoad];

[IOS_HTTP]NSURLConnection同步与异步请求

今天看到<WIN32多线程程序设计>的同步控制时,才发现原来自己对同步和异步的概念很模糊,甚至混淆.于是GOOGLE了一下.下面都是高人们的见解,简单明了. 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式.  异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式. 举个不太恰当的例子,就像:  SendMessage(...)  TRACE0("just  like  send");   PostMessage(...) 

关于jquery同步和异步请求问题总结

关于jquery同步和异步请求问题总结 问题 这几天做项目的时候,写脚本遇到一个问题,就是jquery异步请求和同步请求执行顺序不按代码顺序执行而是最后执行导致添加数据报错,添加到空值,这怎么忍,于是我去查找jquery api,终于知道了原来jquery默认异步请求,防止数据卡死,终于让我找到了这货 async,当async: true 时,ajax请求是异步的.当async : true 时,就是同步的,但是我又有个问题,怎么设置,这个在哪设置,用$.ajax去写这个操作,不,不太麻烦了,到

iOS上的http请求:get、post以及同步、异步

1.get: view sourceprint? 01.<span style="font-size:14px;">NSString * URLString = @"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=广东"; 02.NSURL * URL = [NSURL URLWithString:[URLStri