Servlet
课程目标
servlet的生命周期(掌握)
servletConfig对象使用(了解)
servletContext对象的使用(掌握)
一.原理
二.Servlet的生命周期
- 构造 servlet,然后使用
init
方法将其初始化。- 第一次发送请求的时候。 执行一次(servlet可以看做是单例模式)
- 处理来自客户端的对
service
方法的所有调用。- 客户端发送一次请求,调用service方法一次。可执行多次
- 从服务中取出 servlet,然后使用
destroy
方法销毁它,最后进行垃圾回收并终止它。- tomcat服务器关闭的时候,销毁
@WebServlet("/my")
public class MyServlet extends HttpServlet {private static final long serialVersionUID = 1L;// servlet类由容器tomcat进行统一管理//根据书写相应的方法进行调用执行//servlet 的生命周期是由三个方法进行控制//1.init() 初始化方法//2.destroy() 销毁方法//3.service() 服务方法 //1.servlet初始化方法//servlet对象由tomcat进行在第一次请求时创建(单例)//init方法用于初始化配置当前servlet对象且只会执行一次//在服务第一次被请求时tomcat会创建对应的servlet对象 并调用对应的init方法进行初始化 public void init(ServletConfig config) throws ServletException {System.out.println("myServlet的初始化方法执行");}//2.servlet服务方法//每次接受到请求都会执行的方法protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException,IOException {System.out.println("myServlet的service方法执行");}//3.servlet销毁方法//当服务器正常关闭时 在删除servlet对象之前执行的方法 //在servlet删除之前进行一些关闭操作 防止资源的占用//仅在服务器关闭前执行一次//注意:需要服务器正常关闭public void destroy() {System.out.println("myServlet的destroy方法执行");}
}
当浏览器请求服务器对应服务时,服务器会根据请求url查找是否创建了对应url的servlet;如果已经创建则直接调用对应的service方法进行服务的处理,如果没有创建,则会创建对应的servlet并调用对应servlet的init方法进行servlet的初始化工作,之后继续调用service方法进行服务的处理,当服务器正常关闭时,在销毁删除servlet对象之前,会调用对应servlet的destory方法,进行资源释放或关闭执行功能的执行
二.Servlet访问路径配置
-
完全路径匹配
- 以/开头,配置文件中url-pattern怎么写,浏览器就怎么访问(servlet)
-
目录匹配
- 以“/”开头,以*结尾(过滤器)
-
扩展名匹配
- 不以“/”开头,以扩展名结尾 (.do,.action struts2框架),前面加“斜杠/”会报错;
四.ServletConfig对象
概念
- 用于保存当前Servlet的配置信息,并可以通过对应的方法进行获取
作用
- 与servlet对象一同创建用于保存对应servlet的配置信息
获取配置信息
-
String getServletName()//获取Servlet的名称
-
String getInitParameter(String name)//获取初始化参数
-
<!-- 配置初始化参数 --><init-param><param-name>username</param-name><param-value>rose</param-value></init-param><init-param><param-name>password</param-name><param-value>123456</param-value></init-param>
-
-
EnumerationgetInitParameterNames() //获取所有初始化参数名
ConfigServlet.java
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;@WebServlet(value = "/config", loadOnStartup = 0, initParams = { @WebInitParam(name = "username", value = "zhangsan"),@WebInitParam(name = "password", value = "123456") })
// value配置请求url路径
// name配置当前servletname
// loadOnStartup配置当前servlet对象创建时间 负数第一次请求创建 0或正数启动服务器创建
public class ConfigServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void init(ServletConfig config) throws ServletException {//ServletConfig 是当前servlet的配置类//每个servlet对象在创建后都会创建对应的servletConfig对象用于保存当前servlet信息// 获取当前servletname 如果没有配置使用唯一全路径当做nameString servletName = config.getServletName();System.out.println("servletName:" + servletName);// 获取正在配置中书写的初始化参数 书写在servlet标签中// <!-- 配置初始化参数 -->// <init-param>// <param-name>username</param-name>// <param-value>rose</param-value>// </init-param>// <init-param>// <param-name>password</param-name>// <param-value>123456</param-value>// </init-param>String username = config.getInitParameter("username");String password = config.getInitParameter("password");System.out.println(username+"|"+password); //获取所有初始化参数的nameEnumeration<String> names = config.getInitParameterNames();while(names.hasMoreElements()){System.out.println(names.nextElement());}}
}
web.xml配置形式
<servlet><servlet-name>ConfigServlet</servlet-name><servlet-class>com.yunhe.config.ConfigServlet</servlet-class><init-param><param-name>username</param-name><param-value>zhangsan</param-value></init-param><init-param><param-name>password</param-name><param-value>123456</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>ConfigServlet</servlet-name><url-pattern>/config</url-pattern></servlet-mapping>
五.ServletContext对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vkaGTjd-1678971931355)(asseits/无标题.png)]
概念
- 在web服务器启动后,就为每一个web应用创建该对象,在web应用中包含很多web资源,所有的资源共享一个ServletContext对象,就可以通过ServletContext传递数据。
在服务器启动后,创建一个对应的对象,用于保存当前服务器相关的数据,一般用于servlet对象之间的数据传递,只要是在当前服务器中的servlet都可以获取这个对象以及这个对象中的数据
如何获取该对象
- 通过getServletConfig().getServletContext()获取
- 通过getServletContext()获取
//1通过servletConfig对象获取ServletConfig servletConfig = getServletConfig();ServletContext servletContext1 = servletConfig.getServletContext();//2直接通过HttpServlet提供的方法获取ServletContext servletContext2 = this.getServletContext();
作用
获取全局化参数
-
在web.xml配置全局化参数
<!-- 上下文参数配置不是应用于某个servlet而是所有sservlet都可以访问 --><!-- 所以在配置时 直接书写在根标签下即可 --><context-param><param-name></param-name><param-value></param-value></context-param>
-
在Servlet中获取
//直接通过HttpServlet提供的方法获取 ServletContext servletContext2 = this.getServletContext(); //与servletConfig对象获取初始化参数方法一致 String username = servletContext2.getInitParameter("username"); String password = servletContext2.getInitParameter("password");System.out.println(username+"|"+password);
作为域对象传递数据
- 代表的范围是整个应用,所有的servlet都可以通过对应方法进行赋值取值删除
- setAttribute(str, obj);
- getAttribute(str);
- removeAttribute(str);
C1Servlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
// 所有的servlet都可以访问servletContext对象 并且通过方法进行数据的添加与获取ServletContext servletContext = getServletContext();//赋值setAttribute("key","value")//key必须为字符串类 value可以为任意对象//执行后会将键值对存储在servletContext对象中servletContext.setAttribute("username", "lisi");}
C2Servlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ServletContext servletContext = getServletContext();//取值attribute("key")//传入要获取数据的key 返回对应的value对象Object attribute = servletContext.getAttribute("username");System.out.println(attribute);}
C3Servlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext = getServletContext();//销毁对应数据removeAttribute("key")//将对应key数据销毁servletContext.removeAttribute("username");}
读取资源文件
-
方法
-
InputStream getResourceAsStream(String path)
- 传入资源文件的虚拟路径,得到资源文件的流对象
-
public String getRealPath(String path)
- 传入资源文件的虚拟路径,得到文件的绝对路径
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 数据传输本质是io流// servletContext提供了获取文件虚拟路径的方法ServletContext servletContext = getServletContext();String realPath = servletContext.getRealPath("a.txt");System.out.println(realPath);// servletContext提供了快速读取文件的方法InputStream is = servletContext.getResourceAsStream("a.txt");byte b[] = new byte[1024];int len = 0;while ((len = is.read(b)) != -1) {System.out.println(new String(b, 0, len));}}
虚拟路径
Path(“a.txt”);
System.out.println(realPath);
// servletContext提供了快速读取文件的方法InputStream is = servletContext.getResourceAsStream("a.txt");byte b[] = new byte[1024];int len = 0;while ((len = is.read(b)) != -1) {System.out.println(new String(b, 0, len));}
}
**虚拟路径**在使用开发工具进行开发书写的代码位置与实际执行web项目使用的路径是不一样的,以eclipse为例,当执行web项目时,会自动根据当前的项目在临时文件夹下创建对应的目录,用于保存项目运行时使用的文件,这些文件的路径称之为虚拟路径,有开发工具以及服务器进行配置,虚拟目录会在项目关闭后自动清除对应的数据,如果想保存这些数据,可以手动配置虚拟路径与实际路径的映射