Servlet 中 ServletConfig 和 ServletContext 的区别
ServletConfig和ServletContext都是在servlet初始化时创建的对象,用来给servlet提供一些初始参数或者配置信息。但是,不同之处在于 ServletConfig 共享的信息是针对特定 servlet 的,而 ServletContext 共享的信息对 Web 应用程序中的所有 servlet 都可用。
ServletConfig:
- ServletConfig 是一个对象,包含一些初始参数或配置信息,由 Servlet Container 创建并在初始化时传递给 servlet。
- ServletConfig 用于特定的 servlet,这意味着应将特定于 servlet 的信息存储在 web.xml 中并使用此对象检索它们。
- 例子:假设,一个人正在建立一个工作门户,并希望与招聘人员和求职者共享不同的电子邮件 ID(可能会随着时间的推移而改变)。需要编写两个 servlet,一个用于处理招聘人员的请求,另一个用于处理求职者。在哪里存储电子邮件 ID?将 email-id 作为不同 servlet 的名称-值对放在 web.xml 中,可以在 servlet 中使用
getServletConfig().getInitParameter("name")
进一步检索。
ServletContext:
- ServletContext 是 Servlet Container 创建的对象,用于将初始参数或配置信息共享给整个应用程序。
- 例子: 一个工作门户的名称是
geek-docs.com
。在不同 servlet 提供的网页顶部显示网站名称,需要将网站名称存储在每个 servlet 中,从而导致冗余。由于每个 Servlet 都可以访问 ServletContext 共享的信息,因此最好使用 ServletContext 并在需要时使用getServletContext.getInitParameter("name")
检索网站名称。
ServletConfig 和 ServletContext 示例的实现如下所示:
web.xml
<web-app>
<servlet>
<servlet-name>recruiter</servlet-name>
<servlet-class>Recruiter</servlet-class>
<init-param>
<param-name>Email</param-name>
<param-value>forRecruiter@xyz.com</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>recruiter</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>applicant</servlet-name>
<servlet-class>Applicant</servlet-class>
<init-param>
<param-name>Email</param-name>
<param-value>forApplicant@xyz.com</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>applicant</servlet-name>
<url-pattern>/servlet2</url-pattern>
</servlet-mapping>
<context-param>
<param-name>Website-name</param-name>
<param-value>NewWebsite.tg</param-value>
</context-param>
</web-app>
servelet示例代码
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Recruiter extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String email = getServletConfig() .getInitParameter("Email");
String website = getServletContext() .getInitParameter("Website-name");
PrintWriter out = response.getWriter();
out.println("<center><h1>" + website + "</h1></center><br><p>Contact us:" + email);
}
}
servelet应用示例代码
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class Applicant extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String email = getServletConfig() .getInitParameter("Email");
String website = getServletContext().getInitParameter("Website-name");
PrintWriter out = response.getWriter();
out.println("<center><h1>" + website
+ "</h1></center><br><p>Contact us:"\n + email);
}
}
下面是 ServletConfig 和 ServletContext 两者的对比区别表:
ServletConfig | ServletContext |
---|---|
ServletConfig 是特定于 Servlet | ServletContext 适用于整个应用程序 |
servletConfig 的参数在 <servlet> 内的 <init-param> 中以名称-值对的形式出现。 |
servletContext 的参数在 <servlet> 和 <web-app> 内部的 <context-param> 中作为名称-值对存在 |
ServletConfig 对象通过 getServletConfig() 方法获得。 |
ServletContext 对象是通过 getServletContext() 方法获得的。 |
每个 servlet 都有自己的 ServletConfig 对象。 | ServletContext 对象只是一个对象,由应用程序的不同 servlet 使用。 |
当只有一个 servlet 需要它共享的信息时,使用 ServletConfig。 | 当整个应用程序需要共享信息时使用 ServletContext |