Servlet主要类、接口的结构如下图所示:
要编写一个Servlet需要实现javax.servlet.Servlet接口,该接口定义了5个方法。如下:
1.init(),初始化servlet对象,完成一些初始化工作。
它是由servlet容器控制的,该方法只能被调用一次,初始化过程如下:
2.service(),接受客户端请求对象,执行业务操作,利用响应对象响应客户端请求。
3.destroy(),当容器监测到一个servlet从服务中被移除时,容器调用该方法,释放资源。
4.getServletConfig(),ServletConfig是容器向servlet传递参数的载体。
5.getServletInfo(),获取servlet相关信息。
(二)与servlet相关的接口
从servlet仅有的5个方法当中,我们知道其涉及3个接口,分别是:
ServletConfig
ServletRequest
ServletResponse
2.1. ServletConfig
主要方法:
重点关注getServletContext,之前说servletConfig是容器向servlet传递参数的载体,那么它也可以让Servlet获取其在容器中的上下文。
ServletContext是针对一个web应用,jdk中具体描述——
There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server's URL namespace such as /catalog
and possibly installed via a .war
file.)
2.2.ServletRequest
获取客户端发来的请求数据。(查看api)
note:注意getAttribute和getParameter的区别。
getAttribute( String name )可以得到由setAttribute()设置的参数值,相当于是使用getAttribute()得到一
个自己定义的参数,而不是从客户端得到的参数。
getParameter( String name )它用来获取客户端通过get或post方法等传递过来的值,是从客户端传递过来的,
一般指的是客户端提交的表单组件的值。
note:setCharacterEncoding在什么时候使用才有效?
它可以覆盖请求正文中所使用的字符编码,但是它必须在读取parameters之前设置,否则无效。
2.3.ServletResponse
响应客户端请求。(查看api)
(三)GenericServlet抽象类
为了简化serlvet的编写,在javax.servlet包中提供了一个抽象类GenericServlet,它给出了除service()方法以外的简单实现。
GenericServlet定义了一个通用的,不依赖具体协议的Servlet,它实现了Servlet接口和ServletConfig接口。
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable
(四)HttpServlet抽象类
HttpServlet主要是应用于HTTP协议的请求和响应,为了快速开发HTTP协议的serlvet,sun提供了一个继承自GenericServlet的抽象类HttpServlet,
用于创建适合Web站点的HTTP Servlet。
public abstract class HttpServlet extends GenericServlet implements java.io.Serializable
重点关注HttpServlet中的一个私有方法service。
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接口的service方法,是将ServletResponse对象和ServletRequest对象转化成httpServletResponse对象和HttpservletRequest对象,
然后再调用私有方法service。它根据request获取Http method(get、post等)的名称,根据http method调用不同的方法执行操作。
(五)HttpServletRequest、HttpServletResponse
由于HttpServletRequest和HttpServletResponse都是基于Http协议“升级改造”的,所以这两个对象较之ServletRequest和ServletResponse多出的方法主要和
Http协议相关。
例如:Cookie、request(response)headers、Session、URL等。
具体请查看api。
(六)重点
6.1.servlet的生命周期。
1)init(ServletConfig config)
初始化方法
其中参数:ServletConfig ---- Servlet对象的配置信息对象 该对象内部封装着该 servlet对象一些配置信息
ServletConfig 的作用:
1、获得该servlet的对象的初始化参数
2、获得Servlet的名称
<servlet-name>QuickStartServlet1</servlet-name>
3、获得Servletcontext对象
2)service(ServletRequest request,ServletResponse response)
service方法每次访问都会执行
其中参数:
ServletRequest :代表请求 该对象内部封装的是http请求的信息
ServletResponse :代表响应 该对象内部封装的是响应的信息
3)destroy()
6.2.servlet的上下文(ServletContext)
1.什么是ServletContext对象
直译:Servlet上下文
ServletContext代表一个web应用。
ServletContext对象的生命周期?
服务器启动创建ServletContext对象,服务器关闭销毁该对象
2.怎样获得ServletContext对象
1)ServletContext context = config.getServletContext();
2)ServletContext context = getServletContext();
3.ServletContext的作用
(1)获得web应用的全局的初始化参数
(2)获得web应用中任何资源的绝对路径
它的相对路径是tomcat,也就是整个部署到服务器上的,
this.getServletContext().getRealPath(“相对与web的路径”);
类加载器相对路径是classes,在开发中,经常用类加载器来加载classes路径下的内容
类名.class.getClassLoader().getResource(“相对于classes的路径”).getPath();
(3)ServletContext是一个域对象
域对象:存储数据的区域对象
域对象可以存取数据:(所有的域对象 都有如下三个方法)
域对象.setAttribute(name,value);
域对象.getAtrribute(name);
域对象.removeAttribute(name);