一、Tomcat响应一个请求过程
1、Tomcat容器构造一个HttpServletRequest,并将请求中携带的所有信息封装在HttpServlet 当中。
2、根据url查找对应的Servlet处理请求
- 方式一:根据url去查找注解@Webserlvet对应的Servlet
- 方式二:根据url去web.xml找到对应的url-pattern,然后找到对应的servlet-name;最后根据对应的servlet-name就可以找到对应的servlet-class。按照这个思路,底层应该使用的是一个HashMapper;
<servlet>
<servlet-name>headerServlet</servlet-name>
<servlet-class>httpservletrequest.HeaderServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>headerServlet</servlet-name>
<url-pattern>/header.do</url-pattern>
</servlet-mapping>
3、找到对应的Servlet以后,如果当前Servlet未被初始化,那么首先调用init()初始化该Servlet;然后调用service(HttpServletRequest req,HttpServletResponse)找到匹配的doXXX()方法,然后进行处理
4、在doXXX()方法中通过response获取输出流对象PrintWriter,然后将信息输出到浏览器上。
二、实例
package httpservletrequest;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
public class HeaderServlet extends HttpServlet {
private static int i = 0;
@Override
public void init(){
System.out.println("HeaderServlet 被初始化了");
}
@Override
public void service(HttpServletRequest req,HttpServletResponse resp) throws IOException {
i ++ ;
System.out.println("第" + i + "次调用了HeaderServlet 的Service()");
doGet(req,resp);
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
doPost(req,resp);
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse response)throws IOException{
System.out.println("调用了doPOST()");
PrintWriter write = response.getWriter();
write.println("<html>");
write.println("<head>");
write.println("<title>");
write.println("HeaderServlet");
write.println("</title");
write.println("</head>");
write.println("<body>");
Enumeration enumeration = req.getHeaderNames();
while(enumeration.hasMoreElements()){
String str = (String)enumeration.nextElement();
write.println(str+" : "+req.getHeader(str)+"<br/>");
}
write.print("</body>");
write.println("</html>");
}
}
web配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>headerServlet</servlet-name>
<servlet-class>httpservletrequest.HeaderServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>headerServlet</servlet-name>
<url-pattern>/header.do</url-pattern>
</servlet-mapping>
</web-app>
2.1、响应结果

2.2、控制台输出
调用HeaderServlet init()完成初始化
第1次调用了HeaderServlet 的Service()
调用了doPOST()
第2次调用了HeaderServlet 的Service()
调用了doPOST()
第3次调用了HeaderServlet 的Service()
调用了doPOST()
第4次调用了HeaderServlet 的Service()
调用了doPOST()
第5次调用了HeaderServlet 的Service()
调用了doPOST()
第6次调用了HeaderServlet 的Service()
调用了doPOST()
2.3结果分析
从结果我们可以看到只调用了一次init()方法,而每一次请求都会调用service()方法。
本文详细阐述了Tomcat处理请求的过程,包括构造HttpServletRequest、根据URL查找Servlet、Servlet的初始化和服务调用,以及如何通过response输出信息。通过实例分析,展示了在实际应用中,init()方法仅初始化一次,而service()方法在每次请求时都会被调用。
1586

被折叠的 条评论
为什么被折叠?



