1

Servlet

一.生命周期

通常情况下,servlet第一次被访问的时候在内存中创建对象,在创建后立即调用init()方法进行初始化。

对于每一次请求都掉用service(req,resp)方法处理请求,此时会用Request对象封装请求信息,并用Response对象(最初是空的)代表响应消息,传入到service方法里供使用。当service方法处理完成后,返回服务器服务器根据Response中的信息组织称响应消息返回给浏览器。

响应结束后servlet并不销毁,一直驻留在内存中等待下一次请求。直到服务器关闭或web应用被移除出虚拟主机,servlet对象销毁并在销毁前调用destroy()方法做一些善后的事情。

二.ServletConfig: 代表当前Servlet在web.xml中的配置信息

1.String getServletName() -- 获取当前Servlet在web.xml中配置的名字
ServletConfig config = this.getServletConfig();
String name = config.getServletName();
2.String getInitParameter(String name) -- 获取当前Servlet指定名称的初始化参数的值
ServletConfig config = this.getServletConfig();
String value = config.getInitParameter("name");
3.Enumeration getInitParameterNames() -- 获取当前Servlet所有初始化参数的名字组成的枚举
ServletConfig config = this.getServletConfig();
Enumeration enumeration = config.getInitParameterNames();
while(enumeration.hasMoreElements()){
        String name = (String)enumeration.nextElement();
        String value = config.getInitParameter(name);
        System.out.println(name+value);
        }
三.ServletContext -- 代表当前web应用

1.做为域对象可以在整个web应用范围内共享数据

void setAttribute(String,Object);
Object getAttribute(String);
void removeAttribute(String);

域对象:在一个可以被看见的范围内共享数据用到对象。

作用范围:整个web应用范围内共享数据。

生命周期:当服务器启动web应用加载后创建出ServletContext对象后,域产生。当web应用被移除出容器或服务器关闭,随着web应用的销毁,域销毁。

ServletDemo1:
ServletContext context = this.getServletContext();
context.getAttribute("apple","red apple");

ServletDemo2:
ServletContext context = this.getServletContext();
String v = (String)context.getAttribute("apple");
System.out.println(v);

ServletDemo2打印结果:red apple
2.用来获取web应用的初始化参数

初始化参数 initparameter --- 在web.xml中为Servlet或ServletContext配置的初始化时带有的基本参数

web.xml:
<context-param>
    <param-name>username</param-name>
    <param-value>zhang</param-name>
</context-param>
<context-param>
    <param-name>password</param-name>
    <param-value>123</param-name>
</context-param>

ServletDemo3:
ServletContext context = this.getServleyContext();
Enumeration enumeration = context.getInitParameterNames();
while(enumeration.hasMoreElements()){
       String name = (String)enumeration.nextElement();
       String value = context.getInitParameter(name);
       System.out.println(name+value);
       }
       
ServletDemo3 打印结果:
usename:zhang
password:123
3.实现Servlet的转发

this.getServletContext.getRequestDispatcher("XXXX")

ServletDemo5:
response.getWriter().write("111111");

ServeltDemo6:
//ServletContext context = this.getServletContext();
RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/servlet/ServletDemo5");
dispatcher.forward(request,response);

ServletDemo6 在浏览器上打印的结果:111111
Tip:

println是将数据在软件上打印出来
response.getWriter.write()是将数据在浏览器上打印出来

4.加载资源文件

在Servlet中读取资源文件时,如果写相对路径和绝对路径,由于路径将会相对于程序启动的目录--在web环境下,就是tomcat启动的目录即tomcat/bin--所以找不到资源。如果写硬盘路径,可以找到资源,但是只要一换发布环境,这个硬盘路径很可能是错误的,同样不行。

为了解决这样的问题ServletContext提供了getRealPath方法。在这个方法中传入一个路径,这个方法的底层会在传入的路径前拼接当前web应用的硬盘路径,从而得到当前资源的硬盘路径。这种方式即使换了发布环境,方法的底层也能得到正确的web应用的路径从而永远都是正确的资源的路径 --this.getServletContext().getRealPath("config.properties")

如果在非Servlet环境下要读取资源文件时可以采用类加载器加载文件的方式读取资源 -- Service.class.getClassLoader().getResource("../../../config.properties").getPath()

config.properties:
usename = zhang
password = 123

Properties prop = new Properties();
prop.load(new FileReader(this.getServletContext().getRealPath("config.properties")));
System.out.println(prop.getProperty("usename"));
System.out.println(prop.getProperty("password"));

打印结果:
zhang
123

悠悠我心
7 声望1 粉丝