最近在看《Java web技术内幕》的Servlet工作原理,有点深奥和难以理解,于是乎,想通过一个简单的Demo将书上的思路理一遍,对Servlet有个更透彻更深的了解。
Servlet类:HelloWorld.java
- package com.cqupt;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.io.PrintWriter;
- /**
- * 一个简单的Servlet
- * @author hetiantian
- */
- public class HelloWorld extends HttpServlet {@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException {
- response.setContentType("text/html");
- response.setCharacterEncoding("gb2312");
- PrintWriter out = response.getWriter();
- String name = request.getParameter("username");
- out.println("Your name: " + name);
- }
- }
Web.xml配置文件
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
- version="3.1">
- <servlet>
- <servlet-name>HelloWorld</servlet-name>
- <servlet-class>com.cqupt.HelloWorld</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>HelloWorld</servlet-name>
- <url-pattern>/HelloWorld</url-pattern>
- </servlet-mapping>
- </web-app>
前端页面,一个表单:index.jsp
- <%-- Created by IntelliJ IDEA. User: hetiantian Date: 2017/9/2 Time: 13:19
- To change this template use File | Settings | File Templates. --%>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>
- $Title$
- </title>
- </head>
- <body>
- <form action="/HelloWorld" method="post">
- Your Name:
- <input type="text" name="username" />
- <input type="submit" value="submit" />
- </form>
- </body>
- </html>
首先从启动Tomcat服务器讲起,当启动Tomcat的时候,首先需要创建一个Tomcat对象(调用getTomcatInstance()方法,看到Instance,总觉得它是通过反射创建的),在idea中自己+一个就可以创建一个了,创建好tomcat以后需要将webapp项目部署上去,在idea中还是通过一个+就可以部署好webapp项目了, 但是在底层代码是这样写的:
- tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath());
tomcat的addWebapp方法返回的是一个Context对象,并对该对象设置好了访问路径和应用实际的物理路径,还创建好了一个ContexConfig对象,该对象主要是为了解析web.xml
解析web.xml由该类的configureStart方法实现的,将各个配置项(Filter,Listener,Servlet)解析成WebXML对象中相对应的属性,WebXML对象最终会加到Context对象中。
如上面的Demo中存在Filter,会获得servlet的class,load-on-start,name...通过get和set方法将其包装在了Context的Wrapper对象了(为什么需要将Servlet包装成Wrapper是因为Wrapper是Tomcat容器中的一部分,而Servlet是Web应用的一个开发标准,我也不是特别理解,先记下在说,慢慢理解其中的深奥),Wrapper的initServlet的方法初始化Sevlet为我们工作,initServlet调用Servlet的init方法,我Demo里的Servlet类的init方法在其父类中。
个人总结:部署webApp是解析web.xml,并返回一个Context对象的一个过程
加载好webApp项目以后,tomcat.start()就启动了tomcat了.idea中点击运行就启动了Tomcat了
启动Tomcat以后,在表单中输入提交一个将去http://localhost:8080/HelloWorld地址,/HelloWorld这个请求将会交给org.apache.tomcat.util.http.Mapper类完成的,如果请求的url匹配上了servlet中配置的url-patter将会执行servlet-name的Servlet对应的方法,上面的Demo将会调用doPost()方法,因为表单的请求方式为Post,如果为Get请求将会调用doGet方法。
仅是自己一点点的理解,如有错误,请多多指教
来源: http://www.cnblogs.com/Hdaydayup/p/7469489.html