Java复习之路(第二十二天 Tomcat Http协议 请求与响应)

Java基础知识

Tomcat HTTP

服务器的概述

什么是服务器:

服务器:分为 服务器硬件 和 服务器软件。在硬件服务器(一台计算机)安装了服务器软件,就可以对外界提供服务,比如:让其他计算机上的浏览器来进行访问。

(1)服务器硬件: 是一台在互联网上具有独立IP地址的计算机,比如我们面前的计算机也可以作为服务器使用。

(2)服务器软件: 就是一个计算机程序(软件), 比如在mysql服务器软件、tomcat服务器软件。

什么是web服务器:

(1)Web服务器是可以向“发出请求的浏览器提供文档”的程序。 比如在访问百度时,其实就是在访问百度的服务器。

(2)Web服务器是指驻留于因特网上某种类型计算机的程序。当浏览器(客户端)连接到服务器,请求服务器上的文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。

tomcat就是一个web服务器,是由apache组织提供的一款服务器软件,特点是小巧灵活,免费开源,简单易用。

Tomcat的目录的结构:

各个的文件夹下面存放的数据的类型不同,各目录的作用是:

(1)bin:存放了tomcat服务器中的可执行的批处理文件

(2)conf:存放了tomcat相关的配置文件(其中的server.xml是tomcat服务器核心配置文件)

(3)lib:是tomcat服务器运行时所依赖的jar包的存放目录(servlet的jar包、JSP的jar包)

(4)logs:是tomcat服务器运行时产生的日志文件的存放目录

(5)temp:临时文件的存放目录,tomcat服务器会自己管理

(6)work:tomcat服务器在运行时产生的工作文件(JSP翻译后的Servlet文件、Session序列化后的文件等)

(7)webapps目录:是localhost虚拟主机默认管理的目录,可以将web应用发布(存放)到该目录下,就可以通过localhost主机访问该web应用中的资源了。

可以简单的理解为:这个webapps目录,就是一个资源的发布目录,将资源文件和目录发布到webapps目录下,就可以通过浏览器访问这些文件。

tomcat 主机,虚拟的主机,与web的应用之间的联系:

WEB的应用:

WEB应用的目录的结构:

news(Web应用/目录)
 |
 |-- 其他目录: 放在其他目录中的资源文件, 可以被浏览器直接访问。
 |-- WEB-INF目录:这是一个受保护的目录,放在这个目录下的资源文件,不可以被浏览器直接访问(不是不能,是不能直接访问)。
		|-- classes目录:存放编译后的class文件
		|-- lib目录:存放web应用所依赖的jar包
		|-- web.xml文件:web应用的核心配置文件。

部署web的应用到虚拟的主机上面:

将Web应用的目录拷贝到虚拟主机所管理的目录下即可。例如:将news应用的目录,拷贝到webapps目录下,就相当于将news发布到了localhost主机中这种发布方式不用重启服务器就可以直接访问。

在WEB-INF的目录下是受保护的目录,就是利用浏览器不可以直接进行访问,具有保护的权限,在此目录下有一个Classes的文件安夹,里面存放的是web应用在编译后的文件,在Java的工程下,文件编译后存放的目录是bin的目录,

目的就是通过主机的名称进行运行网页的代码(将某个页面换成主页的访问的方法)

将hello.html配置为主页之前,访问hello.html的路径为:http://localhost/hello.html

将hello.html配置为主页之后,访问hello.html的路径为:http://localhost

如何讲一个网页配置成为一个主页,配置的方式是在web.xml中进行配置

<web-app>
    <welcome-file-list>
        <welcome-file>hello.html</welcome-file>
    </welcome-file-list>
</web-app>
//将所有的网页加载到首页上,会按照先后的顺序进行加载,如果第一个没有数据,会直接跳转到第二个
//以此类推,进行网页首页得加载
<web-app>
    <welcome-file-list>
        <welcome-file>hello.html</welcome-file>
        <welcome-file>welcom.html</welcome-file>
        <welcome-file>frist.html</welcome-file>
        <welcome-file>second.html</welcome-file>
    </welcome-file-list>
</web-app>

HTTP的协议:

什么是HTTP协议:

(1).HTTP是用于规定浏览器和服务器通信的方式。

(2).主要规定了浏览器向服务器发送的请求信息的格式,

(3).以及规定了服务器向浏览器做出的响应信息的格式。

HTTP工作时遵循的基本的原则:

(1)一次请求对应一次响应

(2)请求只能由浏览器发起,服务器只能被动的等待请求,根据请求作出回应.

HTTP协议的详解:

HTTP的请求:

请求行:GET/news/hello.html HTTP/1.1

GET: 提交方式,在HTTP协议中一共规定了7种提交方式,其中5种都不常用,只用GET和POST。
/news/hello.html: 请求的资源路径,用于通知服务器浏览器访问的是服务器中哪个Web应用以及应用下的哪一个资源文件。
HTTP/1.1:请求所遵循的协议和版本

请求若干行:请求头都是Key-Value结构。例如

Host : localhost -- 表示浏览器请求的是服务器中的哪一台虚拟主机。
Cookie : xxx=xxx; -- cookie技术中的一个头(后面讲)
xxx : xxx
...

请求实体的内容:(内容的重点的记忆)

如果请求方式是GET提交,请求实体不会有内容。

如果请求方式是POST提交,并且请求中携带了数据,请求实体才会有内容

GET和POST提交的方式之间的异同:(重点理解)

 1.区别主要是体现在请求的参数的传输过程中的不同,get的提交的参数是在请求行中进行体现,在请求行中的的内容同样也会在会在地址(就是浏览器上面的地址栏)中进行展现,信息的泄露,安全的系数比较低,数据量不可以过大(比如提交一篇文章是不可以的)通过post的提交的内容,在地址栏里面是不显示的,在实体的请求行里面同样也是不现实的,会在请求的实体中体现,更加安全,没有数据的大小的限制

HTTP响应

状态行:HTTP/1.1 2..ok

HTTP/1.1:表示响应信息所遵循的协议和版本

200:是一个三位是数字,叫做状态码,表示请求处理的结果。常见的状态码有:

200:表示服务器处理请求的结果是成功的!
	304/307:表示服务器通知浏览器使用缓存
	400:表示请求参数类型不匹配
	404:表示客户端请求的资源不存在
	500:表示服务器端在处理请求的过程中出现了错误或异常

描述短语:也是请求的结果

	200 OK
	404 NOT FOUND
	500 Internal Server Error

若干行头响应:响应头的格式也是Key-Value结构

Content-Type: text/html -- 通知浏览器,服务器响应的数据类型是什么
text/html -- 表示服务器响应是一个html格式的网页,如果响应是一个网页,还可以在值的后面加上一个编码,例如: text/html;charset=utf-8
	text/css -- 表示服务器响应是一个css文件
	image/gif -- 表示服务器响应的是一个gif格式的图片
	...
	
Content-Length: 服务器响应的数据长度,单位是字节
Set-Cookie: Cookie技术中的一个头(后面讲解)

响应实体的内容:

     如果浏览器向服务器请求的是一个文件,服务器会将这个文件的内容作为响应实体发送给浏览器.

     比如浏览器请求是 hello.html文件,服务器就会将hello.html文件的内容作为响应实体发送给浏览器

     localhost/news/hello.html,

HTTP总结:

HTTP: 用于规定浏览器和服务器之间通信的方式
请求信息中包含哪几部分内容: 请求行、请求报头、请求实体
响应信息中包含哪几部分内容: 状态行、响应报头、响应实体
请求行中包含什么内容:请求方式、请求资源路径、协议和版本
状态行中包含什么内容:协议和版本、状态码、描述短语

内容的补充:

问题1:请求方式什么时候是GET提交?什么时候是POST提交?

只有当使用表单(form)并且在表单上通过method属性指定提交方式为POST时,才是POST提交,其他方式都是GET提交!!(AJAX除外)

判断以下请求方式是GET还是POST?

(1)<form action="#"></form>				-- GET提交
(2)<form action="#" method="GET"></form>	-- GET提交
(3)<form action="#" method="POST"></form>	-- POST提交
(4)点击超链接访问服务器,例如:				-- GET提交
<a href="http://www.baidu.com">百度一下</a>
(5)直接在浏览器的地址栏中书写URL地址访问服务器	-- GET提交

问题2:GET提交和POST提交有什么区别?

(1)GET提交会将请求参数拼接在URL地址的后面,显示在地址栏中,相对不安全
(2)GET提交将参数显示在地址栏中,数据量不能太大,不能超过1K或者是4K
(3)POST提交不会将参数拼接在地址栏后面, 而是通过请求实体将参数发送给服务器, 相对来说更加安全!
(4)POST提交通过请求实体传数据给服务器, 数据量理论上没有限制!
当向服务器传输大量的数据或者传输的数据较为隐私,才会使用POST提交。
更多情况下,还是使用GET提交!!

Servlet

什么是Servlet

Servlet是SUN公司提供的一门动态Web资源开发技术Servlet: Server Applet: 服务器端的Java程序Servlet本质上就是一段Java程序,和普通的Java程序不同是,Servlet程序无法独立运行,必须将Servlet程序放在服务器中,由服务器调用才可以执行!!

静态Web资源: 任何人在任何条件下访问的效果都是相同的,这种叫做静态Web资源,html、css、js、flash

动态Web资源: 在不同的条件下访问时,看到的是不同的效果。Servlet、JSP、PHP、.NET

运行在服务器端的Servlet程序,其作用是什么?

总结:运行在服务器中的Servlet程序的作用是:在服务器将请求接收过来后,对请求进行处理,即处理请求!

访问的步骤:

1.浏览器向服务器发送请求,服务器将调用一个Servlet进行处理

2.Servlet负责将请求进行处理,处理的过程中可能需要进行连接数据库,最终得到一个结果

3.通常的情况下Servlet不会直接将结果直接返回给浏览器,而是由jsp或者html进行响应结果

4.最终要响应的结果是由服务器负责响应给浏览器

开发Servlet程序:

开发Servlet程序的步骤

第一步: 写一个类,实现一个Servlet接口,并实现其中的方法直接实现Servlet接口或者实现该接口的子类。
第二步: 在web应用的web.xml文件中配置Servlet程序对外访问的路径。

使用eclipse创建web项目(熟悉)

通过Eclipse创建Servlet,默认继承HttpServlet。由于HttpServlet也是Servlet接口的子类,让HelloServlet继承HttpServlet,相当于间接实现了Servlet接口。

继承HttpServlet类,默认会覆盖doGet方法和doPost方法,两个方法的作用为:

* doGet方法:当浏览器发送请求的方式为GET提交时, 将会调用doGet方法来处理请求

* doPost方法:当浏览器发送请求的方式为POST提交时, 将会调用doPost方法来处理请求

提示:如果当GET提交和POST提交处理代码相同时,可以将代码写在其中一个方法里(例如写在doGet中),并在另外一个方法(例如doPost)中调这个方法。这样一来,不管是GET提交还是POST提交,最终doGet方法都会执行,都会对请求进行处理!!

servlet在web.xml中的配置:

在通过Eclipse创建Servlet时,会自动在web.xml文件中进行Servlet相关信息的配置(注意:如果是复制Servlet类文件,但配置信息不会跟着复制,需要自己手动添加配置,否则复制的Servlet将无法访问!)

  <servlet>
    <description></description>
    <display-name>HelloServlet</display-name>
    <!--此处的要求就是要与下面的<servlet-name>标签里面的内容相同
    是根据这一个路径去寻找你的编译后的class文件,主要是在更改名称的时候
    配置里面的内容并不会进行更改,容易出现文件找不到的错误
     --> 
    <servlet-name>HelloServlet</servlet-name>
    <!--包的全路径 --> 
    <servlet-class>com.tedu.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <!-- 名称和Servlet名称一致,是一个访问的路径,访问到路径之后,进行寻找class类,
    进行创建对象,运行里面的方法
     -->
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>

关于上面的配置信息:

a) Eclipse每创建一个Servlet, 就会在web.xml文件中添加两个标签:<servlet>和<servlet-mapping>标签(可以将这两个标签看成一个组的标签)
b) <servlet>和<servlet-mapping>标签内都会有一个<servlet-name>标签,标签的内容可以更改,但要求更改后的这两个<servlet-name>标签的内容也必须一致。
c) <servlet-class>标签用于配置Servlet类的全路径名(即包名+类名)
需要注意:如果在创建Servlet后修改了Servlet类的名称,这个地方也要一起更改,否则将会出现"ClassNotFoundException" 即类找不到异常
d) <url-pattern>标签用于配置浏览器以什么路径访问当前Servlet(即Servlet对外访问的路径),默认的路径是:/类名
例如:上面为HelloServlet配置的<url-pattern>为 /HelloServlet,因此我们在浏览器中的访问路径则为:
http://主机名/web项目访问路径/HelloServlet

servlet的继承的关系:

Servlet接口 -- 定义了一个Servlet应该具备哪些功

    |-- GenericServlet抽象类,实现了Servlet接口,并且实现了接口中大部分的方法,但是没有实现service,service方法是处理请求的核心方法,应该由开发人员自己来实现!

   |-- HttpServlet抽象类,继承了GenericServlet,并且实现了service方法,在service方法中,判断请求方式,根据不同的请求方式,调用不同的doXxx方法。

因此在开发中,我们只需要写一个类,继承HttpServlet,重写父类中的doGet方法和doPost方法。

当浏览器访问一个Servlet时,首先调用Servlet类的service方法(从HttpServlet类中继承过来的),根据请求方式调用对应的doGet方法或者doPost方法,对请求进行处理!

修改servlet的调用模板:

//动态的进行获取包的名称
package ${enclosing_package};

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//在设置快捷的方式时候,获取动态的方法的名称
public class ${primary_type_name}  extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置提交的内容的格式的类型
		response.setContentType("text/html;charset=utf-8");
		//向浏览器进行发送数据,提供向外输出数据的对象,调用write的方法
		PrintWriter out = response.getWriter();
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

servlet的调用的过程:

通过浏览器访问服务器中的一个Servlet程序,这个Servlet程序是如何执行的?又是如何被调用的?

localhost/Hello/HelloServlet

重点内容:

request是代表Http请求信息的对象,其中封装了浏览器向服务器发送的请求信息,将request传递给service方法,在处理请求的过程中,可以通过request对象获取请求相关的信息。
response对象是代表Http响应信息的对象,其中将会封装服务器向浏览器做出的响应信息,将response传递给service方法,在处理请求的过程中,如果有任何数据要发送给浏览器,可以通过response获取流进行发送。

response.getWriter();

response.getOutputStream();

request对象:

问题1、什么是请求参数?

通过浏览器向服务器发送请求时,在请求中可以携带一些数据,这些数据就称之为请求参数,例如:
http://localhost/day10/RequestDemo1?user=张三&like=篮球&like=足球&age=18

问题2、如何获取请求参数?

request.getParameter(String paramName);
-- 通过请求参数的名字,获取对应的参数值。返回值是一个字符串。
request.getParameterValues(String paramName);
-- 通过请求参数的名字,获取对应的所有参数值组成的数组。

因此,以后获取单值的参数时,推荐使用getParameter方法。如果获取的多值的参数(即一个参数名对应多个参数值),推荐使用getParameterValues方法

请求转发的特点:

(1)请求转发前后是一次请求、一次响应
(2)请求转发前后,浏览器地址栏地址不会发生变化(转发是服务器内部的跳转,浏览器看不到)
(3)请求转发前后的request对象是同一个(因为请求只有一次,服务器根据一次请求,只会创建一个request对象,转发前后都需要request,所以只能在转发时,将request对象传递给转发后的那个资源)。
(4)请求转发只能在同一个web应用内部中的两个资源之间进行转发。
即转发前后的两个资源必须属于同一个web应用。

 在Servlet的调用的过程中,浏览器不会将Servlet对象传送给服务器,而是仅仅将一串字符串传送给服务器,服务器进行资源的整合分析

 

request.getRequestDispatcher("转发到资源的路径").forward(req, res);

request和response简介:

request和response介绍:

request是代表了http请请求信息的对象,其中封装了浏览器发送过来的请求的信息

response是代表了http请响应信息的对象,其中封装了浏览器发送过来的响应的信息

在服务器接收浏览器请求之后,以及在调用Servlet方法请求之前,服务器会创建request和response对象,分别用来封装请求和相应的信息

request对象:

提问:获取请求的参数

什么是请求的参数:浏览器发送给服务器的数据(比如页面的注册登录的信息)比如在登录或者是在注册的时候,浏览器将用户名和密码等信息发送给服务器,这些发送给服务器的用户的名称和密码等信息就是请求的参数

get的提交的方式会显示在页面的地址栏里面,post的提交会将数据以请求实体的形式进行传送给服务器

服务器如何进行获取浏览器出送过来的数据:

如何进行获取请求的参数:

//在提交数据的时候写的路径的名称,一定不要忘记端口的名称8080

	<form action="http://localhost:8080/day09/RequestDemo1" method="GET">

request.getParameter(string name);    //传送过来的值是一个键值对,通过他的名称来获取他的值的方法,最后传过来的数据是字符串

----通过请求参数的名称来获取对应的的参数的值

request.getParameterValues();     // 方法的返回值是一个字符串数组

----通过请求参数的名称来获取对应的所有的参数值返回的字符串的数组

如何进行处理Servlet的乱码的问题:

(1)如果是GET提交,并且tomcat服务器是8.0及以后的版本,GET提交的中文参数是没有乱码问题的。(因为tomcat自8.0版本以后,已经处理了GET提交的中文参数乱码问题!)

(2)如果是GET提交,并且tomcat服务器是7.0及以前的版本,GET提交的中文参数也会有乱码问题。如何处理??

在服务器的server.xml文件中的修改端口的Connector标签上添加一个属性, URIEncoding="utf-8",如下:

<Connector connectionTimeout="20000" 
	port="80" protocol="HTTP/1.1" 
	redirectPort="8443"
	URIEncoding="utf-8"/>

这样,在tomcat7.0及以前的版本中,GET提交也没有乱码问题!

(3)如果是POST提交,无论是哪个版本的tomcat服务器,POST提交的中文参数都会有乱码。处理方式如下:

//在任何获取请求参数的代码之前,加上一行代码:
request.setCharacterEncoding("utf-8");
//获取请求参数...

 实现请求转发:

请求转发是服务器内部资源的一种跳转方式,即当浏览器发送请求访问服务器中的某一个资源时,该资源将请求转交给另外一个资源进行处理的过程,就叫做请求转发。

请求转发和重定向都是资源的跳转方式,但是跳转的过程有所不同。

实现请求转发的特点:

(1)请求转发前后是一次请求、一次响应

(2)请求转发前后,浏览器地址栏地址不会发生变化(转发是服务器内部的跳转,浏览器看不到)

(3)请求转发前后的request对象是同一个(因为请求只有一次,服务器根据一次请求,只会创建一个request对象,转发前后都需要request,所以只能在转发时,将request对象传递给转发后的那个资源)。

(4)请求转发只能在同一个web应用内部中的两个资源之间进行转发。

即转发前后的两个资源必须属于同一个web应用。

请求转发实现:代码的 实现:

request.getRequestDispatcher("转发到资源的路径").forward(req, res);

请求转发、域对象

请求转发:

资源跳转的一种方式,而且这种跳转的方式对外是不可见得,当服务器请求访问服务器中的一个资源 (Servlet),而这个Servlet最终没有做出响应,而是将这种请求转交给另外的一个资源(Servlet/jsp)由另外的这个来进行做出响应,那么将请求从一个资源转交给另外的一个资源的过程就是请求的转发

作为域对象

域对象:如果一个对象具备可以被访问的范围,利用该对象的Map的集合,可以在整个范围内实现资源的共享

request就是一个域对象,再一次的请求的范围内request的对象都是同一个,并且request对象保存了map的集合,专门的存储数据

里面提供了存储数据的方法:

request.setAttribute(string name,object value)---往request域中添加一个域属性属性名称必须是字符串,属性的值可以是任意类型的值

request.getAttribute(string name,根据属性的名称获取对应的属性值

//将携带的信息传递给jsp进行显示(servlet本质上是就Java代码,Java适合进行处理事务但是不适合做页面的显示,可以将请求传送给jsp行,进行在页面上进行显示)

在进行数据的传递的过程中,将servlet的数据传送给jsp的 时候的书写的方法:

//通过转发将request对象带到jsp,取出数据进行显示(括号里面的参数可以是jsp的相对的路径,或者是绝对的路径都是可以的)
//在他们的两个访问的路径上是属于同一的目录下的,可以直接书写件jsp的名称
request.getRequestDispatcher("index.jsp").forward(request, response);
//在将数据转发到jsp的同时,也将(request和response两个对象带到了jsp中

模拟查询个人的信息:

RequestDemo2.servlet

package com.tedu.req;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//进行模拟查询个人的信息
public class RequestDemo2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//模拟通过JDBC访问数据库进行查询个人的信息
		String name="天玄";
		String addr="山东济南";
		//将数据存储到request对象的Map的集合里面
		//前面的值就相当于map集合里面的key键,后面的变量就是Map的值的含义
		request.setAttribute("name", name);
		request.setAttribute("addr", addr);
		//通过转发将request对象带到jsp,取出数据进行显示(括号里面的参数可以是jsp的相对的路径,或者是绝对的路径都是可以的)
		//在他们的两个访问的路径上是属于同一的目录下的,可以直接书写件jsp的名称
		request.getRequestDispatcher("index.jsp").forward(request, response);;
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style>
	p{border :2px solid red; background:pink;}
</style>
</head>
<body>
	<h1>index.jsp.......</h1>
	<!-- 想要书写表达式的方法是用一对百分号进行括起来 -->
	<!-- 这里的含义就是将数据取出来,然后放到P的标签里面 -->
	<p><%=request.getAttribute("name") %></p>
	<p><%=request.getAttribute("addr") %></p>
</body>
</html>

运行结果:

response对象:

表示Http响应的对象,用于封装要发送给浏览器的响应的信息

向客户端发送数据

PrintWriter           response.getWriter() -- 字符流

ServletOuptputStream     response.getOutputStream() -- 字节流

PrintWriter out = response.getWriter();
out.write("hello..");

通过response获取字符流向浏览器发送中文数据时,会出现乱码问题。出现乱码的原因为:服务器默认用iso8859-1编码向浏览器发送数据,而这个码表中没有中文字符,所以在发送中文数据时,必然会出现乱码。

解决方法:

/* 通知服务器使用utf-8码表向浏览器响应数据
 * 通知浏览器也使用utf-8码表接收服务器响应的数据 */
response.setContentType("text/html;charset=utf-8");

PrintWriter out = response.getWriter();
out.write("你好");

 

通过request.getWriter获取的浏览器,向浏览器进行发送数据时,使用的编码是iso8859-1二这个码表中是没有中文汉字的,会将中文的汉字转换成为?的形式进行提交,所以在解码的时候同样也会解码为?的形式

乱码出现的原因:在提交数据的时候的编码与解码时候的编码不是同一类型,在不能解析编码的时候用?进行代替

//通知服务器使用的utf-8发送给数据给浏览器,通知浏览器也是用utf-8接受服务器接受过来的数据

//定义的形式:response.setContentType("text/html;charset=utf-8")

实现的重定向

(1)重定向前后是两次请求,两次响应

(2)重定向前后,浏览器的地址栏地址会发生变化。(因为两次请求都是通过浏览器发起,浏览器知道这个跳转的过程,因此地址栏地址会变化)

(3)重定向前后的request对象不是同一个(因为重定向前后是两次请求,服务器根据两次请求会创建两个不同的request对象及response对象)

(4)重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器。(进行跳转的两个资源之间没有限制)

代码的实现:

response.sendRedirect("重定向到资源的地址");
//从当前Servlet重定向当前应用下的test.jsp
response.sendRedirect("test.jsp");
response.sendRedirect("http://localhost/day10/test.jsp");
response.sendRedirect("/day10/test.jsp");

//从当前Servlet重定向day09应用下的test.jsp
response.sendRedirect("http://localhost/day09/test.jsp");
response.sendRedirect("/day09/test.jsp");

//从当前Servlet重定向tmooc.cn的首页
response.sendRedirect("http://www.tmooc.cn");

实现重定向:

重定向:也是一种资源的跳转的方式,和请求转发相比较,重定向可以不是同一个的web的资源,一个web应用的连个资源

实现重定向:

response.sendReadirect("所重定向的地址");

重定向的特点:

(1)重定向前后是两次请求,两次响应

(2)重定向前后,浏览器的地址栏地址会发生变化。(因为两次请求都是通过浏览器发起,浏览器知道这个跳转的过程,因此地址栏地址会变化)

(3)重定向前后的request对象不是同一个(因为重定向前后是两次请求,服务器根据两次请求会创建两个不同的request对象及response对象)

(4)从A重定向到B,A和B中的request对象不是同一个(访问A和B是两次请求),就不可以通过转发+request域从A带数据到B

(4)重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器。(进行跳转的两个资源之间没有限制)

什么时候使用转发,什么时候使用重定向:

(1)如果希望跳转之后的地址栏也不发生变化的话,使用转发

(2)如果希望在跳转的同时能带数据到目的地,则使用转发

(3)如果希望跳转之后的地址栏也发生变化的话,使用重定向

(4)如果只希望做一次跳转,没有什么要求,则推荐使用转发(因为转发只有一次请求,而重定向是两次跳转)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值