包括:
一.Servlet体系
二.ServletContext接口和ServletConfig接口
一.Servlet体系
如下图所示:
即可用如下代码获得初始化参数:
总共3个类:Servlet接口,GenericServlet抽象类,HttpServlet抽象类。
1.1 Servlet 接口
对于Servlet接口,有5个方法,如下:
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();
}
解释:
- init():初始化方法
- getServletConfig():可以得到一个ServletConfig对象,利用这个参数可以得到初始化参数
- service():servlet对于请求的一个响应
- getServletInfo():返回servlet的相关信息
- destroy():销毁Servlet。
1.2 GenericServlet 抽象类
它是一个抽象类。实现了Servlet接口方法的init()方法,但是最重要的service()方法并没有实现
。如下代码:
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
1.3 HttpServlet 抽象类
它是一个抽象类。实现了Servlet接口的service()方法。在service()方法中,根据一定的条件分发到doGet()或者doPost()方法中。
主要代码如下:
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
一般来说,我们自定义自己的servlet就继承HttpServlet,再重写doGet(),doPost()方法即可。
二.ServletContext接口和ServletConfig接口
2.1 ServletContext接口
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
ServletContext作用:
1. 用于Servlet之间通讯
由于
一个WEB应用中的所有Servlet共享同一个ServletContext对象
,因此
Servlet对象之间可以通过ServletContext
对象来实现通讯。如代码:
context.setAttribute("name", "haha"); ~~~~~~~~~~String name = context.getAttribute("name");
2. 用于获取WEB应用的初始化参数
比如在web.xml中,有如下初始化:
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/4g</param-value>
</context-param>
即可用如下代码获得初始化参数:
String url = context.getInitParameter("url");
3.用于Servlet转发
RequestDispatcher rd = context.getRequestDispatcher("/index.jsp");
rd.forward(request, response);
Ps:转发有3种方式:
- forward方法:request.getRequestDispatcher("/url").forward(request, response),地址栏不会改变,同样是在服务器端完成,但仅输出被转发的URL中的内
- sendRedirect方法:只是客户重新发起一个请求,第二个请求指向其参数url。一般称做重定向,客户端的地址栏将改变为url值,是由客户端发起的第二次请求。例如:response.sendRedirect(request.getContextPath()+"/login.html");
- iinclude方法:使原先的Servlet和转发到的Servlet都可以输出响应信息,即原先的Servlet还可以继续输出响应信息。也就是说可以保留原先的信息。
2.2 ServletConfig接口
ServletConfig
是一个接口。
在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。(配置在某个servlet标签或者整个web-app下)
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
参考:
1.ServletConfig与ServletContext对象详解:http://blog.sina.com.cn/s/blog_696024a90100o6hq.html
2. ServletContext总结:http://blog.csdn.net/qiqiongran_luck/article/details/6889037
3. Servlet的请求转发与重定向:http://panlianghui-126-com.iteye.com/blog/730262