servlet规范
- 1:servlet规范介绍
- 每日一道Java面试题
- 2:Servlet接口实现类:
- 3:Servlet接口实现类的开发步骤:
- 4:Servlet对象生命周期:
- 5:HttpServletResponse接口
- 6:HttpServletRequest接口
- 7:请求对象与响应对象生命周期
- 8:欢迎资源文件
- 9:Http状态码:
- 10:多个Servlet之间调用规则:
- 11:重定向解决方案:
- 12:请求转发解决方案:
- 13:多个Servlet之间数据共享实现方案:
- 14:ServletContext接口
- 15:Cookie
- 16:HttpSession接口:
- HttpSession与Cookie的区别:【面试题】
- 17:HttpServletRequest接口实现数据共享
- 18:Servlet规范扩展--->监听器接口
- 19:Servlet规范扩展--->Filter(过滤器接口)
- 每日一道Java面试题
1:servlet规范介绍
1:servlet规范来自于javaEE规范中的一种
2:作用:
1:在servlet规范中,指定【动态资源文件】开发步骤。
2:在servlet规范中,指定http服务器调用动态资源文件规则。
3:在servlet规范中,指定http服务器管理动态资源文件实例对象规则。
2:Servlet接口实现类:
1:Servlet接口来自于servlet规范下的一个接口,这个接口存在于http服务器提供的jar包中。
2:Tomcat服务器下lib文件有一个servlet-api.jar存放servlet接口(javax.servlet.Servlet接口)
3:servlet规范中认为,http服务器能调用的【动态资源文件】必须是一个Servlet接口实现类。
例子:
class Student{
//不是动态资源文件,Tomact无权调用
}
class Student implements Servlet{
//合法的动态资源文件,Tomcat有权力调用。
Servlet obj = new Student;
obj.doGet();
}
3:Servlet接口实现类的开发步骤:
第一步:创建一个java类,继承HttpServlet父类,使之成为一个Servlet接口实现类。
第二步:重写HttpServlet父类的两个方法。goGet或者doPost
第三步:将servlet接口实现类信息【注册】到Tomcat服务器中。
【网站】—>【web】—>【WEB-INF】—>web.xml
<!--将Servlet接口实现类,类路径地址交给Tomcat-->
<servlet>
<!--声明一个变量存储servlet接口实现类类路径-->
<servlet-name>mm</servlet-name>
<!--声明servlet接口实现类类路径-->
<servlet-class>com.sss.controller.OneServlet</servlet-class>
</servlet>
Tomcat服务器读取到这个信息,就会转换为:
String mm = “com.sss.controller.OneServlet”;
<!--为了降低用户访问Servlet接口实现类的难度,需要设置简短请求别名-->
<Servlet-mapping>
<servlet-name>mm</servlet-name>
<!--设置简短请求别名,别名书写的时候必须以”/”为开头-->
<url-pattern>/one</url-pattern>
</Servlet-mapping>
4:Servlet对象生命周期:
1:网站中所有的Servlet接口实现类的实例对象,只能由http服务器负责创建,开发人员不能手动创建Servlet接口实现类的实例对象。
2:在默认情况下,http服务器接收到对于当前Servlet接口实现类第一次请求时,自动创建这个Servlet接口实现类的实例对象。
在手动配置情况下,要求http服务器在启动时自动创建某个Servlet接口实现类的实例对象:
<servlet>
<!--声明一个变量存储servlet接口实现类类路径-->
<servlet-name>mm</servlet-name>
<!--声明servlet接口实现类类路径-->
<servlet-class>com.sss.controller.OneServlet</servlet-class>
<!--填写一个大于0的整数即可-->
<load-on-startup>30</load-on-startup>
</servlet>
3:在http服务器运行期间,一个Servlet接口实现类只能被创建一个实例对象。
4:在http服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁。
5:HttpServletResponse接口
介绍:
1:HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
2:HttpServletResponse接口实现类由Http服务器负责提供
3:HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【响应体】交给浏览器
4:开发人员习惯于将HttpServletResponse接口修饰的对象称为【响应对象】
主要功能:
1:将执行结果以二进制形式写入到【响应体】
2:设置响应头中【content-type】属性值,从而控制浏览器使用对应的编译器将响应体二进制数据编译为【文字,图片,视频,命令】
3:设置响应头中【location】属性,将一个请求地址赋值给location,从而控制浏览器向指定服务器发送请求。
6:HttpServletRequest接口
1:介绍:
1:HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
2:HttpServletRequest接口实现类由Http服务器负责提供
3:HttpServletRequest接口负责在doGet/doPost运行时读取Http请求协议包中的信息。
4:开发人员习惯将HttpServletRequest接口修饰的对象称为【请求对象】
2:作用:
1:可以读取Http请求协议包中【请求行】信息
2:可以读取保存在Http请求协议包中【请求头】或者【请求体】中请求参数。
3:可以代替浏览器向Http服务器申请资源文件调用。
7:请求对象与响应对象生命周期
1:在Http服务器接收到浏览器发送的【Http请求协议包】之后,自动为当前的【Http请求协议包】生成一个【请求对象】和【响应对象】。
2:在Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】作为实参传递到方法,确保doGet/doPost正确执行。
3:在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁。
8:欢迎资源文件
1:前提:
用户可以记住网站名,但是不会记住网站资源文件名
2:默认欢迎资源文件
用户发送了一个针对某个网站的【默认请求】时,此时由Http服务器自动从当前网站返回的资源文件,就是默认欢迎资源文件。
正常请求:http://localhost:8080/myWeb/index.html
默认请求:http://localhost:8080/myWeb/
3:Tomcat对于默认欢迎资源文件定位规则:
1:规则位置:Tomcat安装位置/conf/web.xml
2:规则命令:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
4:设置当前网站的默认欢迎资源文件规则
1:规则位置:网址/web/WEB-INF/web.xml
2:规则命令:
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
3:网站设置自定义默认文件定位规则,此时Tomcat自带定位规则失效
9:Http状态码:
1:介绍:
1:由三位数字组成的一个符号
2:Http服务器在推送响应包之前,根据本次请求处理情况,将Http状态码写入到响应包中【状态行】上
3:如果Http服务器针对本次请求,返回了对应资源文件。通过Http状态码通知浏览器应该如何处理这个结果。
如果Http服务器针对本次请求,无法返回对应的资源文件,通过Http状态码向浏览器解释不能提供服务的原因。
2:分类:
1:组成:100----599;分为5个大类
2:1xx:
最有特征的是100;通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收响应包之后,继续向Http服务器,索要依赖的其他资源文件。
3:2xx:
最有特征的是200;通知浏览器本次返回的资源文件是一个独立的资源文件,浏览器在接收到之后不需要索要其他关联文件
4:3xx:
最有特征是302;通知浏览器本次返回的不是一个资源文件内容,而是一个资源文件地址,需要浏览器根据找个地址自动发起请求,来索要这个资源文件。
resp.sendRedirect(“资源文件地址”);写入到响应头中
更改location属性
而这个行为导致Tomcat将302状态码写入到状态行。
5:3xx:
404:通知浏览器,由于在服务端没有定位到被访问的资源文件,因此无法提供帮助。
405:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet),但是这个Servlet对于浏览器采用的请求方式不能处理。
6:5xx:
500:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet),这个Servlet可以接收浏览器采用的请求方式,但是Servlet在处理请求期间,由于Java异常导致处理失败。
10:多个Servlet之间调用规则:
1:前提条件:
某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理。但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器发起多次请求才能得到服务。
这样增加用户获得服务难度,导致用户放弃访问当前网站。
2:提高用户使用感受规则:
无论本次请求涉及到多少个Servlet,用户只需要【手动】通知浏览器发起一次请求即可。
3:多个Servlet之间调用规则:
1:重定向解决方案
2:请求转发解决方案
11:重定向解决方案:
1:工作原理:
用户第一次通过【手动方式】通知浏览器访问OneServlet。OneServlet工作完毕后,将TwoServlet地址写入到响应头location属性中,导致Tomcat将302状态码写入到状态行。
在浏览器接收到响应包之后,会读取到302状态码,此时浏览器自动根据响应头中location属性地址发起第二次请求,访问TwoServlet去完成请求中剩余任务。
2:实现命令:
resp.sendRedirect(“请求地址”);
将地址写入到响应包中响应头的location属性。
3:特征:
1:请求地址:
既可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名)
也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
2:请求次数:
浏览器至少发送两次请求,但是只有一次请求是用户手动发送的。
后续请求都是浏览器自动发送的。
3:请求方式:
重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方案调用的资源文件接收的请求方式一定是【GET】
4:缺点:
重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间。
12:请求转发解决方案:
1:原理:
用户第一次通过手动方式要求浏览器访问OneServlet。OnServlet工作完毕后,通过当前请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet。Tomcat在接收到这个请求之后,自动调用TwoServlet来完成剩余任务。
2:实现命令:请求对象代替浏览器向Tomcat发送请求
1:通过当前的请求对象生成资源文件申请报告对象
RequestDispatcher report = req.getRequestDispatcher(“/资源文件名”); 一定要以”/”为开头
2:将报告对象发送给Tomcat
report.forward(当前请求对象,当前响应对象);
3:优点:
1:无论本次请求涉及到多少个Servlet,用户只需要手动通过浏览器发送一次请求。
2:Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数,增加处理服务速度。
4:特征:
1:请求次数:在请求过程中,浏览器只发送一次请求
2:请求地址:
只能向Tomcat服务器中申请调用当前网站下资源文件地址
RequestDispatcher report = req.getRequestDispatcher(“/资源文件名”);不要写网站名
3:请求方式:
在请求转发过程中,浏览器只发送了一个Http请求协议包。
参与本次请求的所有Servlet共享一个请求协议包,因此这些Servlet
接收的请求方式与浏览器发送的请求方式保持一致。
13:多个Servlet之间数据共享实现方案:
1:数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用。
2:Servlet规范中提供四种数据共享方案:
1:ServletContext接口
2:Cookie类
3:HttpSession接口
4:HttpServletRequest接口
14:ServletContext接口
1:介绍:
1):来自于Servlet规范中一个接口,在Tomcat中存在于servlet-api.jar,在Tomcat中负责提供这个接口实现类。
2):如果两个Servlet来自于同一个网站,彼此之间通过网站的ServletContext实例对象实现数据共享。
3): 开发人员习惯于将ServletContext对象称为【全局作用域对象】
2:工作原理:
每一个网站都存在一个全局作用域对象,这个全局作用域对象【相当于】一个Map,在这个网站中OneServlet可以将一个数据存入到全局作用域对象,当前网站中其他Servlet此时都可以从全局作用域对象中,得到这个数据。
3:全局作用域对象生命周期:
1):在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象
2):在Http服务器运行期间时,一个网站只有一个全局作用域对象。
3):在Http服务器运行期间,全局作用域对象一直处于存活状态。
4):在Http服务器关闭时,负责将当前网站中的全局作用域对象,进行销毁。
全局作用域对象生命周期贯穿网站整个运行期间
4:运行命令:
1:通过请求对象,索要当前全局作用域对象
ServletContext application = req.getServletContext();
2:将数据添加到全局作用域对象,作为共享数据
application.setAttribute(“key1”,数据);
3:从全局作用域对象得到指定关键字对应数据
Object key1 = application.getAttribute(“key1”);
15:Cookie
1:介绍:
1):Cookie来自于Servlet规范中一个工具类,存在于Tomcat提供的servlet-api.jar中。
2):如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于Cookie对象进行数据共享。
3):Cookie存放当前用户的私人数据,在共享数据过程中提高服务质量。
4):在现实生活场景中,Cookie相当于用户在服务端得到【会员卡】
2:工作原理:
用户通过浏览器第一次向myWeb网站发送请求申请OneServlet。
OneServlet在运行期间创建一个Cookie,存储与当前用户相关的数据,OneServlet工作完毕之后,【将Cookie写入到响应头中】交还给当前浏览器。
浏览器收到响应包之后,将Cookie存储在浏览器的缓存。
一段时间之后,用户通过【同一个浏览器】再次向【myWeb网站】发送请求申请TwoServlet时。【浏览器需要无条件的将myWeb网站之前的推送过来的Cookie,写入到请求头中】发送过去,此时TwoServlet在运行时,就可以通过读取请求头中的Cookie中的信息,得到OneServlet提供的共享数据。
3:实现命令:
同一个网站中 OneServlet 与 TwoServlet 借助于Cookie实现数据共享。
OneServlet:
//1:创建一个Cookie对象,保存共享数据(当前用户的数据)
Cookie card = new Cookie(“key1”,”abc”);
Cookie card2 = new Cookie(“key2”,”bgm”);
*Cookie相当于一个Map
*一个Cookie中只能存放一个键值对
*这个键值对的key和value只能是String
*键值对中key不能是中文
//2:通过响应对象,将Cookie写入到响应头,交给浏览器
resp.addCookie(card);
resp.addCookie(card2);
TwoServlet:
1:调用请求对象从请求头中得到浏览器返回的Cookie
Cookie cookieArray[] = req.getCookies(); //返回值是Cookie数组
2:循环遍历数据得到每一个Cookie的key和value
for(Cookie card : cookieArray){
String key = card.getName(); //读取key
String value = card.getValue(); //读取value
}
4:Cookie生命周期
1):在默认情况下,Cookie对象存放在浏览器的缓存中。因此只要浏览器关闭,Cookie对象就会被销毁。
2):在手动设置情况下,可以要求浏览器将接收的Cookie存放在客户端计算机硬盘上,同时需要指定Cookie在硬盘上存活的时间,在存活时间范围内,关闭浏览器,关闭客户端计算机,关闭服务器,都不会导致Cookie被销毁。
cookie.setMaxAge(60); //cookie在硬盘上存活1分钟
16:HttpSession接口:
1:介绍:
1):HttpSession接口来自于Servlet规范下一个接口,存在于Tomcat中servlet-api.jar,其实现类由Http服务器提供的。Tomcat提供实现类存在于servlet-api.jar。
2):如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于HttpSession对象进行数据共享。
3):开发人员习惯于将HttpSession接口修饰对象称为【会话作用域对象】
HttpSession与Cookie的区别:【面试题】
1):存储位置:一个在天上,一个在地下
Cookie:存放在客户端计算机(浏览器内存/硬盘)
HttpSession:存放在服务端计算机内存上
2):数据类型:
Cookie对象存储共享数据的类型只能是String类型
HttpSession对象可以存储任意类型的共享数据Object
3):存储的数据数量:
一个Cookie对象只能存储一个共享数据
HttpSession使用Map集合存储共享数据,所以可以存储任意数量共享数据。
4):参照物:
Cookie相当于客户在服务端【会员卡】
HttpSession相当于客户在服务端【私人保险柜】
3:命令实现:同一个网站下OneServlet将数据传递给TwoServlet
class OneServlet{
public void goGet(req,resp){
//1:调用请求对象向Tomcat索要当前用户在服务端的私人储物柜【会话作用域对象】
HttpSession session = req.getSession();
//2:将数据添加到私人储物柜
session.setAttribute(“key1”,共享数据);
}
}
浏览器访问/myWeb/TwoServlet
class TwoServlet{
public void goGet(req,resp){
//1:调用请求对象向Tomcat索要当前用户在服务端的私人储物柜【会话作用域对象】
HttpSession session = req.getSession();
//2:从会话作用域对象得到OneServlet提供的共享数据
Object obj = session.getAttribute(“key1”);
}
}
4:Http服务器如何将用户于HttpSession关联起来呢?
HttpSession内部通过Cookie关联
5:getSession() 与 getSession(false)
1):getSession():如果当前用户在服务端已经拥有了自己的私人储物柜,要求Tomcat服务器将这个私人储物柜返回,如果当前用户在服务端尚未拥有自己的私人储物柜,要求Tomcat为当前用户创建一个新的私人储物柜。
2):getSession(false):如果当前用户在服务端已经拥有了自己的私人储物柜,要求Tomcat服务器将这个私人储物柜返回,如果当前用户在服务端尚未拥有自己的私人储物柜,此时Tomcat将返回一个null。
6:HttpSession生命周期:
1:用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中。
2:在浏览器关闭时,意味着用户与他的HttpSession关系被切断
3:由于Tomcat无法检测浏览器何时关闭,因此浏览器关闭时并不会导致Tomcat将浏览器关联的HttpSession进行销毁。
4:为了解决这个问题,Tomcat为每一个HttpSession对象设置【空闲时间】,这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁掉这个HttpSession。
7:HttpSession空闲时间手动设置
在当前网站/web/WEB-INF/web.xml设置
5代表空闲5分钟
<session-config>
<session-timeout>5</session-timeout>
</session-config>
17:HttpServletRequest接口实现数据共享
1:介绍:
1):在同一个网站中,如果两个Servlet之间通过【请求转发】方式进行调用,彼此之间共享一个请求协议包。而一个请求协议包只对应一个请求对象,因此Servlet之间共享一个请求对象。此时可以利用这个请求对象在两个Servlet之间实现数据共享
2):在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】
2:命令实现:
1):OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供共享数据
OneServlet{
public void doGet(HttpServletRequest req,HttpServletResponse resp){
//1:将数据添加到【请求作用域对象】中attribute属性中
req.setAttribute(“key1”,数据); //数据类型可以任意类型Object
//2:向Tomcat申请调用TwoServle【使用请求转发】
req.getRequestDispatcher(“/two”).forward(req,resp);
}
}
TwoServlet{
public void doGet(HttpServletRequest req,HttpServletResponse resp){
//从当前请求对象得到OneServlet写入的共享数据
Object obj = req.getAttribute(“key1”);
}
}
18:Servlet规范扩展—>监听器接口
1:介绍:
1):一组来自于Servlet规范下的接口,共有8个接口。存在与Tomcat的servlet-api.jar包
2):监听器接口需要开发人员亲自实现,Http服务器提供的jar包,并没有对应的实现类。
3):监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】
2:作用域对象
1):在Servlet规范中,认为在服务端内存中可以在某些条件下为两个Servlet之间提供数据共享方案的对象,被称为【作用域对象】
2):Servlet规范下作用域对象:
ServletContext:全局作用域对象
HttpSession:会话作用域对象
HttpServletRequest:请求作用域对象
3:监听器接口实现类开发规范:三步
1):根据监听的实际情况,选择对应监听器接口进行实现
2):重写监听器接口声明【监听事件处理方法】
3):在web.xml文件中将监听器接口实现类注册到Http服务器上
4:ServletContextListener接口:
1):作用:通过这个接口合法的检测全局作用域对象被初始化的时刻,以及被销毁的时刻。
2):监听事件处理方法:
public void contextInitlized():在全局作用域对象被Http服务器初始化时被触发调用
public void contextDestory():在全局作用域对象被Http服务器销毁时被触发调用
5:ServletContextAttributeListener接口
1):作用:通过这个接口合法的检测全局作用域对象中共享数据的变化时刻。
2):监听事件方法:
public void contextAdd():在全局作用域对象添加共享数据时触发
public void contextReplaced():在全局作用域对象更新共享数据时触发
public void contextRemove():在全局作用域对象删除共享数据时触发
6:全局作用域对象共享数据变化时刻:
ServletContext application = req.getServletContext();
application.setAttribute(“key1”,100); //新增共享数据
application.setAttribute(“key1”,200); //更新共享数据:key1更新为200
application.removeAttribute(“key1”); //删除共享数据
19:Servlet规范扩展—>Filter(过滤器接口)
1:介绍:
1):来自于Servlet规范下接口,在Tomcat中存在于servlet-api.jar包
2):Filter接口实现类由开发人员负责提供,Http服务器不负责提供
3):Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截。
2:具体作用:
1):拦截Http服务器,帮助Http服务器检测当前请求合法性
2):拦截Http服务器,对当前请求进行增强操作
3:Filter接口实现类开发步骤:三步
1):创建一个Java类来实现Filter接口
2):重写Filter接口中的doFilter()方法,在这个方法中做请求合法性或者增强操作。
3):注册过滤器:web.xml将过滤器注册到Http服务器中。
4:Filter拦截地址格式
1):命令格式
<filter-mapping>
<filter-name>OneFilter</filter-name>
<url-pattern>拦截地址</url-pattern>
</filter-mapping>
2):命令作用:
拦截地址通知Tomcat在调用任何资源文件之前需要调用OneFilter过滤进行拦截
3):要求Tomcat在调用某一个具体文件之前,来调用OneFilter来拦截
<url-pattern>/Tu.html</url-pattern>
4):要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter来拦截。
<url-pattern>/img/*</url-pattern>
5):要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截
<url-pattern>*.jpg</url-pattern>
- :要求Tomcat在网站中调用任意文件时,来调用OneFilter拦截
<url-pattern>/*</url-pattern>