Servlet的基础知识总结
Posted *King*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet的基础知识总结相关的知识,希望对你有一定的参考价值。
文章目录
1、Servlet技术的核心是Servlet,Servlet API有4个jar包
- javax.servlet:包含定义了Servlet与Servlet容器之间签约的类和接口
- javax.servlet.http:包含定义了HttpServlet与Servlet容器之间签约的类和接口
- javax.servlet.annotation:包含对Servlet、Filter和Listener进行标注的注解,即Servlet3.0的注解配置
- javax.servlet.descriptor:包含为Web应用的配置信息提供编程式访问的类型
2、Servlet的实现方式
(1)实现Servlet接口来开发Servlet程序
/**
* 实现Servlet接口来开发Servlet程序
* @author wanglu
* @since 1.0, 2021/9/5 8:25
*/
public class ServletDemo implements Servlet {
// 创建servlet实例时,初始化servlet参数
@Override
public void init(ServletConfig config) throws ServletException {
}
// 返回一个ServletConfig对象,该对像表示Servlet配置信息
@Override
public ServletConfig getServletConfig() {
return null;
}
// 根据请求方式,处理客户端请求,并发出响应结果
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
}
// 返回关于该Servlet的说明信息
@Override
public String getServletInfo() {
return null;
}
// Web应用销毁(停止运行)时,执行该方法,通常用于回收资源
@Override
public void destroy() {
}
}
(2)扩展GenericServlet实现Servlet程序
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
/**
* 扩展GenericServlet实现Servlet程序
* @author wanglu
* @since 1.0, 2021/9/5 8:25
*/
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
}
}
(3)扩展HttpServlet实现Servlet程序
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 扩展HttpServlet实现Servlet程序
* @author wanglu
* @since 1.0, 2021/9/5 8:26
*/
public class ServletDemo3 extends HttpServlet {
// 如果浏览器是以get方式提交,则覆写doGet()方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
// 如果浏览器是以post方式提交,则覆写doPost()方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
3、Servlet的生命周期
- 当浏览器第一次访问Servlet时,服务器会根据浏览器访问的路径,例如/demo,在Web.xml文件中找到该Servlet的全路径进行反射
- 调用init()为Servlet作初始化工作
- 调用doXxx()为浏览器响应
- 如果浏览器再次访问相同的Servlet,只实现从服务端维护的Servlet实例集合中取得对应的实现,为浏览器响应
- 同个Servlet实例,在服务端只有一个
- 服务器在决定销毁Servlet实例之前,调用destory()方法,每个Servlet实例只会调用一次,在重新部署情况下会发生destory
创建Servlet实例有两种机制
1、客户端发起请求,相应的Servlet实例才开始创建
2、Web应用一启动,就创建Servlet实例,这里方式需要配置一下:<Servlet>中配置<load-on-startup>1</load-on-startup>,值越小,实例化优先级越高,注解配置Servlet,指定参数loadOnStartup=1
4、手写Servlet程序步骤
1、继承HttpServlet
2、重写doGet()或者doPost()方法
public class DemoServlet extends HttpServlet {
public DemoServlet(){
System.out.println("加载构造方法:"+this.hashCode());
}
@Override
public void init() throws ServletException {
System.out.println("加载init方法:"+this.hashCode());
super.init();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("加载doGet方法:"+this.hashCode());
super.doGet(req, resp);
}
@Override
public void destroy() {
System.out.println("加载destroy方法:"+this.hashCode());
super.destroy();
}
}
3、在web.xml中注册Servlet
使用普通的方法对Servlet进行注册
<servlet>
<!-- servlet的名字 -->
<servlet-name>DemoServlet</servlet-name>
<!-- servlet类的名字(包括整包名) -->
<servlet-class>com.demo.servlet.DemoServlet</servlet-class>
<!--配置参数-->
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<!-- 创建servlet实例优先级,值越小,实例化优先级越高-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 与上面的Servlet的名字要一一对应-->
<servlet-name>DemoServlet</servlet-name>
<!-- 表示该servlet的访问路径 /表示项目的根目录-->
<url-pattern>/DemoServlet</url-pattern>
</servlet-mapping>
Servlet访问URL使用*通配符,但是只有两种固定格式:
<url-pattern>*.do</url-pattern>
<url-pattern>/*</url-pattern>
5、@WebServlet注解的使用
在servlet3.0以后,我们可以不用在web.xml里面配置servlet,只需要加上@WebServlet注解就可以修改该Servlet属性了,web.xml可以配置的servlet属性,在@WebServlet注解上也都可以配置
@WebServlet属性列表:
属性名 | 类型 | 描述 |
---|---|---|
name | String | 指定Servlet 的 name 属性,等价于 。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。 |
value | String[] | 该属性等价于 urlPatterns 属性。两个属性不能同时使用。 |
urlPatterns | String[] | 指定一组 Servlet 的 URL 匹配模式。等价于标签。 |
loadOnStartup | init | 指定 Servlet 的加载顺序,等价于 标签。 |
initParams | WebInitParam[] | 指定一组 Servlet 初始化参数,等价于标签。 |
asyncSupported | boolean | 声明 Servlet 是否支持异步操作模式,等价于 标签。 |
description | String | 该 Servlet 的描述信息,等价于 标签。 |
displayName | String | 该 Servlet 的显示名,通常配合工具使用,等价于 标签。 |
以上是关于Servlet的基础知识总结的主要内容,如果未能解决你的问题,请参考以下文章