- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
请求的转发
请求转发的特点
base标签
演示程序不能跳回来的情况
运行结果:
到位分析:
Web中的相对路径和绝对路径
相对路径:
绝对路径:
web中/ 斜杆的不同意义
HttpServletResponse类
HttpServletResponse类的作用
两个输出流的说明
往客户端回传数据
中文乱码问题
第一种方式:
第二种方式:
第三种方式:
请求重定向
第一种方式
请求重定向的特点
第二种方式
请求的转发是指从一个资源跳转到另一个资源的操作叫做请求的转发
创建两个类servlet1和servlet2继承HttpServlet
Servlet1类下:
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求的参数(办事的材料)查看
String username=request.getParameter("username");
System.out.println("在Servlet1(柜台1)查看参数(材料)"+username);
//设置域数据(给材料盖个章,并传递到Servlet2(柜台2)中去查看)
request.setAttribute("key1", "柜台1的章");
//问路:Servlet2怎么走
/**
* 请求转发必须要以斜杆/开头,/ 斜杆表示地址为http://ip:port/工程名/ 映射到idea中是web目录
*/
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");
//走向Servlet2(柜台2)
requestDispatcher.forward(request, response);
}
}
servlet2类下:
public class Servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求的参数(办事的材料)查看
String username=request.getParameter("username");
System.out.println("在Servlet2(柜台2)查看参数(材料)"+username);
//查看柜台1是否有盖章
Object key1 = request.getAttribute("key1");
System.out.println("柜台1是否有章:"+key1);
//处理自己的业务
System.out.println("Servlet2处理自己的业务");
}
}
运行访问http://localhost:8080/03_servlet/servlet1
运行结果:
在访问栏中加入参数 ?后面都是参数
回车得:
1、浏览器地址栏没有变化(一直都是工程名/servlet1)
2、他们试一次请求
3、可以共享Request域中的数据(域数据在整个工程都能访问)
4、可以转发到WEB-INF目录下(WEB-INF受服务器保护,不能通过客户端(浏览器)直接访问可以通过服务器中的资源间接访问)
5、不能访问工程以外的资源(因为他是从工程下找的,工程下没有的一律访问不了)
在类Servlet1中
地址访问:
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/form.html");
创建一个类ForwardC继承HttpServlet类
public class ForwardC extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("经过了Forward程序");
req.getRequestDispatcher("/a/b/c.html").forward(req, resp);
}
}
在web.xml中配置
<servlet>
<servlet-name>ForwardC</servlet-name>
<servlet-class>com.servlet.ForwardC</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ForwardC</servlet-name>
<url-pattern>/forwardC</url-pattern>
</servlet-mapping>
在web目录下创建如图所示
在c目录下写
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是一个c页面</title>
</head>
<body>
<a href="../../index.html">返回首页</a>
</body>
</html>
在index.html下写
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是web下的index.html<br>
<a href="a/b/c.html">a/b/c.html</a><br>
<a href="http://localhost:8080/03_servlet/forwardC">请求转发:a/b/c.html</a>
</body>
</html>
运行之后:
我们前面也说过,只写到工程名默认访问index页面
我们发现点击上下两个都可以成功跳转
虽然都成功跳转了,但是地址明显不同,因为我们在c.html下写的是../../index.html,
前者(第一个),localhost:8080/03_servlet/a/b/c.html,经过../../跳转可以到web工程下,正好web下有index.html,所以会跳转成功。
**后者(第二个 ),**localhost:8080/03_servlet/forwardC,经过../../跳转就会跳到src目录下,而src目录下显然没有index.html页面,故会失败。(结构是:src/com/servlet/Forward)
**图示: **
当我们加入base标签后,浏览器就会以这个base标签的为最终地址。
base标签一般加在title之下
<base href="http://localhost:8080/03_servlet/a/b/c.html">
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是一个c页面</title>
<base href="http://localhost:8080/03_servlet/a/b/c.html">
</head>
<body>
<a href="../../index.html">返回首页</a>
</body>
</html>
这样就解决了后者不能调到首页的问题。
在javaWeb中,路径分为相对路径和绝对路径两种:
. 表示当前目录
**.. ** 表示上一级目录
**资源名 ** 表示当前目录/资源名
http://ip:port/工程路径/资源路径
在web中/ 斜杆是一种绝对路径。
/ 斜杆如果被浏览器解析,得到的地址是:http://ip:port/
<a href="/">斜杆的意义</a>
/ 斜杆如果被服务器解析,得到的地址是:http://ip:port/工程路径
1、<url-pattern>/servlet1<url-pattern>
2、servletContext.getRealPath("/");
3、request.getRequestDispatcher("/")
特殊情况:response.sendRediect("/");把斜杆发送给浏览器解析,得到http://ip:port/
HttpServletResponse类和HttpServRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用,HttpServletRequest表示过来的信息,HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象进行设置
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个。否则报错
创建一个类ResponIOServlet:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseIOServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer=response.getWriter();
writer.write("AiQingShuiXingL");
}
}
web.xml配置,运行之后:
设置 response.setCharacterEncoding("GBK");就可以解决中文在浏览器显示乱码问题
public class ResponseIOServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(response.getCharacterEncoding());//默认是字符集是ISO-8859-1,不支持中文
//设置字符集为GBK
response.setCharacterEncoding("GBK");
PrintWriter writer=response.getWriter();
writer.write("爱情睡醒了");
}
public class ResponseIOServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(response.getCharacterEncoding());//默认是字符集是ISO-8859-1,不支持中文
//设置字符集为UTF—8
response.setCharacterEncoding("UTF-8");
//告诉浏览器也设置UTF-8即可
response.setHeader("Content-Type", "text/html;charset=UTF-8");
PrintWriter writer=response.getWriter();
writer.write("爱情睡醒了");
}
}
public class ResponseIOServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(response.getCharacterEncoding());//默认是字符集是ISO-8859-1,不支持中文
//一定得在获取流对象前使用,否则无效
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer=response.getWriter();
writer.write("爱情睡醒了");
}
}
创建两个类response1和response2
response1
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Response1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应状态码302,表示重定向(已搬迁到新处)
resp.setStatus(302);
//设置响应头,说明新地址在哪
resp.setHeader("Location","http://localhost:8080/03_servlet/response2");
}
}
response2
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Response2 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello response2");
}
}
web.xml配置 中配置访问路径
<servlet>
<servlet-name>Response1</servlet-name>
<servlet-class>com.servlet.Response1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Response1</servlet-name>
<url-pattern>/response1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Response2</servlet-name>
<servlet-class>com.servlet.Response2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Response2</servlet-name>
<url-pattern>/response2</url-pattern>
</servlet-mapping>
运行结果:
1、浏览器地址栏会发生变化
2、是两次请求(第一次是旧的地址,第二次是重新定到新的地址)
3、不能共享Request域中的数据(因为Tomcat会把每次请求封成一个对象,两次请求所以不同对象)
4、不能访问WEB-INF下的资源(因为也是浏览器发送的请求,浏览器不能直接访问WEB-INF)
5、可以访问工程外的资源,如www.baidu.com
public class Response1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//第二种方法(括号内直接设置新的访问地址)
resp.sendRedirect("http://www.baidu.com");
}
}
我正在尝试从该网站抓取历史天气数据: http://www.hko.gov.hk/cis/dailyExtract_uc.htm?y=2016&m=1 在阅读了 AJAX 调用后,我发现请求数据的正确
我有两个 postman 请求 x,y,它们命中了两个不同的休息 api X,Y 中的端点。 x 会给我一个身份验证 token ,这是发出 y 请求所必需的。如何在请求 y 中发出请求 x ?也就是
我使用请求库通过 API 与其他服务器进行通信。但现在我需要同时发送多个(10 个或更多)POST 请求,并且只有在所有响应都正确的情况下才能进一步前进。通常语法看起来有点像这样: var optio
背景:当用户单击按钮时,其类会在class1和class2之间切换,并且此数据是通过 AJAX 提交。为了确认此数据已保存,服务器使用 js 进行响应(更新按钮 HTML)。 问题:如果用户点击按钮的
我正在将 Node.js 中的请求库用于 Google 的文本转语音 API。我想打印出正在发送的请求,如 python example . 这是我的代码: const request = requi
我经常使用requests。最近我发现还有一个 requests2 和即将到来的 requests3 虽然有一个 page其中简要提到了 requests3 中的内容,我一直无法确定 requests
我正在尝试将图像发送到我的 API,然后从中获取结果。例如,我使用发送一个 bmp 图像文件 file = {"img": open("img.bmp)} r = requests.post(url,
我发现 Google Cloud 确保移出其物理环境的任何请求都经过强制加密,请参阅(虚拟机到虚拟机标题下的第 6 页)this link Azure(和 AWS)是否遵循类似的程序?如果有人能给我指
我有一个 ASP.NET MVC 应用程序,我正在尝试在 javascript 函数中使用 jQuery 来创建一系列操作。该函数由三部分组成。 我想做的是:如果满足某些条件,那么我想执行同步 jQu
我找不到如何执行 get http 请求,所以我希望你们能帮助我。 这个想法是从外部url(例如 https://api.twitter.com/1.1/search/tweets.json?q=tw
我的应用只需要使用“READ_SMS”权限。我的问题是,在 Android 6.0 上,当我需要使用新的权限系统时,它会要求用户“发送和查看短信”。 这是我的代码: ActivityCompat.re
我的前端代码: { this.searchInput = input; }}/> 搜索 // search method: const baseUrl = 'http://localho
我有一个由 AJAX 和 C# 应用程序使用的 WCF 服务, 我需要通过 HTTP 请求 header 发送一个参数。 在我的 AJAX 上,我添加了以下内容并且它有效: $.ajax({
我正在尝试了解如何使用 promises 编写代码。请检查我的代码。这样对吗? Node.js + 请求: request(url, function (error, response, body)
如果失败(除 HTTP 200 之外的任何响应代码),我需要重试发送 GWT RPC 请求。原因很复杂,所以我不会详细说明。到目前为止,我在同一个地方处理所有请求响应,如下所示: // We
当用户单击提交按钮时,我希望提交表单。然而,就在这种情况发生之前,我希望弹出一个窗口并让他们填写一些数据。一旦他们执行此操作并关闭该子窗口,我希望发出 POST 请求。 这可能吗?如果可能的话如何?我
像 Facebook 这样的网站使用“延迟”加载 js。当你必须考虑到我有一台服务器,流量很大时。 我很感兴趣 - 哪一个更好? 当我一次执行更多 HTTP 请求时 - 页面加载速度较慢(由于限制(一
Servlet 容器是否创建 ServletRequest 和 Response 对象或 Http 对象?如果是ServletRequest,谁在调用服务方法之前将其转换为HttpServletReq
这是维基百科文章的摘录: In contrast to the GET request method where only a URL and headers are sent to the serv
我有一个循环,每次循环时都会发出 HTTP post 请求。 for(let i = 1; i console.log("succes at " + i), error => con
我是一名优秀的程序员,十分优秀!