1.servlet的基本概念
servlet是运行在服务端上的一个java类,使用serlvet技术可以和网页的前端和后台进行数据交互。
2.HTTP协议介绍
什么是HTTP协议
HTTP协议,超文本传输协议,是互联网上应用广泛的一种网络传输协议。所有的www文件都必须遵守这个协议。他是TCP/IP协议的一个应用层协议。
原理:
在我们点击某个链接的时候,浏览器会帮我们向服务器发送一段文本,这段文本包含了请求的链接。服务器收到请求后,就返回给一段文本给浏览器,浏览器将其解析后显示出来。文本的格式遵循HTTP的规范。
HTTP请求
浏览器向服务器请求web资源的时候,浏览器向服务器发送了一个http请求,其包含的内容有:
请求行
请求行,包含的内容有:客户端的请求方式,请求的资源,以及使用的http协议版本号;
请求行:GET/java.html HTTP/1.1
请求的方式有:POST(常用),GET(常用),HEAD,OPTIONS,DELETE,TRACE,PUT。
get,post的区别:
请求头
多个消息头,描述客户端请求哪台主机,以及客户端的一些环境信息等。
- Accept: text/html,image/* 【浏览器告诉服务器,它支持的数据类型】
- Accept-Charset: ISO-8859-1 【浏览器告诉服务器,它支持哪种字符集】
- Accept-Encoding: gzip,compress 【浏览器告诉服务器,它支持的压缩格式】
- Accept-Language: en-us,zh-cn 【浏览器告诉服务器,它的语言环境】
- Host: www.it315.org:80【浏览器告诉服务器,它的想访问哪台主机】
- If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,缓存数据的时间】
- Referer: http://www.it315.org/index.jsp【浏览器告诉服务器,客户机是从那个页面来的---反盗链】
- 8.User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)【浏览器告诉服务器,浏览器的内核是什么】
- Cookie【浏览器告诉服务器,带来的Cookie是什么】
- Connection: close/Keep-Alive 【浏览器告诉服务器,请求完后是断开链接还是保持链接】
- Date: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,请求的时间】
一个空行
HTTP响应
HTTP响应是服务器向浏览器响应的结果,一个HTTP响应包含:
状态行
描述服务器对请求的处理结果
格式: HTTP版本号+状态码+原因
例如: HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位十进制数。分类如下
多个消息头
用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息可以通知客户端如果处理这些回送的web资源
- Location: http://www.it315.org/index.jsp 【服务器告诉浏览器要跳转到哪个页面】
- Server:apache tomcat【服务器告诉浏览器,服务器的型号是什么】-
- Content-Encoding: gzip 【服务器告诉浏览器数据压缩的格式】
- Content-Length: 80 【服务器告诉浏览器回送数据的长度】
- Content-Language: zh-cn 【服务器告诉浏览器,服务器的语言环境】
- Content-Type: text/html; charset=GB2312 【服务器告诉浏览器,回送数据的类型】
- Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器该资源上次更新时间】
- Refresh: 1;url=http://www.it315.org【服务器告诉浏览器要**定时刷新**】
- Content-Disposition: attachment; filename=aaa.zip【服务器告诉浏览器以下载方式打开数据】
- Transfer-Encoding: chunked 【服务器告诉浏览器数据以分块方式回送】
- Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服务器告诉浏览器要保存Cookie】
- Expires: -1【服务器告诉浏览器不要设置缓存】
- Cache-Control: no-cache 【服务器告诉浏览器不要设置缓存】
- Pragma: no-cache 【服务器告诉浏览器不要设置缓存】
- Connection: close/Keep-Alive 【服务器告诉浏览器连接方式】* Date: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器回送数据的时间】
一个空行
实体内容
服务器向客户端返回的数据
3.JavaWeb目录结构
说明:
1.bbs表示一个web应用;
2.bbs目录下的html,jsp文件可以直接被浏览器访问;
3.WEB-INFO下的资源服务器可以方位;
4.web.xml文件是web程序的配置文件
5.classes放classes文件
6.jar包放在lib目录下
4.编写serlvet程序的步骤:
1.创建一个servlet类基础HttpServlet类;
2.重写doGet或者doPost方法;
3.在web.xml中配置serlvet
5.servlet的生命周期
1.加载servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例,这个时候首先调用的构造方法;
2.初始化。当Servlet被实例化后,Tomcat调用init()方法初始化对象;
3.处理服务。当浏览器访问Servlet的时候,Servlet会调用service()方法处理请求;
4.销毁。关闭Tomcat或检测到Servlet要从Tomcat删除的时候回自动调用destroy();释放资源;
5.卸载。垃圾回收
6.serlvet的细节
一个Serlvet可以被多次映射
servlet映射的URL可以用通配符
两种格式:
- “ *.扩展名 ”
-
“ / * ”;
3.同时出现的话看谁的匹配度更高,*.扩展名优先级最低。
匹配所有:
匹配扩展名为.jsp的
servlet是单例的
为什么是单例的
浏览器多次对servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会在内存中,为后续的请求做服务,直到服务器关闭。
每次访问请求对象和相应对象都是新的
对于每次请求,Servlet容器都会创建一个新的httpServletRequest请求对象和httpServletResponse响应对象。然后servlet的service方法调用这两个参数,根据请求的方式调用doGet还是doPost
线程安全问题
多个用户并发访问Servlet共享资源的时候会出现线程安全问题。
解决方法:
1.如果一个变量被多位用户共享,则在访问该变量的时候,加同步机制synchronize(对象) {};
2.不需要共享的时候,则直接在doGet,doPost中定义,这样不会存在线程安全问题。
load-on-startup
在<servlet>元素中配置一个<load-on-startup>元素的话,那么在web应用程序启动的时候,就会装载并创建servlet对象,以及调用init方法。
作用:
1.为整个web应用创建必要的数据表和数据;
2.完成一些定时的任务;如写日志,备份数据等
ServletConfig对象
作用:
读取web.xml中配置的初始化信息。在web.xml中配置可以使程序更加灵活。
实例:
ServletContext对象
什么是ServletContext对象
当我们启动Tomcat的时候,就会创建一个ServletContext对象。它代表着web站点。
作用
1.所有Servlet都共享着一个ServletContext对象,所有Servlet之间通过ServletContext实现通讯。
2.ServletConfig获取的是单个Servlet的参数信息,而ServletContext可以获取的是配置整个web程序的参数信息。
3.获取web站点的资源
4.实现Serlvet的转发
利用ServletContext获取web站点配置的信息
DOM
读取资源文件
第一种方式:
通过读取servlet编译后的中WEB-INF\classes文件夹中的资源
FileInputStream fileInputStream = new FileInputStream("D:\\zhongfucheng\\web\\WEB-INF\\classes\\zhongfucheng\\web\\1.png");
System.out.println(fileInputStream);
但是这种方式的话每次读取文件都要写上绝对路径,太不灵活。优化如下:
//获取到ServletContext对象
ServletContext servletContext = this.getServletContext();
//调用ServletContext方法获取到读取文件的流
InputStream inputStream = servletContext.getResourceAsStream("/WEB-INF/classes/zhongfucheng/web/1.png");
第二种方式
把文件放在web目录下,直接通过文件名访问
//获取到ServletContext对象
ServletContext servletContext = this.getServletContext();
//调用ServletContext方法获取到读取文件的流
InputStream inputStream = servletContext.getResourceAsStream("2.png");
第三种方式
通过类加载器读取资源文件
//获取到类装载器
ClassLoader classLoader = Servlet111.class.getClassLoader();
//通过类装载器获取到读取文件流
InputStream inputStream = classLoader.getResourceAsStream("3.png");
转载:
作者:java3y
链接:https://www.imooc.com/article/24335
来源:慕课网