Servlet接口
Servlet接口定义了所有Servlet的基本行为。
基本行为主要分为两类:
- 与Servlet生命周期有关的基本行为,由Web容器自动调用
- void init(ServletConfig config), 创建Servlet时调用。
- void service(ServletRequest req,ServletResponse res),有请求到来时调用。
- void destroy() ,销毁时调用。
- 获取Servlet信息的有关方法
- String getServletInfo(),返回Servlet的相关信息。
- ServletConfig getServletConfig(),返回一个表示Servlet配置信息的接口。
ServletConfig接口
ServletConfig接口表示Servlet的配置信息,其主要有两类方法:
- 获取Servlet配置信息的方法,配置信息写在@WebServlet(…)注解中或者web.xml中。
- String getServletName()
- String getInitParameter(String name)
- Enumeration getInitParameterNames()
- 提供一个返回ServletContext的方法
- ServletContext getServletContext()
ServletContext接口
ServletContext接口表示的是整个web应用,它有如下几个特点:
- 表示整个web应用,它随着web容器一起被创建一起被销毁。
- 所有的Servlet共享一个ServletContext,里面的属性也是共享的。
- ServletContext管理web应用下的所有资源。
该接口方法众多,不一一列举,可以去查看官方文档。
GenericServlet抽象类
该抽象类实现了Servlet接口和ServletConfig接口,但是它并未实现Sevlet中的service(ServletRequest req,ServletResponse res)方法,因此它是一个抽象类。
需要完成一些默认的工作,所以后面的子类Servlet如果想要完成一些初始化工作应该重载这个无参的init()方法。
HttpServlet
HttpServlet是GenericServlet的子类也是编写自己的Servlet时最需要关心的父类。
HttpServlet最主要的作用是完成了下面两件工作:
- 重载了一个service(HttpServletRequest request,HttpServletResponse response)方法,将继承的service(ServletRequest request,ServletResponse response)方法参数转型并调用新的方法。
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException("non-HTTP request or response");
}
this.service(request, response);
}
- 新增了一系列doXXX()方法,在service方法中跟去HttpServletRequest的getMethod()方法分别调用不同的doXXX()方法,因此在继承HttpServlet之后只需要覆写相应的doXXX()方法就可以了。
Web容器的作用
在编写Servlet时,通常只需要编写一个继承自HttpServlet的类。而上面提到的全部接口,它们的实现类都有web容器提供。
web容器自动实例化这些类,调用并销毁。这就是wen容器的主要作用。
范例:一个简单的Servlet
@WebServlet(name = "HelloServlet",urlPatterns = "/hello",
initParams = {@WebInitParam(name="inpa1",value="a"),
@WebInitParam(name="inpa2",value="b")
})
public class HelloServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//直接调用ServletConfig的方法获取初始化参数
Enumeration<String> initParameterNames = getInitParameterNames();
while(initParameterNames.hasMoreElements()){
System.out.println(initParameterNames.nextElement());
}
//获取ServletContext
getServletContext();
}
}
启动tomcat就可以在浏览器地址栏上输入http://127.0.0.1/{ContextPath}/hello访问到doGet方法了。
上面这个Servlet采用Servlet3.0的注解配置,如果不希望使用注解可以在WEN-INF目录下的web.xml中作如下配置:
<?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_3_1.xsd"
version="3.1">
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.patermenkey.helloweb.HelloServlet</servlet-class>
<init-param>
<param-name>inpa1</param-name>
<param-value>a</param-value>
</init-param>
<init-param>
<param-name>inpa2</param-name>
<param-value>b</param-value>
</init-param>
</servlet>
</web-app>
通常ide会自动创建这个web.xml的模板,如果没有你可以到tomcat的wenapps目录下找一个项目复制一份拷贝。