Servlet主要功能在于交互式的浏览和修改数据,生成动态Web内容。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
创建一个空的maven项目,然后右键项目选择添加框架支持,选择JavaEE
pom.xml引入servlet-api
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
创建MyServlet.java extends HttpServlet,随便写点东西
修改web.xml
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.ttc.elian.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>
Servlet接口源码:
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
创建Servlet实例:
当容器(包括但不限于tomcat)接受请求后,先判断是否已经装载并实例化该Servlet,如果没有则执行init(ServletConfig),直到关闭容器、长时间没有调用。这时属于懒加载,同时也可通过load-on-startup设置加载时机:
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>com.ttc.elian.FirstServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
init()初始化
上面提到:当容器初始化Servlet时,会先执行init(ServletConfig)方法,GenericServlet类中设置属性:
private transient ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
只需要重写init()方法即可(该方法在Servlet实例化以后只会被调用一次,不用担心线程不安全)。
通过web.xml配置
<servlet>
<servlet-name>MyFirstServlet</servlet-name>
<servlet-class>com.ttc.elian.MyFirstServlet</servlet-class>
<init-param>
<param-name>param</param-name>
<param-value>Elian</param-value>
</init-param>
</servlet>
2. 读取参数:
// 通过GenericServlet继承的ServletConfig下的方法读取参数
// GenericServlet已实现,我们直接调用即可
public interface ServletConfig {
public String getServletName();
public ServletContext getServletContext();
public String getInitParameter(String name); // 返回配置文件中配置的param-value
public Enumeration getInitParamterNames();
}
service()
由servlet容器调用以允许servlet响应请求。
这个方法只有在servlet的init()方法成功完成后才会被调用。
应该始终为抛出或发送错误的servlet设置响应的状态代码。
servlet是单例的,通常运行在多线程servlet容器中,这些容器可以同时处理多个请求。开发人员必须注意同步访问任何共享资源,如文件、网络连接,以及servlet的类和实例变量。
destroy()
Servlet的生命周期非常的长,会一直到Tomcat关闭,或者长时间无连接才会进行销毁,所以开发中应尽量少的创建Servlet,在SpringMVC中,只有一个负责调度的DispatcherServlet。
原文:https://www.cnblogs.com/coderElian/p/15228511.html