JavaWeb——http协议,Servlet(生命周期,如何处理多个请求访问?,如何开发线程安全的Servlet),请求对象,响应对象,转发和重定向的区别

1、什么是Web应用?

使用浏览器进行访问的应用程序,我们可以称作为Web应用,Web应用的特点就是无需额外安装客户端。比如我们经常访问的淘宝,京东,网易等这些都是属于Web应用,什么是JavaWeb就是使用Java语言开发web应用程。

2、B/S架构和C/S架构?
  1. B/S架构:浏览器跟服务器进行数据交互的方式,数据传输采用的是HTTP协议。
  2. C/S架构:客户端跟服务端的进行数据交互的方式,数据传输采用的是Socket协议。
3、http协议

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP协议是一个应用层的协议,由请求和响应构成,一次请求一次响应。

特点
  • 是我们B/S 架构采用的协议。
  • HTTP可以传输任意数据类型,比如文本,图片,音频,视频等等。
  • HTTP1.0之前使用的是种短连接的方式,什么是短连接,就是限制每次连接只处理一个请求,服务器处理完成之后 、并收到浏览器的应答之后,就会断开连接。这种方式的好处是可以节省传输时间。但是缺点是,我请求了一个HTML文档,这个文档中又包含了,其他JS文件,图片文件,CSS文件,每当浏览器,遇这样一个Web资源,就会建立一个会话,那这样的话需要消耗资源和时间的。现在我们使用的HTTP1.1的版本使用的是长连接。使用长连接的情况下。当一个网页打开完成后。客户端和服务端之间传输数据时。连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立好的连接。当然,这个连接不会永久保持,服务器中可以设置这个保持连接时间。
  • HTTP协议是一种无状态协议,什么叫协议的状态,就是指下一次传输可以记住本次传输数据的能力,那所谓无状态协议,就是http不会为了下一次连接,而维护本次连接所传输的数据,比如浏览器打开一个网页后,关闭浏览器,然后再次打开浏览器,但是服务器并不知道客户关闭了一次浏览器,所以HTTP是无状态协议,那如果说我们在一个网站中的多个页面间需要共享同一个数据,我们可以通过Cookie和Session来实现。
(1)HTTP之请求Request

请求:就是浏览器往服务器发送数据。
请求:

  • 请求行:请求信息的第一行。
  • 请求头:从请求信息的第二行开始到请求空行结束。
  • 请求体:从请求空行往下。

常见的请求头:

    Accept: text/html,image/*	--告诉服务器当前客户端可以接收的文档的类型。其实这里包含了*/*,就表示什么都可以接收;  大类型/小类型 比如 text/css text/javascript
	Accept-Charset: ISO-8859-1	--告诉服务器,客户端提交的表单可能使用的编码类型
	Accept-Encoding: gzip		--浏览器发给服务器,声明浏览器支持的编码类型
	Accept-Language:zh-cn 		--语言环境
	Host: localhost:8080		--访问主机
	If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT	 客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:
后面跟的时间是本地浏览器存储的文件修改时间
	Referer: http://www.baidu.com/index.jsp	 --来自哪个页面、防盗链
	User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
	Cookie
	Connection:Keep-Alive   	--链接状态 长链接
	Date: Tue, 11 Jul 2000 18:23:51 GMT	--时间
(2)HTTP响应Response

响应:就是服务器往浏览器回写数据
响应:

  • 响应行:响应信息第一行
    HTTP/1.1 200 OK 格式: 协议/版本 响应状态码 响应的描述

  • 响应头:响应信息第二行到响应空行

  • 响应空行

  • 响应体:响应空行以下

常见的响应状态码:

200 成功响应
404 请求的资源没有找到
302 重定向
500  服务器内部错误
(3)HTTP请求之get和post的区别
  • get请求: 会通过url地址?来传递参数,将用户提交的信息显示在地址栏。
    缺点:安全性不高,数据内容长度有限制,不能太大。
    优点:便于分享网址

  • post请求: 也可以把数据传输到服务器上,但是不利用URL,利用HTTP request请求报文头。post请求目前借助于表单产生。
    缺点:地址不可以分享。
    优点:安全性高,数据内容没有长度限制。

4、Servlet

Servlet(Servlet Applet),全称Java Servlert .是用Java编写的服务器端程序。其主要功能在与交互式的浏览和修改数据,生成动态Web内容。狭义的servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet的类,一般情况下,人们将Servlet理解为后者。比如HttpServlet类继承自Servlet类,可以利用继承Http Servlet 来实现Http请求,当不是Http请求的时候,也可以定义其他形式的Servlet。

(1)servlet的生命周期

加载、创建、初始化、处理客户请求、卸载。

  • 加载:Servlet容器(Tomcat)通过类加载器加载servlet文件(.class)
  • 创建:通过调用servlet构造函数创建一个servlet对象 (3)初始化:调用init方法初始化
  • 处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
  • 卸载:调用destroy方法让servlet自己释放其占用的资源
(2)Servlet如何处理多个请求访问?

Servlet容器默认是采用单实例多线程的方式处理多个请求的。

  • 当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例)。
  • 容器初始化Servlet主要就是读取配置文件(例如tomact,可以通过servlet.xml设置线程池中线程数目,初始化线程池通过web.xml,初始化每个参数值等等)。
  • 当请求到达时,Servlet容器通过调度线程(Dispatchar Thread)调度它管理下线程池中等待执行的线程(工作线程Worker Thread)给请求者
详细过程:
当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作线程,然后由该线
程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中
选出另一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对
同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。 
  • 线程执行Servlet的service方法。
  • 请求结束,将执行完的线程返回线程池,等待下一次被调用。

注意:在Servlet中应该避免使用实例变量(成员变量),因为如果存在成员变量,成员变量是在堆中分配的,并被属于该实例的所有线程共享,可能发生多个线程同时访问该资源造成数据的不一致,因此发生线程安全问题。

(3)如何开发线程安全的Servlet
  • 实现SinaleThreadModel接口
  • 同步对共享数据的操作
  • 避免使用实例变量(最佳选择)

总结:

  • 如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销,SingleThreadModel在Servlet2.4中已不在提倡使用。
  • 如果在在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降,这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内容中的数据的一致性,要频繁的地刷新缓存,这也会大大降低系统的性能。所以在实际的开发中应该避免或最小化Servlet中的同步代码。
  • Servlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以他们不会影响线程的安全。
(4)Servlet中属性的线程安全
  • ServletContext是可以多线程同时读/写属性的,线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone(),所以在Servlet上下文中尽可能少量保存会被修改的数据,可以采用其他方式在多个Servlet中共享,比方我们可以使用单例模式来处理共享数据。
  • HttpSession:当用户打开多个同属于一个进程的浏览器窗口,在这些窗口的访问属于同一个Session,会出现多次请求,需要多个工作线程来处理请求,可能造成同时多线程读写属性。这时我们需要对属性的读写进行同步处理:使用同步块Synchronized和使用读/写器来解决。
  • ServletRequest:对于每一个请求,由一个工作线程来执行,都会创建有一个新的ServletRequest对象,所以ServletRequest对象只能在一个线程中被访问。ServletRequest是线程安全的。
(5)注意

Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化,出现多线成安全问题。

5、请求对象和响应对象

request和response对象都是有服务器创建,管理,销毁。

(1)response

response:设置响应消息。

//作用:设置字符打印输出流的编码,并告诉浏览器用相应的编码去解码
response.setContentType("text/html;charset=utf-8");
// 获取字节流
 response.getOutputStream();
(2)request

request:获取请求消息。

request.getMethod();//获取请求方式
request.getContextPath();//获取项目名称
request.getRequestURI();//获取URI
request.getRequestURL();//获取URL
request.getRemoteAddr();//获取IP地址
request.getQueryString();//获取请求参数
request.getProtocol();//获取协议版本
//获取字符数据:
 getReader(); //返回一个高效的字符流 我们通过一次读取一行的 方法来获取请求参数数据  然后 拆分字符串获取我们想要的数据
//获取字节数据
getInputStream();

获取请求参数

request.getParameter(name);  通过请求参数的名称来获取值
request.getParameterValues("hobby"); 通过请求参数的名称,来获取值的数组 一般用于复选框
request.getParameterMap();  获取所有参数的map集合
request.getParameterNames(); 获取所有参数的名称 枚举 不常用 了解

中文乱码

request.setCharacterEncoding("utf-8");
(3)转发和重定向的区别
request.getRequestDispatcher().forward()//转发
response.sendRedirect() //重定向
  • 转发只能请求转发给同一个web应用中的组件,而重定向不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
  • 重定向访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;请求转发过程结束后,浏览器地址栏保持初始的URL地址不变
  • 转发是在服务端内部将请求转发给另外一个资源,浏览器只知道发出了请求并做出了响应,并不知道服务器内部发生了转发行为。而重定向是对浏览器的请求直接做出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求。所以转发只发生了一次请求一次响应,而重定向是两次请求两次响应。
  • 转发的方法的调用者和被调用者之间共享的是同一个request和response对象,而重定向方法的调用者和被调用者之间使用各自的request和response对象。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值