1、Servlet概念
Servlet = (Server + Applet)是运行在服务端(Tomcat)的Java小程序,是sun公司提供一套定义动态资源规范; 从代码层面上来讲Servlet就是一个接口
Servlet 是 JavaEE 规范之一。规范就是接口
Servlet 也是 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
作用:
用来接收、处理客户端请求、响应数据给浏览器(客户端)Web资源。在整个Web应用中,Servlet主要负责接收处理请求、协同调度功能。我们可以把Servlet称为Web应用中的控制器(Controller)
Servlet的请求过程
2、实现步骤
第一步:创建HTML页面
<!--
使用绝对路径: /部署的项目名/要访问的资源路径
-->
<a href="/web/hello">访问HelloServlet</a>
第二步:创建Servlet类HelloServlet01
实现步骤:
* 1: 定义类实现接口 Servlet
* 2: 重写接口中的抽象方法(5个)
* 3: 配置的核心配置文件 web.xml
*
* Servlet的两种说法
* 狭义 : Servlet专门指的是接口Servlet
* 广义 : 广义上的Servlet,指的是该接口的所有的实现类
public class HelloServlet01 implements Servlet {
/**
* 方法重写: service
* 作用: 浏览器请求达到该方法
* 参数: servletRequest对象,负责获取客户端的请求参数
* 参数: servletResponse对象,负责向客户端响应数据
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet 欢迎你");
//向客户端响应字符串 Hello,I am Servlet
servletResponse.getWriter().write("Hello,I am Servlet");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException { }
@Override
public ServletConfig getServletConfig() { return null; }
@Override
public String getServletInfo() {return null; }
@Override
public void destroy() { }
第三步:在web.xml中配置HelloServlet01
<!--
配置HelloServlet的映射路径
-->
<servlet>
<!--
相当于给该Servlet取个名,我们可以就使用Servlet的类名/类名首字母改小写
-->
<servlet-name>helloServlet01</servlet-name>
<!--
你要配置的那个Servlet的全限定名
-->
<servlet-class>com.atguigu.servlet.HelloServlet01</servlet-class>
</servlet>
<servlet-mapping>
<!--
和servlet标签中的servlet-name保持一致
-->
<servlet-name>helloServlet</servlet-name>
<!--
这就是要给HelloServlet配置的映射路径,以/开头
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3、Servlet的生命周期(创建—销毁)
3.1 概念:
Servlet的生命周期就是servlet从创建到销毁的过程,我们所要去探讨的就是Servlet对象在什么时候创建出来以及在什么时候销毁。当然创建和销毁Servlet对象的工作是不需要我们去做的,由Tomcat服务器完成
创建:
默认情况下是在第一次有请求访问该Servlet实例的时候才会创建该Servlet对象
销毁:
在服务器关闭,或者当前项目从服务器中移除的时候会销毁当前项目中的所有Servlet对象
3.2 Servlet的生命周期方法
在Servlet的生命周期中必然会经历的方法我们称之为Servlet的生命周期方法,总共包含三个方法:init、service、destroy
对象的生命周期分为四个阶段
1、执行 Servlet 构造器方法
2、执行 init 初始化方法(Servlet对象的初始化)
该方法会在Servlet实例对象被创建出来之后执行,我们可以在该方法中获取当前Servlet的初始化参数,以及进行一些读取配置文件之类的操作
Tomcat服务器,在启动的时候,就创建Servlet对象
Servlet对象的初始化时机,默认是客户端第一次请求的时候创建,创建对象的同时,tomcat服务器调用方法 init(),并传递参数 servletConfig
第1、2阶段,是在第一次访问的时候创建 Servlet 程序时会调用。(只调用一次)
3、执行 service 方法(客户端请求过程)每次访问都会调用
该方法会在Servlet实例对象每次接收到请求的时候均执行,我们可以在该方法中接收、处理请求,以及将客户端需要的数据响应给客户端
客户端浏览器每次请求Servlet都会调用方法service , Tomcat引擎调用
4、执行 destroy 销毁方法(对象的销毁)在 web 工程停止的时候调用
该方法会在Servlet实例对象销毁之前执行,我们可以在该方法中做一些资源回收、释放、关闭等等操作
4、Servlet的体系结构
4.1类关系(通过继承 HttpServlet 实现 Servlet 程序)
Servlet接口有一个实现类是GenericServlet,而GenericServlet有一个子类是HttpServlet,我们创建Servlet的时候会选择继承HttpServlet,因为它里面相当于也实现了Servlet接口,并且对一些方法做了默认实现;而且子类的功能会比父类的更加强大
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法
3、到 web.xml 中的配置 Servlet 程序的访问地址
4.2 ServletConfig接口
是Servlet的配置信息类
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象
作用
1、可以获取 Servlet 程序的别名 servlet-name 的值
2、获取初始化参数 init-param
3、获取 ServletContext 对象
接口中的方法
方法名 | 作用 |
getServletName() | 获取HelloServlet定义的Servlet名称 |
getServletContext() | 获取ServletContext对象 org.apache.catalina.core.ApplicationContextFacade@71135c0c |
getInitParameter(String key) | 获取配置Servlet时设置的『初始化参数』,根据名字获取值 |
getInitParameterNames() | 获取所有初始化参数名组成的Enumeration对象 |
public void init(ServletConfig servletConfig) throws ServletException {
//String getServletName() 获取Servlet名字
String servletName = servletConfig.getServletName();
System.out.println("servletName = " + servletName);
//String getInitParameter(String key) 获取Servlet的初始化参数,参数在web.xml配置
// <init-param>
// <param-name>java</param-name>
// <param-value>java好学吗</param-value>
// </init-param>
String value = servletConfig.getInitParameter("java");
System.out.println("value = " + value);
// getInitParameterNames() 获取Servlet的初始化参数的所有的键
//返回值是向量枚举 Enumeration == Iterator
Enumeration<String> parameterNames = servletConfig.getInitParameterNames();
//hasMoreElements == hasNext
while (parameterNames.hasMoreElements()){
//nextElement == next
String element = parameterNames.nextElement();
System.out.println("element = " + element);
}
ServletConfig : 获取的初始化参数,针对当前的Servlet有效的
ServletContext : 对应整个的Web应用程序是有效
5、ServletContext 类
5.1 概念
服务器Tomca为其部署的每一个应用(项目)都创建了一个ServletContext对象。ServletContext属于整个项目的,该项目中的所有Servlet都可以共享同一个ServletContext对象
ServletContex作为全局的域t对象,域对象就是在一定的作用域范围内进行数据共享的对象,ServletContext作为全局域对象可以在整个项目的所有动态资源(包含所有Servlet)中进行数据共享
1、ServletContext 是一个接口,它表示 Servlet 上下文对象
2、一个 web 工程,只有一个 ServletContext 对象实例。
3、ServletContext 对象是一个域对象。
4、ServletContext 是在 web 工程部署启动的时候创建,在 web 工程停止的时候销毁
获取ServletContex的API
//方式一:调用Servlet自身的getServletContext方法获取
ServletContext ServletContext = getServletContext()
//方式二:调用ServletConfig接口的getServletContext方法
ServletContext ServletContext = servletConfig.getServletContext();
//HttpServletRequest对象也实现了ServletConfig接口,所以也有getServletContext()方法
ServletContext ServletContext = request.getServletContext();
5.2 ServletContext 类的五个作用
1、获取 web.xml 中配置的上下文参数 context-param
getInitParameter()
在web.xml中配置
<context-param>
<!--参数名,键-->
<param-name>java</param-name>
<!--参数值-->
<param-value>Java不太好学</param-value>
</context-param>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
//getInitParameter(String 键) 返回字符串的值
String java = context.getInitParameter("java");
System.out.println("java = " + java);
}
2、获取当前的工程名
getContextPath()
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//找到ServletContext
ServletContext context = this.getServletContext();
//获取当前的工程名
String contextPath = context.getContextPath();
//System.out.println("当前工程的名字:"+ contextPath);
//请求重定向 , 缺点:因为工程名写死了。 解决方案: 动态获取工程名
//response.sendRedirect(contextPath+"/1.html");
//为了大家方便获取当前工程名字,那么request对象也相应的增加该方法。
response.sendRedirect(request.getContextPath()+"/1.html");
}
3、获取工程部署后在服务器硬盘上的绝对路径
getRealPath()
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
//1 获取 web目录下的1.txt的绝对路径
String path1 = context.getRealPath("1.txt");
System.out.println("path1 = " + path1);
//2 获取WEB-INF目录下的2.txt的绝对路径
String path2 = context.getRealPath("WEB-INF/2.txt");
System.out.println("path2 = " + path2);
//3 获取src目录下的3.txt的绝对路径
String path3 = context.getRealPath("WEB-INF/classes/3.txt");
System.out.println("path3 = " + path3);
//4 获取web02模块下面的文件4.txt,不会部署到运行环境Tomcat服务器
}
4、像 Map 一样存取数据 (ServletContext域对象)
setAttribute()
域对象的三个方法:
void setAttribute(String key,object value) 键和值存储在域对象中
Object getAttribute(String key) 获取域对象中,键对应的值
void removeAttribute(String key) 移除域对象中的键和值
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
//向域对象存储键和值
context.setAttribute("contextKey","contextValue");
//取出域对象的值
Object contextKey = context.getAttribute("contextKey");
System.out.println("contextKey = " + contextKey);
}
5、获取互联网邮件扩展类型
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
String mime = context.getMimeType("1.xlsx");//获取指定文件的mime类型,传递文件名就可以
System.out.println("mime = " + mime);
}