最近在看《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方法。

仅是自己一点点的理解,如有错误,请多多指教

Servlet工作原理分析的更多相关文章

  1. SPI协议及工作原理分析

    说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...

  2. HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象

    1 HTTP协议特点   1)客户端->服务端(请求request)有三部份     a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...

  3. Servlet工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  4. Security:蠕虫的行为特征描述和工作原理分析

    ________________________ 参考: 百度文库---蠕虫的行为特征描述和工作原理分析 http://wenku.baidu.com/link?url=ygP1SaVE4t4-5fi ...

  5. Azure WAF防火墙工作原理分析和配置向导

    Azure WAF工作原理分析和配置向导 本文博客地址为:http://www.cnblogs.com/taosha/p/6716434.html ,转载请保留出处,多谢! 本地数据中心往云端迁移的的 ...

  6. Hadoop生态圈-Zookeeper的工作原理分析

    Hadoop生态圈-Zookeeper的工作原理分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   无论是是Kafka集群,还是producer和consumer都依赖于Zoo ...

  7. Unit02: Servlet工作原理

    Unit02: Servlet工作原理 点击注册按钮,返回注册信息 package web; import java.io.IOException; import java.io.PrintWrite ...

  8. 原理剖析-Netty之服务端启动工作原理分析(下)

    一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分 ...

  9. JSP+JavaBean+Servlet工作原理实例…

    JSP+JavaBean+Servlet工作原理实例讲解 首先,JavaBean和Servlet虽都是Java程序,但是是完全不同的两个概念.引用mz3226960提出的MVC的概念,即M-model ...

随机推荐

  1. spring boot 配置文件application

    场景:在项目部署的过程中,对于spring boot的配置文件一直不很了解,直到项目出现一个莫名其妙的问题——工程classes中的配置文件被覆盖,程序启动总是报错! 1  配置文件的优先级 appl ...

  2. HDU - 4995 - Revenge of kNN

    题目链接 : https://vjudge.net/problem/HDU-4995 题目大意  :   读入n个点的坐标与该点所拥有的值val,进行m次查询,对于每一次查询,读入该点的坐标,计算离该 ...

  3. 在Swift中实现 oc与swift的混编

    在Swift中想要引用OC头文件(import),可采用混编的方法,这里以sqlite为例,采用OC-Swift桥的方式实现添加头文件1引入sqlite数据库的库文件 打开工程配置文件,在build ...

  4. 手把手教小白如何用css+js实现页面中图片放大展示效果

    1.前言      很多童鞋会在项目中遇到一些上传图片,展示图片的操作,但是图片呢有大有小,为了页面的美观,有时候我们需要将图片展示成固定宽高度,但是呢,领导就会说,我想看大图片,怎么办?想看就看呀, ...

  5. 全站 HTTPS 没你想象的那么简单

    对自己无知这件事本身的无知真的挺可怕 认知偏差现象一直存在于我们每个人身上,谁也避免不掉,不过是有的人了解这件事儿,有的人不怎么知道而已,这就产生了「无知而不自知」的认知偏差.当然,这时候你自己忽悠自 ...

  6. python-桶排序

    桶排序 通排序非常浪费空间, 比如需要排序的范围在0~2000之间, 需要排序的数是[3,9,4,2000], 同样需要2001个空间 注意: 通排序不能排序小数 以下为从小到大代码实现 #!/usr ...

  7. HDU 1159 Common Subsequence:LCS(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 题意: 求最长公共子序列. 题解: (LCS模板题) 表示状态: dp[i][j] = max ...

  8. PyV8

    待完善 pyv8是个js解析引擎, PyV8 是 V8 引擎的 Python 语言封装,这是 Python 和 JavaScript 对象之间的桥,支持在 Python 脚本中调用 V8 引擎. # ...

  9. 社群系统ThinkSNS V4.5.29 APP更新发布,新增用户认证及系统消息

    社群系统ThinkSNS V4版本移动端APP将于7月29日更新发布,本次更新修复部分bug,最主要是增加了移动端APP的用户认证功能,以及添加了系统消息,为V4.5.29版本发布.这两个功能PC端的 ...

  10. Git基础命令的使用

    当前git版本: git version 2.9.2.windows.1 1.创建一个能与git服务器连接的本地git库 本地:  git init git status (-s) git add . ...