详解Servlet
2018-06-19 本文已影响0人
DerrickWang
- Server + Applet
- Servlet接口(拿到一套规范 我们第一时间 关注接口)
//javax.servlet.Servlet
public interface Servlet{
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
//service方法用于具体处理一个请求
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
以上 我们可以看到ServletConfig需要了解一哈
init方法被调用时会接收到一个ServletConfig类型的参数,是容器传进去的。顾名思义,就是Servlet的配置
比如web.xml中
<!-- spring config -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
</context-param>
<!-- spring character encoding -->
<filter>
<filter-name>Character Encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
这里面init-param标签配置的参数就保存在ServletConfig里面
Spring MVC的Servlet指定配置文件位置的contextConfigLocation也保存于此
- init方法
Tomcat里面init方法是在org.apache.catalina.core.StandardWrapper里面的initServlet方法中调用的,ServletConfig传入的是StandardWrapper(里面封装着Servlet)自身的门面类StandardWrapperFacade(https://www.jianshu.com/p/8cda90bdf90b)。其实这也很好理解,Servlet是通过xml文件配置的,在解析xml时就会把配置参数给设置进去,这样StandardWrapper本身就包含配置项了,当然,并不是所有StandardWrapper的内容都是和Config相关的,所以就用了其门面列。
ServletConfig接口定义
package javax.servlet;
import java.util.Enumeration;
public interface ServletConfig {
String getServletName();
ServletContext getServletContext();
String getInitParameter(String var1);
Enumeration getInitParameterNames();
}
其中getServletContext()返回的代表这个应用本身(ServletContext其实就是tomcat中context的门面类ApplicationContextFacade)既然ServletContext代表应用本身,那么ServletContext里面设置的参数就可以被当前应用的所有Servlet共享了。平时项目中参数可以保存在Session中,也可以保存在Application中,而后者很多时候就保存在了ServletContext中。
我们可以这么理解,ServletConfig是Servlet级的,而ServletContext是Context级的(也就是Application)。当然ServletContext的功能要强大很多,并不只是保存一下配置参数,不然干脆叫ServletContextConfig好咯。
- GenericServlet