Servlet深入之初始化

SerlvetConfig
在Serlvet的配置文件中,可以使用一个或多个<init-param><param-name></param-name><param-value></param-value>
</init-param>标签为servlet配置一些初始化参数。
该类是init初始化的参数类,当servlet配置了初始化参数时,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用init方法时将该对象作为参数传递给servlet,可以通过该对象获得一些servlet的初始化参数信息。
常用方法
getInitParameter(name);通过name值获得value值
getInitParameterNames();获取参数name值的Enumeration的集合,再遍历集合通过上面的方法获取value值
在其他方法中获取ServletConfig对象的方法,在类中创建ServletConfig对象引用作为成员变量,在init方法中对引用赋值,然后再在其他方法中调用,这一点GeneralServlet类已经在实现了,而且提供了访问成员变量对象的方法getSerbletConfig(),所以自己就不用再写这一过程了。
每个Serlvet程序都对应着一个Config文件,是相互独立的。

Web应用对象SerlvetContext
每个Web应用程序都创建一个对用的ServletContext对象,代表当前web应用。
ServletConfig对象中维护了了ServletContext对象的引用,可以同过ServletConfig.getServletContext()方法或得该对象。由于一个web应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServlertContext对象来实现通讯,ServletContext对象通畅也被成为context域对象

常见应用
1.获得整个web应用初始化参数
ServletConfig对象配置的参数只对对应的servlet有效,而ServletContext是整个web工程中的所有Servlet对象有效,他的配置是通过在web.xml配置<context-param>标签完成的,而ServletConfig是在servlet的配置标签内的<init-param>标签配置的。
通过ServletConfig.getServletContext()方法或得该对象再通过getInitParameter(name)或得具体的参数。当然在GeneralServlet类中已经封装了获取该对象的方法,直接调用继承的getServletContext()方法即可。

2,实现全局数据共享
将共享数据封装在ServletContext对象中,通过setAttribute()方法。setAttribute(string name, string value):增加一个指定名称和值的新属性,或者把一个现有的属性设定为指定的值。这个方法在Javascript中也常用。再通过getAttribute(name)方法获取该数据,要注意该方法返回的是Object对象常需要进行类型转换。
实例统计网站被访问次数。

3,实现服务器的程序转发功能
转发:如果服务器端处理客户端请求时,如果需要多个服务器程序同时连续进行处理,需要采用转发操作。要注意与重定向的区别,转发是在服务器内部完成的,只有一次请求与响应,而重定向则是在服务器与客户端之间来回多次的请求与响应完成跳转的。
通过ServletContext对象的getRequestDispatcher("")方法获取转发调度器对象并在参数中指定目的servlet程序对象的目录,最后通过dispatcher调度器的forward(request,response)执行调度转发。

4,读取web工程资源文件
Servlet程序读取资源文件的方式与java程序io流读取资源文件是不同的,java程序读取文件是没有什么限制的,也可以使用相对路径,而Servlet程序是运行在web服务器中的,他只能读取web根目录之内的资源文件,且必须使用绝对磁盘路径。要区分开发环境与运行环境的区别。
string filename=getServletContext().getRealPath(filename);获取绝对磁盘路径,然后再通过io流读取。
另外对于web-inf/classes目录下的class文件,被类加载器加载,可以通过一类的动态加载反射获取.class字节码文件对象,Class c=HelloServlet.class; String filename=c.getResource("/文件名").getFile();查找带有给定名称的资源获取绝对路径然后再通过IO流读取。这种方式在Java程序中也是可以使用的。


缺省Servlet
即为默认Servlet,该程序的访问路径是/,在web.xml中配置了DefaultServlet。他的功能是处理其他Servlet都不处理的请求,web服务器中的所有静态资源其实都是通过缺省Servlet进行转发的。tomcat内置有该缺省Servlet。
将用户访问资源返回的过程

1,获取访问目标资源路径
String path=request.getRequestURI().substring(request.getContextPath().length());
2.判断文件是否存在并将资源写入响应流。
String filename=getServletContext().getRealPath(path);
File file=new File(filename);
if(file.exists()){
  InputStream in=new FileInputStream(file);
  OutputStream out=response.getOutputStream();
  int b;
  while((b=in.read())!=-1){
    out.write(b);
  }
  in.close();
  out.close();
}else{
  response.setStatus(404);
}
原文地址:https://www.cnblogs.com/ss561/p/4617439.html