JavaWEB三大组件加载顺序:listener -> filter -> servlet (当读取web.xml文件的加载顺序)
在JAVA中有一款实现web端的技术叫Servlet ,Servlet是Java后面扩展的功能,属于javax的包下。要实现web页面数据与Java后台数据交互,这就是Servlet技术。
其他web服务器先不谈,我不是很清楚,但是Tomcat还是能说一说的,Tomcat的启动,我们都知道是在bin目录下运行start.bat 或者 start.sh 这两玩意就是一个脚本,然后这个脚本里面又让运行catalina.sh这个脚本,参数是start。 因为tomcat是Java编写的,所以那两个脚本其实就是让java运行main方法。
tomcat源码地址:https://github.com/apache/tomcat.git
最终 Bootstrap 类中的main方法启动。
public static void main(String args[]) {
if (daemon == null) {
// Don't set daemon until init() has completed
Bootstrap bootstrap = new Bootstrap();
......
因为参数是start ,所以运行到下面
else if (command.equals("start")) {
daemon.setAwait(true);
daemon.load(args);
daemon.start();
if (null == daemon.getServer()) {
System.exit(1);
}
}
catalina 设置 await 属性为true 。await 方法,就是在一个指定的端 口上等待 HTTP 请求,处理它们并发送响应返回客户端。
运行 catalina 的 load 方法() 。该方法内部主要逻辑是解析server.xml文件,初始化容器(运行Servlet的init方法,读取web.xml文件) 。
运行 catalina 的 start 方法。也就是启动 tomcat 。
然后就是在tomcat启动的时候,会读取tomcat存放项目中的web.xml文件。
找到里面映射,利用反射找到对应的运行类。
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
这里就开始有了Servlet的生命周期(简单的说一下):
Servlet类中的方法:
tomcat启动的时候,初始化Servlet。
public void init(ServletConfig config) throws ServletException;
//public ServletConfig getServletConfig(); // 作用不大,先注释
业务执行的时候,运行service。
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
//public String getServletInfo(); // 作用不大,先注释
tomcat 关闭的时候。
public void destroy();
现在找到了,请求url对应的servlet类 , 在servlet 中
public class Demo extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) {
res.getWriter().println("hello http");
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse res) {
this.doGet(req, res);
}
}
根据前端的method: 请求不同的方法,多数为post ,或者get方法。
其实不管是get、post、delete、等其他几个方法,都是servlet 创建的时候的一种规范,他们都可以实现数据传输,所以都是一样的。只是为了让我们更加容易区分。
然后通过HttpServletRequest(浏览器基本数据) 和父类ServletRequest(访问数据) 将浏览器端传入的参数,全部封装进来。
最后通过 HttpServletResponse 将数据传输到Servlet , tomcat 再将数据给tomcat ,传输到 浏览器客户端。