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 ...
随机推荐
- shell 脚本编写 if else then
if ....; then .... elif ....; then .... else .... fi 大多数情况下,可以使用测试命令来对条件进行测试.比如可以比较字符串.判断文件是否存在及是否可读 ...
- 让初学者快速了解Git
Git工作原理 为了更好的学习Git,我们们必须了解Git管理我们文件的3种状态,分别是已提交(committed).已修改(modified)和已暂存(staged),由此引入 Git 项目的三个工 ...
- Jquery-全选和取消的一个坑
在做一个商城的购物车的时候遇到了一个坑, 购物车一般都有全选按钮, 再次点击就会全部消除, 在网上查到的答案全部都是使用attr来做的, 无一例外都不能用, 之后才知道要使用jquery的prop和r ...
- Android的ListView
ListView ListView 是一个控件,一个在垂直滚动的列表中显示条目的一个控件,这些条目的内容来自于一个ListAdapter. 一个简单的例子 布局文件里新增ListView <Li ...
- 防止DDoS攻击的方式
针对企业的DDoS攻击持续增长,根据Akamai的调查报告,2015年DDoS攻击增长了史无前例的180% !面对 DDoS 攻击性挑战,我们应该建立有效的防御体系来抵御攻击. 1.网站IP减少公 ...
- 解决UIViewController中添加子控制器viewWillAppear不调用问题
问题描述: 我在UICollectionViewController中添加子控制器数组, 并在cellForItem中把子控制器数组中对应的控制器对应的view添加到了UICollectionView ...
- NYOJ--水池数目
//NYOJ--水池数目 #include<iostream> #include<cstring> }; using namespace std; void dfs(int,i ...
- 【转】Hdu--4135 Co-prime
Problem Description Given a number N, you are asked to count the number of integers between A and B ...
- Cordova + idea 环境搭建
1.安装前期工作 1).安装Node.js http://nodejs.cn/download/ 里面内置了npm,可以用来安装 Cordova,把该路径添加到环境变量,这样就可以在 cmd 里面任何 ...
- ASP.NET Core - Razor 页面简介
简介 随着ASP.NET Core 2 即将来临,最热门的新事物是Razor页面.在之前的一篇文章中,我们简要介绍了ASP.NET Core Razor 页面. Razor页面是ASP.NET Cor ...