Servlet解析
来源:互联网 发布:毕业生简历怎么写 知乎 编辑:程序博客网 时间:2024/05/16 16:23
Servlet继承图:
HttpServlet是用Http协议实现的Servlet基类,写Servlet时可以直接继承它;接下来首先看看ServletConfig接口。
public interface ServletConfig {
public String getServletName();
public ServletContext getServletContext();
public String getInitParameter(String name);
public Enumeration getInitParameterNames();
ServletConfig 中封装了我们在web.xml中定义的Servlet的一些配置信息;例如:
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>demo.servlet</param-value>
</init-param>
</servlet>
在ServletConfig中:
public String getServletName(); 获得Servlet的名字即:<servlet-name>demo</servlet-name>;
public ServletContext getServletContext(); 获得ServletContext代表这个应用本身;
public String getInitParameter(String name);获得init-param配置的参数;
public Enumeration getInitParameterNames();获取init-param中的名字集合,<param-name>contextConfigLocation</param-name>;
接下来看看Servlet的接口:
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方法会在容器启动时调用一次;这时这个init方法会接受一个来自容器的ServletConfig类型的参数,这是由容器实现ServletConfig接口的类;
而这个参数GenericServlet 中有很大的作用。
getServletConfig()方法返回ServletConfig ,也就是init中传入的ServletConfig类型的参数;
service用于集体处理一个请求;有容器的Wrapper管道调用;
getServletInfo获取Servlet的一些相关信息;
destroy销毁Servlet;
接下来看看Servlet的默认实现类GenericServlet:
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable {
private transient ServletConfig config;
public GenericServlet() { }
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo() {
return "";
}
public void destroy() {
}
// GenericServlet 实现了ServletConfig接口, 实际上是在底层调用了init方法传进来的ServletConfig;
public String getServletName() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getServletName(); //调用init传来的ServletConfig的getServletName();方法;
}
//调用init传来的ServletConfig的getServletContext();方法;
public ServletContext getServletContext() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getServletContext();
}
//调用init传来的ServletConfig的getInitParameterNames();方法;
public Enumeration getInitParameterNames() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getInitParameterNames();
}
//调用init传来的ServletConfig的getInitParameter(name);方法;
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);
}
}
接下来看看HttpServlet,它是用来处理请求的主要重写了service方法,它是用来将不同的请求路由到不同的处理方法,
所以其子类只需要实现doGet,doPost等就行了:
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
HttpServletRequestrequest;
HttpServletResponseresponse;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
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) {
doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
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 {
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解析
- Servlet解析
- web-servlet servlet源码解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet原理解析
- 对某里求点落入爱心曲线内概率在线编程题的思考
- 杭电 2022 海选女主角
- caffe学习笔记5-classification_demo.m学习
- python之multiprocessing.pool
- Codeforces Round #299 (Div. 2)【A,B,C】
- Servlet解析
- C++学习笔记
- 条件随机场入门(二) 条件随机场的模型表示
- 浏览器的工作原理
- css设置各种中文字体如雅黑、黑体、宋体、楷体等等
- jsp中用js获取url参数
- Android手势密码解锁设计
- 一种基于中值滤波的轨迹纠偏方法和几点思考
- Java 冒泡排序