1.ServletConfig接口
在Servlet运行期间,经常需要一些辅助信息,例如,文件使用的编码,使用Servlet程序的公司等,这些信息可以在web.xml文件中使用一个或多个<init-param>
元素进行配置。
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中。
1.1 ServletConfig接口的常用方法
String getServletName() :返回Servlet的名字,即web.xml中<servlet-name>
元素的值
ServletContext getServletContext():返回一个代表当前Web应用的ServletContext对象
Enumeration getInitParameterNames():返回一个Enumeration对象,其中包含了所有的初始化参数名
String getInitParameter(String name):根据初始化参数名返回对应的初始化参数值
1.2 案例:TestServlet02.java:获得Servlet配置下的<init-param>
的配置参数
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//获得ServletConfig对象
ServletConfig config=this.getServletConfig();
//获得参数名为sname的参数值
String sname=config.getInitParameter("sname");
out.println("sname:"+sname);
out.flush();
out.close();
}
web.xml中<init-param>:
<init-param>
<param-name>sname</param-name>
<param-value>zhangsan</param-value>
</init-param>
2.ServletContext接口
Servlet启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前Web应用,该对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。
2.1 任务:获取web应用程序的初始化参数
1.在web.xml中输入配置信息:
<context-param>
<param-name>address</param-name>
<param-value>liaocheng</param-value>
</context-param>
这个配置信息可以在servlet配置外。
2.在Servlet中读取该配置信息
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//得到ServletContext对象
ServletContext servletContext=this.getServletContext();
//取得参数为address的配置信息值
String address=(String)servletContext.getInitParameter("address");
out.println("address:"+address);
out.flush();
out.close();
3.实现多个Servlet对象共享数据
一个Web应用中的所有Servlet共享同一个ServletContext对象,因此ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。
案例:
1.创建TestServlet04,在该Servlet中设置属性值name为zhangsan
ServletContext servletContext=this.getServletContext();
//通过setAttribute()方法设置属性值
servletContext.setAttribute("name","zhangsan");
2.创建TestServlet05,在该Servlet中获取TestServlet04中设置的属性值name
PrintWriter out=response.getWriter();
ServletContext servletContext=this.getServletContext();
//通过getAttribute()方法获取属性值
String data=(String) servletContext.getAttribute("name");
out.println(data);
4.读取Web应用下的资源
在实际开发中,有时候可能会需要读取Web应用中的一些资源文件,比如配置文件、图片等。为此,在ServletContext接口中定义了一些读取Web资源的方法,这些方法是依靠Servlet容器来实现的。Servlet容器根据资源文件相对于Web应用的路径,返回关联资源文件的IO流、资源文件在文件系统的绝对路径等。
案例:使用ServletContext对象读取资源文件(直接获取输入流对象)
4.1直接获取输入流对象
(1)创建资源文件。在src目录下创建资源文件myfile.properties
文件内容如下:
Company=lctvu
Address=liaocheng
(2)编写读取myfile.properties的Servlet类
response.setContentType("text/html;charset=utf-8");
ServletContext servletContext=this.getServletContext();
PrintWriter out=response.getWriter();
//获取相对路径中的输入流对象
InputStream in=servletContext.getResourceAsStream("/WEB-INF/classes/myfile.properties");
Properties properties=new Properties();
properties.load(in);
out.println("Company="+properties.getProperty("Company")+"<br/>");
out.println("Address="+properties.getProperty("Address")+"<br />");
需要注意的是,src目录下创建的资源文件在tomcat服务器启动时会被复制到项目的WEB-INF/classes目录下
(3)访问Servlet
4.2 根据文件绝对路径获取输入流
上例中的获取输入流对象
InputStream in=servletContext.getResourceAsStream("/WEB-INF/classes/myfile.properties");
可以拆分为:
String path=servletContext.getRealPath("/WEB-INF/classes/myfile.properties");
FileInputStream in=new FileInputStream(path);
5.资源文件在不同路径下的读取方式
5.1 资源文件在包下面时:
InputStream in =this.getServletContext().getResourceAsStream("/WEB-INF/classes/cn/itcast/context/myfile.properties");
cn/itcast/context/myfile.properties:文件的全路径
5.2 资源文件在WEB-INF下
this.getServletContext().getResourceAsStream("/WEB-INF/myfile.properties")
5.3 资源文件在web工程中
this.getServletContext().getResourceAsStream("/myfile.properties");