首页 > 数据库 > 数据库开发技术 > Servlet的几个子接口

当 Servlet容器初始化 Servlet时, Servlet容器会给 Servlet的 init方法传入一个 ServletConfig对象。我们可以通过 @WebServlet注解或者部署描述符传给 Servlet的配置信息。使用 initParams下的 @WebInitParam属性可以传入一个初始化参数,每个初始化参数由一对键值对(key-value)所组成,然后我们可以在 service方法中通过 ServletConfig的 getInitParameter(Stringname)方法获取对应参数的值。此外,还可以通过 getInitParameterNames()方法获取所有参数名称的一个 Enumeration集合。下面来看个简单的例子,就是使用 getInitParameter(Stringname)方法获取相应参数的值。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
/**
* Servlet implementation class ServletConfigDemoServlet
*/
@WebServlet(name = "ServletConfigDemoServlet",
urlPatterns = {"/servletConfigDemo"},
initParams = {
@WebInitParam(name = "admin", value = "Administrator"),
@WebInitParam(name = "email", value = "admin@126.com")
}
)
public class ServletConfigDemoServlet implements Servlet {
private transient ServletConfig servletConfig;
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
}
/**
* @see Servlet#getServletConfig()
*/
public ServletConfig getServletConfig() {
return servletConfig;
}
/**
* @see Servlet#getServletInfo()
*/
public String getServletInfo() {
return "ServletConfig demo";
}
/**
* @see Servlet#service(ServletRequest request, ServletResponse response)
*/
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
String admin = servletConfig.getInitParameter("admin");
String email = servletConfig.getInitParameter("email");
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.print("<html><head></head><body>" +
"Admin: " + admin +
"<br>Email: " + email +
"</body></html>");
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
}
}
通过 http://localhost:8080/HttpHeaderResponse/servletConfigDemo可以访问这个项目,在浏览器中会输出以下内容:
Admin: Administrator Email: admin@126.com
在 @WebServlet注解中说明访问地址的弊端就是如果我们修改了访问地址就得重新编译这个 Servlet文件。而使用另一种方法则不必这么麻烦,那就是使用部署描述符来配置访问地址和 Servlet的名称,部署描述符是一个配置文件,在 WEB-INF目录下的 web.xml文件。通过这种方式,我们可以在该文件中修改任何有关 Servlet的值而不需要重新编译对应的 Servlet类。打铁趁热,下面就来看个例子。我们创建一个叫做 SimpleServlet的类,就是简单的输出一个字符串,内容如下:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class SimpleServlet
*/
public class SimpleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.println("<html><head></head>" +
"<body>Simple Servlet</body><html>");
}
}
然后在 web.xml中对它进行配置:
<servlet>
<servlet-name>SimpleServlet</servlet-name>
<servlet-class>com.servlet.SimpleServlet</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SimpleServlet</servlet-name>
<url-pattern>/simple</url-pattern>
</servlet-mapping>
在这个文件中我们配置了 Servlet类的类名、路径。启动加载属性以及访问路径信息。这样的话,我们同样可以在浏览器中访问这个 Servlet程序。 load-on-startup表示 Servlet在应用程序启动时加载,而不是第一次调用时加载,因为 init方法是在 Servlet第一次使用时加载,如果该方法需要更长的时间才能完成初始化工作的话,name使用 load-on-startup属性就可以降低 init方法的初始化时间,因为这个属性表示应用程序启动时加载。
概念
ServletContex表示Servlet应用程序。每个Web应用程序都只有一个上下文。将一个应用程序同时部署到多个容器的分布式环境中,每台Java虚拟机上的Web应用都会有一个ServletContext对象。通过ServletConfig的getServletContext()方法可以获得ServletContext对象。
作用
有了ServletContext,就可以共享从应用程序中的所有资料处访问到的信息,并且动态注册Web对象。
负责处理属性的方法
● Objetc getAttribute(String name):获取参数name对应的属性值
● Enumeration<String> getAttributeNames():获取所有的属性名称
● void setAttribute(String name, Object object):设置属性及属性值
● void removeAttribute(String name):删除参数name对应的属性值
概念
要使用Servlet接口来编写Servlet程序的话,必须实现Servlet接口的所有方法,尽管有些方法使我们不需要的;此外,还必须将ServletConfig对象保存到类级变量中。但是,有了GenericServlet抽象类之后,代码就会变得更简洁。这个类实现了Servlet和ServletConfig接口,并完成了如下任务: ● 将init方法中的ServletConfig赋给一个类级变量,以便可以通过getServletConfig方法获取; ● 为Servlet接口中的所有方法提供默认实现; ● 提供方法,包括ServletConfig中的方法。
下面我们来看个小例子,和1.1中的例子一样,我们只是获取初始化参数的值并输出到浏览器中,但是在这我们不必实现那些不需要的方法。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
/**
* Servlet implementation class GenericServletDemoServlet
*/
@WebServlet(name = "GenericServletDemoServlet",
urlPatterns = {"/GenericServlet"},
initParams = {
@WebInitParam(name = "admin", value = "Administrator"),
@WebInitParam(name = "email", value = "admin@126.com")
}
)
public class GenericServletDemoServlet extends GenericServlet {
private static final long serialVersionUID = 1L;
/**
* @see Servlet#service(ServletRequest request, ServletResponse response)
*/
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
String admin = servletConfig.getInitParameter("admin");
String email = servletConfig.getInitParameter("email");
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.print("<html><head></head><body>" +
"Admin: " + admin +
"<br>Email: " + email +
"</body></html>");
}
}
在这里,我们只重写了 service()方法,并没有其他多余的方法,这样,代码就更加简洁了。即使 GenericServlet是对 Servlet一个很好的改良,但是它也不常用,因为它并不像 HttpServlet那么高级。 HttpServlet才是在实际应用中被广泛使用的接口。关于这个接口的详细情况,我们稍作休息,接下来再做讨论。
原文作者:数据派探险家;如有侵权,请联系管理员删除。