在Servlet技术中,HttpServlet可谓是一个核心类,在熟练运用的同时,我们还要透彻的分析其底层的工作原理,这样对于我们的实际中的开发,和日后的学习,都有非常大的帮助。HttpServlet是一个继承了GenericServlet的抽象类。主要是应用于Http协议的请求和响应。当容器接收到一个针对HttpServlet对象的请求时,调用该对象的方法顺序如下:
1.公共的service();
2.在公共的
service(ServletRequest req, ServletResponse res)方法中,首先将参数类型转换为HttpServletRequest和HttpServletResponse,然后再调用受保护的
service(HttpServletRequest req, HttpServletResponse resp)方法,并将转换后的参数传递进去。
*注意,我用红体标注的这两个方法,在HttpServlet中有两个service()方法,其中一个是最先调用的公共的
public void service(ServletRequest req,ServletResponse res)throws ServletException,IOException,然以,在参数转换完以后会调用
protected void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException。千万不要弄混!!
3.在执行受保护的service()方法时,HttpServletRequest对象会先调用getMethod()方法,来获得你提交请求的方式(例如,POST,GET),通过判断后会调用响应的doXXX()方法。在方法中的请求方式的判断其实就是对字符串的判断,下面我贴出部分源代码,你会发现,servlet的源代码中,不外乎就是java的基础代码,所以,Java基础非常重要。
公共的service():
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
HttpServletRequest request;
HttpServletResponse response;
try
{
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
}
catch(ClassCastException e)
{
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
static Class class$(String x0)
{
return Class.forName(x0);
ClassNotFoundException x1;
x1;
throw new NoClassDefFoundError(x1.getMessage());
}
}
受保护的service():
protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
String method = req.getMethod(); //获得请求的方式
if(method.equals("GET"))
{
long lastModified = getLastModified(req);
if(lastModified == -1L)
{
doGet(req, resp);
} else{
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if(ifModifiedSince < (lastModified / 1000L) * 1000L)
{
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else
{
resp.setStatus(304);
}
}
} else
//进行对请求方式的判断
if(method.equals("HEAD"))
{
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else
if(method.equals("POST"))
doPost(req, resp);
else
if(method.equals("PUT"))
doPut(req, resp);
else
if(method.equals("DELETE"))
doDelete(req, resp);
else
if(method.equals("OPTIONS"))
doOptions(req, resp);
else
if(method.equals("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(501, errMsg);
}
}
这就是HttpServlet在容器中运行时的基本步骤,随后我还会发其他的关于serlvet的文章,JSP和Servlet是J2EE的核心,熟练的掌握和运用这两项技术,我们才能子今后的学习与工作中更加的得心应手。
分享到:
相关推荐
总之,这个压缩包提供的源码分析对于学习Servlet、GenericServlet和HttpServlet的工作原理极其有价值,能够帮助你深入理解Java Web开发的核心机制,提高你的编程和调试能力。通过细致的阅读和实践,你将能够更加熟练...
在开发Java Web应用程序时,你可能会遇到一个常见的错误:“HttpServlet cannot be resolved to a type”。...同时,保持开发环境的整洁和更新,以及对错误信息的仔细分析,都是避免和解决这类问题的关键。
HTTP模块提供了基于Jetty的HTTPServlet,使得用户可以通过浏览器访问文件系统状态信息和日志。 Hadoop的源码分析涉及对整个系统的拆解和理解,是一个复杂且细致的工作。通过对Hadoop源码的分析,开发者可以深入理解...
6.3 HttpServlet41 第7章 Tomcat分析44 7.1 Tomcat的顶层结构及启动过程44 7.1.1 Tomcat的顶层结构44 7.1.2 Bootstrap的启动过程45 7.1.3 Catalina的启动过程47 7.1.4 Server的启动过程48 7.1.5 Service的...
通过对`HttpServlet`源码的分析,我们了解到`HttpServlet`不仅继承了`GenericServlet`的基本功能,还针对HTTP协议进行了扩展,支持多种HTTP请求方法,并提供了默认的处理方式。在实际开发过程中,开发者通常会继承`...
14. **`http`**:基于Jetty的HTTPServlet,允许用户通过浏览器查看文件系统状态和日志。 15. **`log`**:提供HTTP访问日志的记录功能。 #### 三、HDFS设计:NameNode与DataNode的角色 HDFS的核心组件包括NameNode...
#### 二、问题分析 出现无法导入Servlet类的情况,通常有以下几个原因: 1. **Tomcat版本问题**:如果使用的Tomcat版本较低或者缺少必要的JAR文件,可能会导致Servlet类无法被识别。 2. **项目配置错误**:项目中...
- **http**:基于Jetty的HTTPServlet,提供文件系统状态信息和日志的浏览器查看功能。 - **log**:提供HTTP访问日志记录功能。 #### 五、Hadoop序列化机制 Hadoop采用了自定义的序列化机制,而不是Java内置的序列...
public class HttpServletResquseDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置响应内容类型...
超市账单管理系统是一款基于HttpServlet技术开发的软件应用,它主要用于帮助超市进行日常运营中的账单管理,包括销售记录、库存统计、成本核算以及利润分析等多个方面。在这个系统中,Oracle数据库被选为数据存储的...
- `DispatcherServlet`继承自`FrameworkServlet`,而`FrameworkServlet`又继承自`HttpServlet`,因此它具有处理HTTP请求的能力。 - 在`FrameworkServlet`中有`service`方法,它是处理HTTP请求的核心入口。 2. **`...
解压后,我们可以查看源代码,进一步学习和分析其实现方式。 总之,这个项目是一个实践Servlet基本功能的好例子,通过它我们可以学习到Servlet的生命周期、HTTP请求处理,以及如何生成动态HTML内容。同时,它也让...
【Service.rar】是一个压缩包,其中包含了使用MyEclipse 10开发的Web服务器项目的源代码。这个项目可能是一个简单的示例,旨在帮助用户理解...通过实际操作和分析源代码,可以进一步提升对Web开发的理解和实践能力。
对 MailMain 做审计,可以发现 MailMain 继承自 HttpServlet 类,且会接收一个名为 type 的请求参数。当“type.equals(“pm”)”时,会调用 PMAdmin 的 show 方法。对 PMAdmin 的 show 方法进行审计,可以发现如下...
- **类创建**:在`src`目录下创建包`com.xtedu.javaweb.servlet`,并在其中创建类`HelloServlet`继承自`HttpServlet`。 - **方法实现**:实现`doGet`方法,设置响应类型为"text/html",并通过`PrintWriter`输出HTML...
Hadoop使用了Jetty框架提供的HTTPServlet来支持HTTP服务,使得用户可以通过浏览器观察文件系统状态和日志。 Hadoop的包功能分析还包括记录(record)的自动生成机制,它们根据DDL来创建相应的编解码函数。对于网络...
通常情况下,开发者会选择继承自GenericServlet或HttpServlet类来进行开发,Rose通过特定的版型(《Http_Servlet》或《Generic_Servlet》)来表示这两种类型的Servlet。 - **Web建模与UML扩展机制**:Web建模是UML...
为了进一步操作数据,Hadoop还支持通过DDL自动生成编解码函数,并提供了基于Jetty的HTTPServlet来通过浏览器监控文件系统状态和日志。 Hadoop源代码中自定义了Writable接口,它类似于Java序列化中的Serializable...
public class ConcurrentTest extends HttpServlet { PrintWriter output; public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String ...