一个http请求过来之后,tomcat的核心组件之一connector会接受这个请求,并从输入流InputStream中获取参数的信息,接受页面上的request,response对象,并封装成httprequest和httpresponse对象,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理这个请求的线程,处理这个请求的线程就是tomcat的另一核心组件 Container 要做的事了。
container接到这个请求后,会依次创建并链式调用engine--host--context--wrapper,其中wrapper是servlet在tomcat中封装形式,这样一次 Request 请求达到最终的 Wrapper 容器,我们现正知道了请求是如何达到正确的 Wrapper 容器,但是请求到达最终的 Servlet 还要完成一些步骤,必须要执行 Filter 链,以及要通知你在 web.xml 中定义的 listener,并根据http中的请求,从mapper(tomcat启动时会从配置文件中读取所有的servlet的配置信息)中找到对应的servlet,之后就加载实例化这个servlet并将其初始化,代码如下:
public synchronized Servlet loadServlet() throws ServletException {
………
Servlet servlet;
try {
………
ClassLoader classLoader = loader.getClassLoader();
………
Class classClass = null;
………
servlet = (Servlet) classClass.newInstance();
if ((servlet instanceof ContainerServlet) &&
(isContainerProvidedServlet(actualClass) ||
((Context)getParent()).getPrivileged() )) {
((ContainerServlet) servlet).setWrapper(this);
}
classLoadTime=(int) (System.currentTimeMillis() -t1);
try {
instanceSupport.fireInstanceEvent(InstanceEvent.BEFORE_INIT_EVENT,servlet);
if( System.getSecurityManager() != null) {
Class[] classType = new Class[]{ServletConfig.class};
Object[] args = new Object[]{((ServletConfig)facade)};
SecurityUtil.doAsPrivilege("init",servlet,classType,args);
} else {
servlet.init(facade);
}
if ((loadOnStartup >= 0) && (jspFile != null)) {
………
if( System.getSecurityManager() != null) {
Class[] classType = new Class[]{ServletRequest.class,
ServletResponse.class};
Object[] args = new Object[]{req, res};
SecurityUtil.doAsPrivilege("service",servlet,classType,args);
} else {
servlet.service(req, res);
}
}
instanceSupport.fireInstanceEvent(InstanceEvent.AFTER_INIT_EVENT,servlet);
………
return servlet;
}
从上面的代码可以看出实例化一个servlet之后会调用servlet的service方法,下面再看看在service方法中做了什么处理(假定我们自己写的servlet继承自httpServlet)
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方法中会根据你页面上写的mothod方法去调用相应的doGet(.,.),doPost(.,.)等方法,也就是我们自己在servlet中自己写的业务逻辑。
分享到:
相关推荐
【深入浅析TomCat Session管理分析】 Session在Java Web开发中扮演着至关重要的角色,它允许服务器跟踪用户的交互,存储用户的状态信息。Tomcat作为广泛使用的开源Servlet容器,其内部的Session管理机制对于理解Web...
【深入浅析Centos 7系统的Tomcat服务器】 Tomcat,这款由Sun的软件架构师詹姆斯·邓肯·戴维森发起的开源项目,如今已成为Apache软件基金会的一部分,是Java Web应用程序的重要载体。Tomcat服务器以其轻量级、高效...
总的来说,Java Web程序的客户端和服务器端交互原理涉及到网络通信协议的深刻理解和Java编程技术的运用,开发者需要理解HTTP协议的工作机制,以及如何在Java环境中通过Socket编程实现网络通信。通过这样的交互,Web...
Java Web应用通常被打包为WAR(Web ARchive)或EAR(Enterprise ARchive)文件,然后部署到应用服务器上,如Tomcat、Jetty、GlassFish或WebLogic。应用服务器负责管理和运行这些应用,处理HTTP请求,管理Servlet、...
本篇文档将对JFinal的技术架构进行浅析,帮助读者理解其核心设计理念和工作原理。 1. **总体架构** JFinal 的总体架构可以分为三个层面:空间架构、逻辑架构和代码架构。 - **空间架构**:从物理部署的角度看,...
Tomcat是最常见的开源Web服务器和应用服务器,它可以运行Servlet和JSP。Web容器负责管理Web应用的生命周期,加载和初始化Servlet,处理请求,以及管理会话等。 接下来是Java EE(Enterprise Edition)框架。它包含...
至于服务器端的部署,Tomcat是一个广泛使用的开源Java Web应用服务器,它支持Servlet和JSP。对于生产环境,Apache Tomcat或JBoss、WebLogic等更强大的应用服务器可能更适合。 在Web开发中,前端技术也非常重要。...
2. 内嵌Servlet容器:Spring Boot可以内嵌Tomcat,这样我们无需以war包的形式部署项目。 3. 提供starter简化Maven配置:使用Spring或者SpringMVC我们需要添加大量的依赖,而这些依赖很多都是固定的,这里Spring Boot...
深入浅析Spring-boot-starter常用依赖模块 Spring-boot-starter是一种基于Spring框架的依赖模块,它提供了许多实用的功能和配置,帮助开发者快速开发企业级应用程序。下面我们将详细介绍Spring-boot-starter常用...
当Java Web应用程序遇到错误或异常时,如果不进行自定义处理,通常会显示Tomcat或其他Web容器默认的错误页面,这通常是不满足实际需求的。 在Java Web中,我们可以通过配置`web.xml`文件来自定义错误处理页面。例如...
7. **技术栈**:除了Hibernate和JSP,项目可能还涉及其他技术,如Spring框架(提供依赖注入和AOP)、MySQL数据库、Tomcat应用服务器、JavaScript和jQuery用于前端交互,以及CSS和HTML构建用户界面。 通过这样的项目...
服务器方面选择了Apache Tomcat 7.0,这是一款免费开源的Servlet容器,能够运行Java Web应用。 #### 三、系统功能设计 - **首页展示**:展示最新热门微博信息,支持未登录状态下查看。 - **用户管理**:支持用户...
- **Tomcat版本**:Tomcat 6。 - **MySQL版本**:MySQL 5.0。 - **IDE**:使用MyEclipse 6。 - **基本工作流程**: - 用户通过浏览器提交表单。 - 表单数据提交给Struts2的前端控制器FilterDispatcher。 - ...