Servlet工作原理分析
最近在看《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工作原理分析的更多相关文章
- SPI协议及工作原理分析
说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...
- HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象
1 HTTP协议特点 1)客户端->服务端(请求request)有三部份 a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...
- Servlet工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
- Security:蠕虫的行为特征描述和工作原理分析
________________________ 参考: 百度文库---蠕虫的行为特征描述和工作原理分析 http://wenku.baidu.com/link?url=ygP1SaVE4t4-5fi ...
- Azure WAF防火墙工作原理分析和配置向导
Azure WAF工作原理分析和配置向导 本文博客地址为:http://www.cnblogs.com/taosha/p/6716434.html ,转载请保留出处,多谢! 本地数据中心往云端迁移的的 ...
- Hadoop生态圈-Zookeeper的工作原理分析
Hadoop生态圈-Zookeeper的工作原理分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 无论是是Kafka集群,还是producer和consumer都依赖于Zoo ...
- Unit02: Servlet工作原理
Unit02: Servlet工作原理 点击注册按钮,返回注册信息 package web; import java.io.IOException; import java.io.PrintWrite ...
- 原理剖析-Netty之服务端启动工作原理分析(下)
一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分 ...
- JSP+JavaBean+Servlet工作原理实例…
JSP+JavaBean+Servlet工作原理实例讲解 首先,JavaBean和Servlet虽都是Java程序,但是是完全不同的两个概念.引用mz3226960提出的MVC的概念,即M-model ...
随机推荐
- jenkins外网slave配置
背景: 客户提供了测试服务器,但不能外网直连需要通过windows跳板进行进行连接. 方案设定将windows跳板机配置为远程slave节点. 技术支持: jenkins-slave windows ...
- (转)Linux命令grep
场景:grep命令在文件搜索中经常会使用到,所以熟练掌握该命令对于日常日志搜索相当有必要! Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.g ...
- (转)maven镜像路径配置
很多maven包无法自动下载怎么办?设置maven镜像setting.xml <mirror> <id>repo2</id> <mirrorOf>cen ...
- 【css】盒子模型 之 概述
摘要 一些基本的概念以及常见使用问题 概述 BFC 是css 中布局的核心 - 盒模型,根据块级元素及行级元素可分为块级容器, 行级容器,但容器内部都遵循 BFC BFC 空间布局 备注: IE 的盒 ...
- 【TRICK】解决锚点定位向下浮动Xpx问题
1. 问题描述 页面滚动后,菜单栏会固定在页头,当锚点定位时,菜单会遮盖部分定位后的内容,所以需要在锚点定位后自动向下漂移Xpx. 2. 解决办法 a. 利用空div 占位,如下: <a hre ...
- 移动端APP页面Webview模式跳转详解
首先,来看一下关于Android home键和back键区别 back键 Android的程序无需刻意的去退出,当你一按下手机的back键的时候,系统会默认调用程序栈中最上层Activity的Dest ...
- 【模板小程序】链表排序(qsort/insert_sort/merge_sort)
前言 本文章整理了链表排序的三种方法,分别是快速排序.插入排序.归并排序.为适应不同用途,先给出常用的int版本,再在此基础上抽象出类模板. 目录 一.针对整数的版本(常用) 文中链表定义 链表相关操 ...
- thinkphp实现无限级分类
普通的方法(采用for和foreach) //显示 foreach($data as $k=>$v){ //str_repeat()函数用于把字符串重复指定的次数 $data[$k]['titl ...
- 19. leetcode 100. Same Tree
Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...
- dotnet core部署方式两则:CLI、IIS
最近在使用dotnet core研究整个开发过程,使用下面两种方式部署: 一,使用 dotnet run 命令运行 在项目路径,shift+右键,选择 “在此处打开命令窗口”,在CMD窗口中运行“do ...