ServletConfig
ServletConfig对象和配置文件相关。可以获得配置文件的信息,一般用于配置初始化参数。
配置初始化参数时,需要在web.xml文件的servlet标签中的init-param标签中。而且如果配置在该servlet标签中那么就只能从该servlet标签中获得初始化参数。比如下面代码就只能从ServletDemo6的servlet中获取初始化参数。
<servlet>
<servlet-name>ServletDemo6</servlet-name>
<servlet-class>com.xml.servlet.ServletDemo6</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo6</servlet-name>
<url-pattern>/ServletDemo6</url-pattern>
</servlet-mapping>
而当Servlet配置了这些初始化参数以后,web容器在创建Servlet实例对象时,会自动将这些参数封装到ServletConfig对象中,并且在调用servlet的init方法时,将ServletConfig对象传递给Servlet。从而,我们就可以通过ServletConfg对象得到当前Servlet的初始化参数。
关于如何获得初始化参数( 里面已经包含了ServletConfig的三种方法的举例:getServletName()、getInitParameter()、getInitParameterNames() )
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
//获取ServletConfig对象,ServletConfig代表当前Servlet在配置中的信息
ServletConfig config = this.getServletConfig();
//获取配置文件中Servlet的名称
System.out.println("Servlet的名称"+config.getServletName());
//获取初始化参数
String username = config.getInitParameter("username");
String password = config.getInitParameter("password");
System.out.println(username+" "+password);
Enumeration<String> e = config.getInitParameterNames();
while(e.hasMoreElements()) {
String name = e.nextElement();
String value = config.getInitParameter(name);
System.out.println(name+" : "+value);
}
}
ServletContext()
这是一个有点重要的对象。
那么,什么是ServletDemo对象呢?
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。也就是说一个web工程只拥有一个Context对象,然而一个web工程下会拥有多个servlet程序啊。因此,所有的servlet程序共享一个Context对象。
(其实上面提到的ServletConfig对象也维护了ServletContext的引用。可以通过ServletConfig.getServletContext()来获得对象)
类似于全局的特性让他也有一些用法:
1.获取WEB应用全局初始化参数
在web.xml中配置context-param标签。常用于配置字符编码
<context-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</context-param>
servlet中拿到全局初始化参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//获取ServletContext对象
ServletContext context = getServletContext();
String encoding = context.getInitParameter("encoding");
System.out.println(encoding);
此处也可以通过枚举getInitParameterNames() 获得初始化参数,参考上面的ServletConfig
}
2.实现数据的共享
@Override
public void init() throws ServletException {
//获取ServletContext对象,存入数值
//只有第一次访问时init才会调用,因此count也只会初始化一次
getServletContext().setAttribute("count", 0);
}
/**
* 每一次访问都会执行这个方法
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取ServletContext对象
ServletContext context = getServletContext();
//取值
Integer total = (Integer) context.getAttribute("count");
//存值到域对象中
context.setAttribute("count", ++total);
//页面输出
response.setContentType("text/html;Charset=UTF-8");
response.getWriter().write("<h3>该网站一共被访问了"+total+"</h3>");
}
3.读取资源文件
需要指出的是read2()中的路径都是相对于tomcat中bin目录的路径,因为代码运行后就交给服务器进行编译处理,会在tomcat形成新的class文件,所以路径也在相对于tomcat的bin目录来选择。
public void read1() throws IOException{
//获取输入流,读取文件
InputStream in = new FileInputStream("C:\\Java\\workplace\\ServletDemo2\\src\\db.properties");
print(in);
}
public void read2() throws IOException {
//ServletContext读取文件
/* //不提倡该方法
String path = getServletContext().getRealPath("/WEB-INF/classes/db.properties");
System.out.println(path);
InputStream in = new FileInputStream(path);*/
InputStream in = getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
print(in);
}
/**
*
* @param in
* @throws IOException
*/
public void print(InputStream in) throws IOException {
Properties pro = new Properties();
//加载
pro.load(in);
//获取文件中的内容
String username = pro.getProperty("username");
String password = pro.getProperty("password");
String desc = pro.getProperty("desc");
System.out.println("用户名:"+username+"密码:"+password+"简介:"+desc);
}