一、Servlet的概念
1.1 什么是Servlet?
Servlet是运行在服务端的Java小程序,是SUN公司提供一套定义动态资源规范。
1.2 Servlet的作用
用来接收、处理客户端请求、响应给浏览器的动态资源。在整个Web应用中,Servlet主要负责处理请求、协调调度功能。可以把Servlet称为Web应用中的控制器。
1.3 Servlet入门
目标
在页面上点击超链接,由Servlet处理请求,并返回一个响应字符串:Hello,T am Servlet。
实现步骤
1、 创建Web module
2、 创建html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<a href="http://localhost:8080/web05/demo01">访问ServletDemo01</a>
</body>
</html>
3、创建ServletDemo01类
public class ServletDemo01 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("ServletDemo01对象被创建");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("ServletDemo01接收到了客户端的请求...");
// 向客户端响应一个字符串
servletResponse.getWriter().write("Hello,T am Servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("ServletDemo01对象被销毁");
}
}
4、在web.xml中配置ServletDemo01
<!-- 配置ServletDemo01的映射路径-->
<servlet>
<!-- 给要配置的Servlet去一个别名,一般建议就是当前Servlet的名字首字母小写-->
<servlet-name>servletDemo01</servlet-name>
<!-- 要进行配置的Servlet的全限定名-->
<servlet-class>com.hxl.servlet.ServletDemo01</servlet-class>
<!-- 配置它提前到服务器启动的时候创建,数字只代表优先级-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 和上面的Servlet-name是一致的-->
<servlet-name>servletDemo01</servlet-name>
<!-- 就是要给ServletDemo01配置的映射路径-->
<!-- 一定要加/-->
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
二、Servlet的生命周期
Servlet的生命周期就是Servlet从创建到销毁的过程。
**创建:**默认情况下是在第一次有请求访问该Servlet实例的时候才会创建该Servlet对象。
**销毁:**在服务器关闭,或者当前项目从服务器中移除的时候会销毁当前项目中的所有Servlet对象。
2.1 Servlet的生命周期方法
在Servlet的生命周期中必然会经历的方法称之为Servlet的生命周期方法,总共包含三个方法:init、service、destory。
2.1.1 init方法
该方法会在Servlet实例对象被创建出来之后执行,可以在该方法中获取当前Servlet的初始化参数,以及进行一些读取配置文件之类的操作。
2.1.2 service方法
该方法会在Servlet实例对象每次接收到请求的时候均执行,可以在该方法中接收、处理请求,以及将客户端需要的数据响应给客户端。
2.1.3 destroy方法
该方法会在Servlet实例对象销毁之前执行,可以在该方法中做一些资源回收、释放、关闭等等操作。
2.2 配置Servlet提前创建
有时候需要在Servlet创建的时候做一些资源加载等等耗时操作,所以如果Servlet在第一次接收请求的时候才创建的话必然会影响用户的访问速度,所以此时需要让Servlet提前创建,将Servlet的创建提前到服务器启动的时候。
通过修改web.xml中Servlet的配置可以实现:
<!-- 配置ServletDemo01的映射路径-->
<servlet>
<!-- 给要配置的Servlet去一个别名,一般建议就是当前Servlet的名字首字母小写-->
<servlet-name>servletDemo01</servlet-name>
<!-- 要进行配置的Servlet的全限定名-->
<servlet-class>com.hxl.servlet.ServletDemo01</servlet-class>
<!-- 配置它提前到服务器启动的时候创建,数字只代表优先级-->
<load-on-startup>1</load-on-startup>
</servlet>
2.3 ServletConfig的介绍
2.3.1 接口方法介绍
方法名 | 作用 |
---|---|
getServletName() | 获取<servlet-name>HelloServlet</servlet-name> 定义的Servlet名称 |
getServletContext() | 获取ServletContext对象 |
getInitParameter() | 获取配置Servlet时设置的初始化参数,根据名字获取值 |
getInitParameterNames() | 获取所有初始化参数名组成的Enumeration对象 |
2.3.2 获取Servlet的初始化参数
可以在web.xml中对Servlet配置初始化参数,可以在Servlet的init方法中获取配置的初始化参数的值。
代码如下:
<!-- 配置ServletDemo01的映射路径-->
<servlet>
<!-- 给要配置的Servlet去一个别名,一般建议就是当前Servlet的名字首字母小写-->
<servlet-name>servletDemo01</servlet-name>
<!-- 要进行配置的Servlet的全限定名-->
<servlet-class>com.hxl.servlet.ServletDemo01</servlet-class>
<!-- 添加一个初始化参数-->
<init-param>
<param-name>username</param-name>
<param-value>huangxinglin</param-value>
</init-param>
<!-- 配置它提前到服务器启动的时候创建,数字只代表优先级-->
<load-on-startup>1</load-on-startup>
</servlet>
package com.hxl.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* 使用Servlet的时候可能会遇到一个问题:没有可以使用的Servlet接口
* 因为Servlet接口不是JDK中的,需要导入额外的jar包才能使用Servlet
*
* 编写Servlet的步骤:
* 1. 编写一个类实现Servlet接口,并重写service()方法接收和处理请求
* 2. 给Servlet配置映射路径:
* 2.1 方式一:使用xml配置(重点掌握)
* 2.2 方式二:使用注解配置(了解)
*
* 3. Servlet的生命周期
* 3.1 创建:Tomcat在第一次接收到访问该Servlet的请求的时候,会创建出该Servlet的对象
* 3.2 销毁:Tomcat服务器关闭的时候销毁它里面所有的Servlet
*
* 4. Servlet的生命周期方法:
* 4.1 init()方法:该方法会在Servlet对象被创建出来之后执行;通常在该方法中做一些初始化工作或者耗时工作
* 4.2 service()方法:该方法会在该Servlet每次接收到请求的时候执行;
* 4.3 destroy()方法:该方法会在该Servlet对象被销毁之前执行
*
* 5. 将Servlet的创建时机提前到服务器启动的时候,在web.xml中配置
*/
public class ServletDemo01 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// 使用ServletConfig对象读取初始化参数
String username = servletConfig.getInitParameter("username");
System.out.println("读取到的username是:"+username);
System.out.println("ServletDemo01对象被创建");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("ServletDemo01接收到了客户端的请求...");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("ServletDemo01对象被销毁");
}
}
2.4 Servlet的三种映射路径配置
Servlet的映射路径是提供一个让别人能够访问该Servlet的路径,里如Servlet的映射路径是"/test",那么在浏览器上访问该Servlet的路径就是http://localhost:8080/项目部署名/test
一个Servlet可以配置多个映射路径,但是多个Servlet不能配置相同的映射路径
2.4.1 映射路径的分类
1、完全路径匹配
访问当前Servlet的路径需要和配置的映射路径完全一致。
例如:Servlet的配置是/demo1
,访问该Servlet的时候的路径也必须是http://localhost:8080/项目部署名/demo1
才可以访问到。
2、目录匹配
以/开始需要以*结束。
例如:
配置/*
,访问的路径可以写成/任意字符串
。
配置/aa/*
,访问的路径可写成/aa/任意字符串
。
3、 扩展名匹配
以*
开头,以.扩展名
结束,能够匹配所有以.相同扩展名
结尾的请求路径。
例如:
*.action
:访问路径可以是任意字符串.action
。
三、ServletContext
服务器为其部署的每一个应用(项目)都创建了一个ServletContext对象。ServletContext属于整个项目,项目中的所有Servlet都可以共享同一个ServletContext对象。
3.1 、获取ServletContext的API
// 获取ServletContext对象
// 第一种获取ServletContext对象的方法
ServletContext servletContext = getServletContext();
// 第二种获取ServletContext对象的方法
ServletContext servletContext1 = getServletConfig().getServletContext();
3.2、 ServletContext获取全局的初始化参数
1、在web.xml中配置Web应用级别的初始化参数
<context-param>
<param-name>username</param-name>
<param-value>machao</param-value>
</context-param>
2、在Servlet的doGet方法中获取全局参数
// ServletContext的作用一:获取全局的初始化参数
// 获取全局的初始化参数
String username = getServletContext().getInitParameter("username");
System.out.println("在ServletDemo04中获取全局的初始化参数username=" + username);
3.3、ServletContext作为全局的域对象
域对象就是在一定的作用域范围内进行数据共享的对象,ServletContext作为全局域对象可以在整个项目的所有动态资源中进行数据共享。
示例如下:
ServletContext servletContext = getServletContext();
String str ="刘备";
// 将str存储到ServletContext中
servletContext.setAttribute("str",str);
// 获取域对象ServletContext中存放的数据
String str = (String) getServletContext().getAttribute("str");
System.out.println("在ServletDemo03中获取域对象中的str="+str);
3.4、 获取资源的真实路径
String realPath = servletContext.getRealPath("img/前端.jpeg");
System.out.println(realPath);
是要使用了ServletContext