Servlet
1) 概述
- 官方:servlet是运行在web服务器中能够编写java代码的小型程序
- 解释说法:
①servlet本质上就是一个java的接口类
②和普通的类相比,一个类要想在服务端运行就需要实现servlet接口规范
2)作用
在服务器端接受浏览器带来的请求数据(请求行 请求头 请求体)以及给浏览器做响应数据(响应行 响应头 响应体)
3)servlet快速入门
一、servlet2.5的方式: 有web.xml配置文件
步骤:
1 创建web项目 JAVAEE 5(servlet2.5) 带web.xml配置文件
2 编写一个类 实现java提供的servlet规范
3 告诉tomcat 自己 servlet的浏览器访问地址
ps: tomcat只要一启动 就会去加载web.xml文件 只加载一次
servlet的创建和服务方法service的执行都是有tomcat自动完成的
二、 扩展–servlet3.0的方式: 没有web.xml配置文件
1. 创建JavaEE6(含6)以上的工程
2. 创建一个类 实现servlet接口
3. 创建servlet,在@WebServlet注解中添加urlPatterns = "/demo2",作为请求路径
4)servlet的生命周期
生命周期:从生到死的流程
servlet从生到死的流程都离不开以下3个方法
init方法 service方法 destroy方法都和servlet的生命周期相关
init方法 Servlet对象只要一创建出来就会调用的方法
service方法 处理浏览器交互的方法
destroy方法 对象销毁后执行的方法
面试题:聊一下Servlet的生命周期?
当浏览器第一次访问servlet的时候 服务器会创建servlet对象 调用init方法做初始化 对象只创建一次 所有人用的都是同一个创建出来的servlet对象 所以servlet是单例
每次访问到servlet的时候 servlet的service方法就会被调用 访问一次调用一次
当服务器关闭的时候 服务器会调用destroy方法销毁掉当前servlet对象 做对象销毁后的操作
5)servlet的体系结构
问题
目前我们已经学会创建一个类实现sevlet接口的方式开发Servlet程序,实现Servlet接口的时候,我们必须实现接口的所有方法。但是,在servlet中,真正执行程序逻辑的是service,对于servlet的初始化和销毁,由服务器调用执行,开发者本身不需要关心。因此,有没有一种更加简洁的方式来开发servlet程序呢?
查询到的继承体系:
Servlet--接口
|
|
|
GenericServlet
|
|
|
HttpServlet (功能最多)
企业开发中:继承HttpServlet,只需要复写doget和dopost方法,而开发工具已经提供好了模板,我们直接用即可
public class MyServlet5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("和浏览器交互了..");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
6)Servlet的配置
1 url-pattern配置
我们在创建servlet后,如果想要这个servlet可以被我们访问到,必须在web.xml文件中对其进行配置。
在其中有一个url-pattern的标签是用于确定我们访问一个servlet的路径
接下来,我们详细介绍一下关于这个标签的配置
问题1:一个servlet是否可以被不同的路径映射?
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>cn.itcast.web.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/sd1</url-pattern>
<url-pattern>/sd2</url-pattern>
<url-pattern>/sd3</url-pattern>
<url-pattern>/sd</url-pattern>
</servlet-mapping>
答案是可以的,但一般在开发中,我们只需要配置一个有效路径即可
问题2:路径映射的配置方式还有哪些?
1 完全路径匹配 我们之前写的都是完全匹配方式 ,它要求必须以”/”开始
例如: /aaa /a/aa/aaa
2 目录匹配 必须以”/”开始,以”*”结束
例如:/* /a/*
3 扩展名匹配 不能以”/”开始,以*.xx结束 xx代表的是后缀名
例如: *.do *.action *.abc ...
问题3:多种匹配的优先级问题?
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<url-pattern>/aaa</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletDemo3</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
只有一个servlet会执行,执行的结果是按照优先级去执行的
优先级:完全匹配>目录匹配>扩展名匹配
2 load-on-startup配置
servlet的默认创建是在第一次访问的时候
servlet在服务器启动时,就创建出来
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>cn.itcast.web.ServletDemo1</servlet-class>
<!--将servlet的创建时机提前到服务器加载
取值:正整数
特点:数值越小 优先级越高
-->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
load-on-startup的取值是正整数,数字越小,优先执行权就越高
扩展:数字1被tomcat默认的servlet给占用了,在tomcat的web.xml中我们可以看到也使用了一个servlet
ps:tomcat一启动 会加载2个web.xml文件,一个是自己项目的web.xml,一个tomcat的web.xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
该servlet是tomcat帮我们创建的,主要用来处理其它的servlet处理不了的请求
比如在当前下访问不到的资源都会走该servlet,该servlet底层默认走写好的页面(404 500…)
Servlet的路径
我们在开发中,经常在页面上通过表单或超连接向服务器发送请求,如果我们访问的是一个servlet,那么这时访问servlet的路径应该如何书写?接下来我们就介绍一下,关于在客户端浏览器访问servlet的路径问题.
servlet的访问路径分为2种
servlet的访问地址分为2种:
绝对路径(网络地址):企业开发的选择 --掌握
带协议的绝对路径: 地址栏的访问地址
例如:http://localhost:8080/web06_2/hello
即可以访问本机的也可以访问外部的
不带协议的绝对路径:省略协议和端口号
例如:/web06_2/hello 以/开始以资源名称结尾
默认访问是本机的项目
相对路径(网络地址): 比较自己和目标资源的相对地址
index.html: http://localhost:8080/web06_2/html/html2/index.html
MyServlet: http://localhost:8080/web06_2/hello
结论:
对于我们后续的学习与开发中,我们使用绝对路径会比较多一些,而在使用绝对路径时,我们主要使用的是不带协议的绝对路径,而带协议的绝对路径只要在访问站外资源时才会使用。对于相对路径,我们需要分析它们的相对关系,所以不建议大家使用。
ServletContext对象
概述
ServletContext:Servlet的上下文对象 (全局管理者)
特点:在整个项目中就只有一个ServletContext对象
创建:tomcat一启动就会为部署在它上面的项目创建一个对应的全局管理者-ServletContext
销毁:tomcat一关闭就会销毁全局管理者-ServletContext
作用
1 可以作为容器,在多个servlet之间共享数据 (重要)
1.setAttribute(String key Object vlue) 存
2.Object getAttribute(String key) 取 如果没有取到是null
3.removeAttribute(String key) 删
2 可以获取服务器上项目的资源路径和流(路径和流)---(重要)下载
1. getRealPath(String path) 获取虚拟路径
2. getResourceAsStream(String path) 获取当前项目在虚拟路径上的某个资源的流
API实现
获取servletContext对象:
getServletContext()
数据存取操作:保存在ServletContext中的数据是项目全局共享的数据
作为容器:用来在多个servlet之间传递信息数据
setAttribute(String key Object vlue) 存
Object getAttribute(String key) 取
removeAttribute(String key) 删
读取项目资源的方法
1. getRealPath(String path)
获取WEB项目的资源路径
2. getResourceAsStream(String path)
根据WEB项目的资源流
3. getInitParameter(String name) --和框架有关系的
获取web.xml中的参数内容