创建Servler
- 继承HttpServler对象
- 重写doPost()或者doGet()方法
部署Servlet
- 编译Servlet到/WEB-INF/classes目录中
- 编辑部署描述文件web.xml
<servlet>
<servlet-name>servletTest</servlet-name>
<servlet-class>servlet.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletTest</servlet-name>
<url-pattern>/servletTest.html</url-pattern>
</servlet-mapping>
- 常见错误1:url-pattern中的配置路径没有以斜杠开头
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vzGzZG5c-1637739628007)(C:\Users\24386\AppData\Roaming\Typora\typora-user-images\image-20211121150616483.png)]
- 常见错误2:servlet-name配置的值不存在
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ZxmpsIJ-1637739628009)(C:\Users\24386\AppData\Roaming\Typora\typora-user-images\image-20211121150752863.png)]
- 常见错误3:servlet-class标签的全类名错误
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JFE5A3tH-1637739628010)(C:\Users\24386\AppData\Roaming\Typora\typora-user-images\image-20211121150919345.png)]
Servlet-url定位到Servlet程序访问流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTMQSa0h-1637739628011)(C:\Users\24386\AppData\Roaming\Typora\typora-user-images\image-20211121152122691.png)]
Servlet的生命周期
- 执行Servlet构造方法
- 执行init初始化方法
第一,二步 是第一次访问的时候创建Servlet程序会调用 - 执行service方法
每次调用都会访问 - 执行destroy销毁方法
停止的时候才会执行
get 和post请求的分发处理
public class HelloServlet implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ystem.out.println("3.service方法");
//类型转换(因为HttpServletRequest对象有getMethod()方法)
HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
//获得请求的方式
String method=httpServletRequest.getMethod();
if ("GET".equals(method))
System.out.println("执行get请求");
else
System.out.println("执行post请求");
System.out.println(method);
}
}
Servlet继承体系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHIDjcQ7-1637739628012)(C:\Users\24386\AppData\Roaming\Typora\typora-user-images\image-20211122072445831.png)]
通过继承HttpServlet实现Servlet程序
一般使用继承HttpServlet类的方式实现Servlet程序
- 缩写一个类去继承HttpServlet类
- 根据业务重写doGet或者doPost方法
- 到web.xml中的配置Servlet程序的访问地址
Httpservlet类实现
package servlet;
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 HelloSrevlet2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloSrevlet2 的doPost请求");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloSrevlet2 的doGet请求");
}
}
Srevlet API
Servlet接口
方法名称 | 功能描述 |
---|---|
void init(ServletConfig) | 由Servlet容器所调用,用于在处理客户请求前完成Servlet对象的初始化工作 |
void service(ServletRequest req,ServletResonse res) | 由Servlet容器所调用,用于处理客户端的请求 |
void destroy() | 由Srevlet容器所调用,用于释放Servlet对象所使用的资源 |
ServletConfig getServletConfig() | 返回传递给init()方法的ServletConfig对象,该对象包含此Servlet的初始化的启动参数 |
String getServletInfo() | 返回有关Servlet的信息,如作者,版本和版权。返回字符串是纯文本,而不是任何类的标记语言 |
GenericServlet 抽象类
方法名称 | 功能描述 |
---|---|
public void init(ServletConfig config) | 是对Servlet接口中的init(ServletConfig)a方法的实现,将ServletConfig实例保存已备用 |
public void init() | 用于在子类中重写,以实现用户指定的初始化工作 |
public String getInitParamete(String name) | 通过调用ServletConfig接口的getInitParameter(String name)方法获取设置的初始化参数值,是为简化从ServletConfig对象中获取初始化参数而定义的方法 |
public ServletConfig getServletContext() | 通过调用ServletConfig接口的getServletContext()方法返回,ServletContext对象的引用,是为简化从ServletConfig对象中获得ServletContext对象而定义的方法 |
ServletConfig类(servlet程序的配置信息类)
Servlet程序和ServletConfig对象都是由Tomcat负责创建的,我们只负责使用,Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象
作用:
- 可以获取Servlet程序的别名Servlet-name的值
- 获取初始化参数init-param
- 获取ServletContext对象
web.xml的配置
<servlet>
<!--servlet-name 标签给Servlet程序起别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet-class 是servlet程序的全类名-->
<servlet-class>servlet.HelloServlet</servlet-class>
<!--init-param初始化参数-->
<init-param>
<!--参数名-->
<param-name>username</param-name>
<!--参数值-->
<param-value>root</param-value>
</init-param>
<init-param>
<!--参数名-->
<param-name>url</param-name>
<!--参数值-->
<param-value>jdbc:mysql://localhost:3306/1</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!--servlet-name 标签的作用是告诉服务器,当前配置的地址给那个servlet程序使用 -->
<servlet-name>HelloServlet</servlet-name>
<!-- url-pattern 标签配置访问地址
/表示服务器解析的时候,表示地址为http://ip:port/工程路径 <br/>
/hello 表示地址为http://ip:port/工程路径/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Java类中
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2.init初始化方法");
//1. 可以获取Servlet程序的别名Servlet-name的值
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
// 2. 获取初始化参数init-param
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
System.out.println("初始化参数url的值是:"+servletConfig.getInitParameter("url"));
// 3. 获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
注意点:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ki9PWe4D-1637739628013)(C:\Users\24386\AppData\Roaming\Typora\typora-user-images\image-20211122080202003.png)]
ServletContextt类
- ServletContext是一个接口,他表示Servlet上下文对象
- 一个web工程,只有一个ServletContext对象实例
- ServletContext对象是一个域对象
域对象:是一种像Map一样存取数据的对象,叫域对象
ServletContextt类的四个作用域
- 获取web.xml中的配置上下文参数context-param
- 获取当前的工程路径,格式:/工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像Map一样存取数据