1.简介
servlet是JavaWeb三大组件之一(servlet、filter、listener),也是最重要的组件。
servlet是运行在web服务器上的java程序(是什么),可以对来自浏览器或者其他http客户端的请求进行处理。
2.实现
实现servlet有三种方式
- 实现javax.servlet.Servlet接口
- 继承javax.servlet.GenericServlet类
- 继承javax.servlet.http.HttpServlet类
3.生命周期
//实现servlet接口
public class AServlet implements Servlet {
/*
* 生命周期方法
* 在servlet对象被创建的之后立即执行,只执行一次。
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init......");
}
/*
* 获取servlet的配置信息。
*/
@Override
public ServletConfig getServletConfig() {
System.out.println("ServletConfig......");
return null;
}
/*
* 生命周期方法
* 每一次请求都会调用这个方法,可执行多次。
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service......");
}
/*
* 获取servlet的信息。
*/
@Override
public String getServletInfo() {
System.out.println("getServletInfo......");
return null;
}
/*
* 生命周期方法
* 在servlet对象销毁之前执行,只执行一次。
*/
@Override
public void destroy() {
System.out.println("destroy......");
}
}
//配置servlet,由浏览器访问
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
4.ServletConfig对象
- getServletName:获取Servlet的名称
- getServletContext:获取Servlet的上下文
- getInitParameter:获取初始化参数
<web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>AServlet</servlet-name> <servlet-class>AServlet</servlet-class> <init-param> <param-name>aa</param-name> <param-value>11</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> </web-app> public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init......"); System.out.println(servletConfig.getInitParameter("aa")); }
- getInitParameterNames:获取所有初始化参数的名称
5.GenericServlet
- 在类当中用成员来保存内容。
- 一个方法不能被覆盖但又需要重写的时候该怎么处理。
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable {
private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
private static ResourceBundle lStrings = ResourceBundle.getBundle(LSTRING_FILE);
private transient ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public ServletConfig getServletConfig() {
return config;
}
public ServletContext getServletContext() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getServletContext();
}
public void destroy() {
}
}
6.HttpServlet
tomcat调用生命周期方法service,在方法内完成ServletRequest和ServletResponse的强转。然后调用非生命周期方法service,在方法内获取请求方法,根据请求方法调用doGet或者doPost。因此,我们通常在实现Servlet时,只需要继承HttpServlet然后覆盖doGet或者doPost方法即可,如果没有覆盖doGet或者doPost则会报405的错误。
7.Servlet细节
- 单例且线程不安全,可以创建只读的成员
- Servlet在第一次被请求时被创建,但也可以在web.xml的servlet中配置load-on-startup使得其在web服务器启动时创建
8.web.xml
- DefaultServlet
- JspServlet
- session-timeout 默认为30分钟