写作目的:自学了 servlet 相关知识后,对其有了更多的认识,将这些认识记录下来并分享一些心得。
servlet 是基于 java 技术的 web 组件,被 servlet 容器所管理,用来生成动态的 web 内容。
servlet 容器也称 servlet 引擎,常见的有 tomcat 等。容器主要提供如下的功能:
总得来说:
servlet 的作用在于,动太生成 web 内容。而 servlet 要发挥它的作用必须有 servlet 容器的支持。
在学完 servlet 后,我认为应该从三个方面去认识学习 servlet。这三个方面是:
下面就依次从这三个方面来记录一下 servlet 的相关知识。
servlet 的生命周期是在 javax.servlet.Servlet 这个接口中定义好的。
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
可以看到整个 servlet 的生命周期被定义为
问题:
1. servlet 的生命阶段是如何完成的?
答: servlet 的生命周期是由 servlet 容器所管理的,所以它的初始化阶段是容器调用它的 init 方法来完成的,服务阶段是调用它的 service 方法,而销毁阶段自然是调用它的 destroy 方法。
2. servlet 什么时候初始化?
答: servlet 的 class 文件被加载并实例化以后,处理客户端请求之前。
3. servlet 什么时候加载?
答: servlet 容器启动的过程中。
4. servlet 什么时候实例化?
答: 可以在容器启动之后立即实例化,也可以在 servlet 将要处理客户端请求之前。
5. servlet 什么时候被销毁?
答: 1. 容器需要释放一些内存空间时 2. 容器关闭时
servlet 有一些对象组件在 servlet 的各生命阶段提供一些职责服务,而从简化并方便开发者的使用。
ServletContext 又称上下文,它由容器所创建,并且是一个全局唯一的对象,可以被容器中所有的 servlet 所共享。
ServletContext 的主要作用有两个:
一些代码示例:
通过ServletContext来获取全局的、整个Web应用的初始化参数:
name
gavin
利用ServletContext对象读取资源文件(比如properties文件)
// 这种方法的默认读取路径就是Web应用的根目录
InputStream stream = this.getServletContext().getResourceAsStream("dbinfo.properties");
// 创建属性对象
Properties properties = new Properties();
properties.load(stream);
String name = properties.getProperty("name");
String password = properties.getProperty("password");
out.println("name="+name+";password="+password);
注意:如果这个文件放在了src目录下,这时就不能用ServletContext来读取了,必须要使用类加载器去读取。
// 类加载器的默认读取路径是src根目录
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("dbinfo.properties")
ServletConfig 对于这个对象,在 Servlet 接口中有这样一个相关方法:
ServletConfig getServletConfig();
而在 Servlet 的子类 GenericServlet 有这样的定义:
private transient ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
通过代码的分析,我们可以知道这个对象与 servlet 的关系是 1:1 的。
从配置文件的角度来说:web.xml 中的 的子标签 里的 key-value 式的参数就被保存在这个对象中。
另外:servlet 有一个 getInitParameter 方法, 这个方法的底层也是通过 ServletConfig 这个对象来实现的,代码如下:
public String getInitParameter(String name) {
//就是这里了(1)
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
//还有这(2)
return sc.getInitParameter(name);
}
}
请求,不用多说。更多的详情可以参考 w3c 的教程:
Servlet 客户端 HTTP 请求
响应,不用多说。更多的详情可以参考 w3c 的教程:
Servlet 服务器 HTTP 响应
Session 与 Cookie 从来都是一起“出生入死”。由于 http 是无状态协议,seesion 和 cookies 的出现就是为了弥补这一点的。不同的是:cookie 是客户端保存状态,session 是服务端保存状态。
更多主情参考:
理解HTTP session原理及应用
filter 是一段可以重复使的代码,它的作用是在拦截 request 和 response 并调整它们。在 web 容器启动之后,处理客户端请求之前,容器必须为过滤器列表中每个过滤器实例化一个对象并初始化,然后调用映射到的过滤器的 doFilter 方法。
监听器监听的是事件,servlet 提供的事件类型如下:
不是说项目中没有 web.xml 文件,而是这个文件中什么初始化配置都没有只有最外层的 标签。
新技术的正确的学习方法:
经过以上几步,才能算是大体撑握一个新技术,从对于那么特别细的技术点,则应该在真正用时再去查相关资料再运用。这既保证了对新东西的撑握,又不至于浪费过多的时间。