标签:继承 target 建立 整数 bundle ini servlet spring ica
来张关系图
ServletContext的对象是application是在项目初始化时被创建的。故servletContext随着应用初始化而被创建,随着应用的结束而被销毁。
在应用初始化的时候,Web容器在创建Servlet对象时会自动将web.xml中的servlet配置这些初始化参数封装到ServletConfig对象中,并在调用servlet
的init方法时,将ServletConfig对象传递给servlet。所以我们可以通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
初始化有两种情况:
一、随应用初始化时初始化,即在web.xml中设置<load-on-startup>参数</load-on-startup>,参数为整数值并且大于0,而且值越少,优先级越高。
在springmvc项目中经常会用到这个配置
二、在应用运行中时,servlet被客户端请求时初始化。
servlet销毁:
servlet自身调用destroy()方法、servlet容器停止运行、项目停止运行都会销毁该servlet实例。
ServletRequest的对象是request,其生命周期为request域,一个请求结束,则request对象结束。
ServletResponse的对象是response,一次响应结束,则response对象结束。
他们之间的关系就好像Servlet和ServletRequest、ServletResponse之间的关系一样,只不过做了少部分封装而已
request.getRequestDispatcher("*.jsp").forward(request, response) //转发
response.sendRedirect("*.jsp")//重定向
response.getOutputStream()//流
response.getWriter()//直接响应
看示意图:
public class TestServlet extends GenericServlet {
private static final long serialVersionUID = 1L;
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
}
}
--------------------------------------------------------
GenericServlet--抽象类,实现了Servlet接口
public abstract class GenericServlet
implements Servlet, ServletConfig, java.io.Serializable
{
private transient ServletConfig config;
.........
.........
}
好爽,request,response,config,都是现成的,service方法已经被重写,只需要根据需求调用 doGet() 或者doPost() 方法即可!!!
public class TestServlet2 extends HttpServlet {
public TestServlet2() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
}
public void doDelete(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPut(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void init() throws ServletException {
}
}
HttpServlet
这个类继承GenericServlet类,实现了Java.io.Serializable的接口,它是个抽象类,给其子类创建一个Http Servlet去适应一个网站。
而HttpServlet的子类必须重写至少一个方法,其中较为经常修改的方法有:
1、如果你希望servlet支持HTTP的Get请求,重写doGet方法
2、如果你希望servlet支持HTTP的Post请求,重写doPost方法
3、如果你希望servlet不但可以处理数据,还可以处理文件,重写doPut方法。Put的调用和Post相似,它允许客户端把真正的文件存放在服务器上,而不仅仅是传送数据
4、如果你希望servlet允许客户端删除服务器端的文件或者Web页面,重写doDelete方法,它与Put相似。
5、如果你希望控制servlet生命周期所产生的资源,可以重写init和destroy方法
6、如果你希望servlet提供关自身的相关信息,可以调用或重写javax.servlet.http.HttpServlet类继承javax.servlet.GenericServlet类的getServletInfo方法。
public abstract class HttpServlet extends GenericServlet
implements java.io.Serializable {
}
public class TestServlet implements Servlet {
private static final long serialVersionUID = 1L;
public void destroy() {
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
public void init(ServletConfig config) throws ServletException {
}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
}
}
是不是很不爽,需要重写这么多方法!!!
package javax.servlet;
import java.io.IOException;
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
package javax.servlet;
import java.io.IOException;
import java.util.Enumeration;
import java.util.ResourceBundle;
public abstract class GenericServlet
implements Servlet, ServletConfig, java.io.Serializable
{
private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
private static ResourceBundle lStrings =
ResourceBundle.getBundle(LSTRING_FILE);
private transient ServletConfig config;
public GenericServlet() { }
public void destroy() {
}
public String getInitParameter(String name) {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getInitParameter(name);
}
public Enumeration<String> getInitParameterNames() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getInitParameterNames();
}
public ServletConfig getServletConfig() {
return config;
}
public ServletContext getServletContext() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getServletContext();
}
public String getServletInfo() {
return "";
}
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
public void log(String msg) {
getServletContext().log(getServletName() + ": "+ msg);
}
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public String getServletName() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getServletName();
}
}
06.实现servlet的几种方式,以及接口或者类之间的关系
标签:继承 target 建立 整数 bundle ini servlet spring ica
原文地址:http://www.cnblogs.com/pangting/p/7050348.html