一、目录
- 什么是Servlet
- 怎么实现一个Servlet程序
- Servlet生命周期
- HttpServlet类实现Servlet程序
- ServletConfig类
- ServletContext类
二、什么是Servlet
- Servlet是JavaEE规则之一。规则就是接口。
- Servlet是JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。
- Servlet是运行在服务器上的一个java小程序。它可以接收客户端发送来的请求,并响应数据给客户端。
Servlet程序从2.5版本是现在市面使用最多的版本。
Servlet2.5是xml配置,Servlet3.0之后就是注解版本的Servlet使用。
三、怎么实现一个Servlet程序
- 编写一个类去实现Servlet接口。
- 实现service方法,处理请求,并响应数据。
- 到web.xml中去配置servlet程序的访问地址。
Servlet程序会自动调用service方法。
web.xml中关于servlet的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--servlet标签给Tomcat配置Servlet程序。 -->
<servlet>
<!--servlet name标签给Servlet程序起一个别名,一般就是类名。 -->
<servlet-name>FirstServlet</servlet-name>
<!--servlet-class是servlet程序的全类名,直接打出类名,idea会自动补全。 -->
<servlet-class>com.example.javaservlet.FirstServlet</servlet-class>
</servlet>
<!--servlet-mapping标签给servlet程序配置访问地址 -->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,当前配置的地址是给哪一个Servlet程序使用 -->
<servlet-name>FirstServlet</servlet-name>
<!--url-pattern标签配置访问地址 -->
<!--/ 斜杠在服务器解析的时候,表示地址为http://ip:port/idea中项目对应的tomcat的工程路径 -->
<!--/hello 表示地址为http://ip:port/工程路径/hello -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
四、Servlet的生命周期
- 执行Servlet构造器方法。
- 执行init初始化方法。
- 执行service方法。
- 执行destroy销毁方法。
1、2两个方法是在第一次访问的时候,创建Servlet程序会调用,也就是只调用一次,service方法每次访问都会调用,destroy方法在web工程停止的时候调用。
package com.example.javaservlet;
import javax.servlet.*;
import java.io.IOException;
public class FirstServlet implements Servlet {
public FirstServlet() {
System.out.println("1. This is construct");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2. This is init");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3. This is service");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4. This is destroy");
}
}
五、HttpServlet类实现Servlet程序
一般在实际项目中,都是使用HttpServlet类的方式去实现Servlet程序。
- 编写一个类去继承HttpServlet类。
- 根据业务需要,重写doGet和doPost方法。(doGet方法在Get请求的时候调用;doPost方法在Post请求的时候调用。)
- 在web.xml中配置Servlet程序的访问地址。
package com.example.javaservlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HttpServletTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("This is get request");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("This is post request");
}
}
<servlet>
<servlet-name>HttpServletTest</servlet-name>
<servlet-class>com.example.javaservlet.HttpServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HttpServletTest</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
六、ServletConfig类
ServletConfig类是Servlet程序的配置信息类。
Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用。
Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServeltConfig对象。
ServletConfig类的三大作用:
- 可以获取Servlet程序的别名servlet-name的值。
- 获取初始化参数init-param。
- 获取ServletContext对象。
在获取初始化参数init-param之前要在web.xml中配置init-param,这个init-param可以配置多组,具体配置如下:
<servlet>
<!--servlet name标签给Servlet程序起一个别名,一般就是类名。 -->
<servlet-name>FirstServlet</servlet-name>
<!--servlet-class是servlet程序的全类名,直接打出类名,idea会自动补全。 -->
<servlet-class>com.example.javaservlet.FirstServlet</servlet-class>
<!--init-param是初始化参数 -->
<init-param>
<!--param-name是参数名 -->
<param-name>username</param-name>
<!--param-value是参数值 -->
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<!--servlet-mapping标签给servlet程序配置访问地址 -->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,当前配置的地址是给哪一个Servlet程序使用 -->
<servlet-name>FirstServlet</servlet-name>
<!--url-pattern标签配置访问地址 -->
<!--/ 斜杠在服务器解析的时候,表示地址为http://ip:port/idea中项目对应的tomcat的工程路径 -->
<!--/hello 表示地址为http://ip:port/工程路径/hello -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
package com.example.javaservlet;
import javax.servlet.*;
import java.io.IOException;
public class FirstServlet implements Servlet {
public FirstServlet() {
System.out.println("1. This is construct");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2. This is init");
//获取servlet-name
System.out.println("servlet-name:" + servletConfig.getServletName());
//获取init-param
System.out.println("init-param:" + servletConfig.getInitParameter("username"));
System.out.println("init-param:" + servletConfig.getInitParameter("url"));
//获取ServletContext对象
System.out.println("ServletContext:" + servletConfig.getServletContext());
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3. This is service");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4. This is destroy");
}
}
1. This is construct
2. This is init
servlet-name:FirstServlet
init-param:root
init-param:jdbc:mysql://localhost:3306/test
ServletContext:org.apache.catalina.core.ApplicationContextFacade@45f24809
3. This is service
七、ServletContext类
- ServletContext类介绍
- ServletContext类是一个接口,它表示Servlet上下文对象。
- 一个web工程,只有一个ServletContext对象实例。
- ServletContext对象是一个域对象。
- ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁。
什么是域对象?
域对象,是可以像Map一样存取数据的对象,叫域对象。这里的域,指的是存取数据的操作范围。(也就是整个web工程)
存数据 | 取数据 | 删除数据 | |
---|---|---|---|
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
- ServletContext类的四个作用
- 获取web.xml中配置的上下文参数context-param。
- 获取当前的工程路径,格式:/工程路径。
- 获取工程部署后在服务器硬盘上的绝对路径。
- 像Map一样存取数据。
context-param是上下文参数,它属于整个web工程,可以配置多组。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--context-param是上下文参数,它属于整个web工程,可以配置多组 -->
<context-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
<servlet>
<servlet-name>ContextServlet</servlet-name>
<servlet-class>com.example.javaservlet.ContextServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContextServlet</servlet-name>
<url-pattern>/hhh</url-pattern>
</servlet-mapping>
</web-app>
package com.example.javaservlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class ContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = getServletConfig().getServletContext();
//获取web.xml中上下文参数context-param
String username = servletContext.getInitParameter("username");
String password = servletContext.getInitParameter("password");
System.out.println(username);
System.out.println(password);
//获取当前工程路径
System.out.println(servletContext.getContextPath());
//获取项目在硬盘上的绝对路径
System.out.println(servletContext.getRealPath("/"));
//存取数据
servletContext.setAttribute("key1", "helloa");
System.out.println(servletContext.getAttribute("key1"));
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
admin
root
/javaservlet
E:\code\java\code\exercise\javaservlet\target\javaservlet-1.0-SNAPSHOT\
helloa