ServletConfig与ServletContext用法小解
ServletConfig与ServletContext用法小解
在上一篇文章中笔者详细讲解Servlet的原理,并结合源码做了分析,接下来我们讲讲在Servlet中ServletConfig与ServletContext用法。
1、ServletConfig用法
Servlet容器(如:Tomcat)每创建一个servlet后就会立刻给他们创建一个ServletConfig对象用来获取配置文件(web.xml)的参数。config内有静态块调用时加载参数,从而获得配置文件中的参数。
在一个项目(project)中只有唯一 一个对应的servletconfig对象(自动创建),它只能读取一个Servlet的配置文件中的参数。
1.1、ServletConfig Demo
package Test;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestForServletConfig extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//该方法来自他的父类:GenericServlet
ServletConfig cfg=getServletConfig();
String maxonline=cfg.getInitParameter("maxonline");
System.out.println("service method maxonline:"+maxonline);
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("调用有参的init");
//ServletConfig这个对象由Servlet容器创建,自动封装了<init-param>标签里面的数据
String maxonline=config.getInitParameter("maxonline");
System.out.println("init method maxonline:"+maxonline );
//调用了父类的init方法:保证了父类的完整性,相当于在父类的基础上加了前面的代码
super.init(config);
}
}
1.2、web.xml配置(以下的Demo也使用本配置,下面不做重复)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 1、TestForTimeServlet -->
<servlet>
<servlet-name>nowTime</servlet-name>
<servlet-class>Test.TestForTimeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>nowTime</servlet-name>
<url-pattern>/nowTime</url-pattern>
</servlet-mapping>
<!-- 2、TestForServletConfig -->
<servlet>
<servlet-name>getParameter</servlet-name>
<servlet-class>Test.TestForServletConfig</servlet-class>
<init-param>
<param-name>maxonline</param-name>
<param-value>3000</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>getParameter</servlet-name>
<url-pattern>/getParameter</url-pattern>
</servlet-mapping>
<!--3、设置 整个项目的参数 -->
<context-param>
<param-name>size</param-name>
<param-value>10</param-value>
</context-param>
<!-- 4、TestForServletContext -->
<servlet>
<servlet-name>getCount</servlet-name>
<servlet-class>Test.TestForServletContext</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getCount</servlet-name>
<url-pattern>/getCount</url-pattern>
</servlet-mapping>
</web-app>
1.3、结果解析
使用浏览器访问:http://localhost:8080/TimeServlet/getParameter 可以得到如下结果:
ServletConfig对象由Servlet容器在实例化Servlet对象的时候将以下标签的内容:
<init-param>
<param-name>maxonline</param-name>
<param-value>3000</param-value>
</init-param>
封装到了ServletConfig对象中,每一个Servlet对象唯一对应一个了ServletConfig对象。
2、ServletContext用法
Servlet容器启动时首先给每个项目创建唯一 一个context(公共的),内部有静态块首次调用时执行 加载了web.xml内的参数。在一个项目中唯一 一个context可以读取到多个Servlet的配置文件(一对多)。
context可以读写变量,config只可以读常量。因为context有如下两个方法:
public abstract void setAttribute(String s, Object obj);
public abstract Object getAttribute(String s);
而config只有getInitParameter一个:
public abstract String getInitParameter(String s);
2.1、ServletContext Demo
package Test;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestForServletContext extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext ctx=getServletContext();
String size=ctx.getInitParameter("size");
System.out.println("size:"+size);
Integer count= (Integer) ctx.getAttribute("count");
//每次调用service方法我们给count属性自动累加1
ctx.setAttribute("count", ++count);
System.out.println("流量:"+count);
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);//保持重写父类的完整性
ServletContext sc=getServletContext();
sc.setAttribute("count", 0);
}
}
2.2、结果解析
使用浏览器访问: http://localhost:8080/TimeServlet/getCount 能得到如下结果:
通过这两个方法可以在ServletContext对象设置一个变量和读取一个变量:
public abstract void setAttribute(String s, Object obj);
public abstract Object getAttribute(String s);
在Servlet容器启动的时候会将一下标签的内容封装到ServletContext对象中。
<context-param>
<param-name>size</param-name>
<param-value>10</param-value>
</context-param>
通过以下方法可以获得其中的参数:
public abstract String getInitParameter(String s);
推荐阅读
-
JavaWeb基础(6)—— ServletContext 与 ServletConfig
-
ServletConfig与servletContext
-
ServletConfig与ServletContext
-
ServletConfig与ServletContext
-
ServletContext与ServletConfig区别
-
ServletContext与ServletConfig
-
ServletConfig与ServletContext
-
WEB-ServletConfig与ServletContext
-
ServletConfig与ServletContext用法小解
-
理解ServletContext与ServletConfig