day01-Tomcat框架分析
引入课程和Maven
1.Maven
maven中央仓库:Maven Repository: Search/Browse/Explore (mvnrepository.com)
maven仓库是国外的一个网站,由于网络问题,我们也常使用maven仓库的镜像
maven的原理和java程序操作数据库,然后数据库返回相关数据类似。


1.1创建maven-web项目
先创建一个Maven的Web项目
选择file-new-project

在弹出的窗口中选择Maven,点击选择右边的create from archetype

在下面选择maven-archetype-webapp,然后点击next

输入相关数据,点击next

指定项目使用的maven程序(第一次使用可以先不指定2和3,稍后再指定),点击finish

默认创建的项目结构如下:

点击项目左上角的file-setting,在弹出的窗口中点击build,execution,deployment,再选择maven

在右边的maven home path框中,选择默认的或者你自己下载的maven程序(我这里选择默认)

在资源管理器中打开该上面的目录,将conf下的setting.xml文件复制到c盘用户目录的m2.目录下


打开复制后的setting.xml文件,找到mirror标签,注释掉原来的mirror镜像

添加新镜像如下:
<mirror>
<id>alimaven</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
返回idea的窗口中,选择刚才配置的xml文件和要存储下载的jar包的目录,点击override,点击ok
这样就完成了maven的镜像配置

在项目的pom.xml文件中添加配置
在dependency元素中添加配置如下:
<!--引入Servlet.jar-->
<!--1.为了开发servlet,需要引入其jar包
2.dependency 表示引入一个包
3.groupId 表示包的开发公司/组织/个人 的信息 javax.servlet
4.artifactId 表示包的项目名称 javax.servlet-api
补充:groupId+artifactId是以目录形式体现
5.version 表示该包当前的版本
6.scope 表示引入的包的作用范围
7.provided 表示 这里你引入的jar包,在编译,测试有效,但是在打包发布的时候,不要带上这个jar包
(因为Tomcat本身有jar包)
8.下载的包在你指定的目录中
9.可以去修改我们要下载的目录位置
10.可以去指定maven仓库,即配置maven镜像
-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
点击右边的Maven,点击循环按钮,开始下载依赖

下载完毕后,可以在配置的下载目录中看到该依赖:
下一次如果要使用依赖,就会先到下载目录下去找该依赖。

2.测试小案例
编写如下的测试案例

创建java目录,存放源文件

创建Servlet(如果选项中没有Servlet,点击右边的maven,重新导一下包)

在web.xml文件中配置Servlet(使用注解也可以)
<servlet>
<servlet-name>CalServlet</servlet-name>
<servlet-class>com.li.servlet.CalServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CalServlet</servlet-name>
<url-pattern>/calServlet</url-pattern>
</servlet-mapping>
编写程序
WebUtils:
package com.li.utils;
public class WebUtils {
/**
* 将一个字符串数字转成int,如果转换失败,就返回传入的defaultVal
*
* @param strNum
* @param defaultVal
* @return
*/
public static int parseInt(String strNum, int defaultVal) {
try {
return Integer.parseInt(strNum);
} catch (NumberFormatException e) {
System.out.println(strNum + "输入的格式错误");
}
return defaultVal;
}
}
CalServlet:
package com.li.servlet;
import com.li.utils.WebUtils;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class CalServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收提交的数据进行计算
String strNum1 = request.getParameter("num1");
String strNum2 = request.getParameter("num2");
//把strNum1和strNum2转成int类型
int num1 = WebUtils.parseInt(strNum1, 0);
int num2 = WebUtils.parseInt(strNum2, 0);
int result = num1 + num2;
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("<h1>" + num1 + "+" + num2 + "=" + result + "</h1>");
writer.flush();
writer.close();
}
}
cal.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>计算器</title>
</head>
<body>
<h1>计算器</h1>
<!--这里的路径是浏览器要解析的,因此如果写成/calServlet的话,就会解析成http://主机名/calServlet
想要这样配置的话,tomcat的路径就不要写项目名了-->
<form action="/calServlet" method="post">
num1:<input type="text" name="num1"/><br/>
num2:<input type="text" name="num2"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
配置Tomcat(注意application context的配置)

点击运行tomcat,在浏览器地址栏中输入:http://localhost:8080/cal.html,显示页面如下:

输入数据,点击提交:

2.Tomcat整体项目架构分析
我们创建web项目,都要依赖于Tomcat等web服务以及实现继承Servlet接口。可以看出对Tomcat的底层机制和调用到Servlet的流程的理解是十分重要的。
现在我们来模拟Tomcat底层实现,并能调用我们自己设计的Servlet,完成相同的功能。
说明:Tomcat有三种运行模式(BIO,NIO,APR),因为核心讲解的是Tomcat如何接受客户端请求,解析请求,调用Servlet,并返回结果的流程机制,因此采用BIO线程模型来模拟。

整个流程如下:
- 浏览器在地址栏输入请求的URL,发送http请求
- http请求到达Tomcat后,底层的socket网络编程会接收这个请求,创建一个线程(每一个请求对应一个线程)
- 被创建的线程就会去解析这个URL是什么请求,如果是请求Servlet资源,就去调用Servlet(底层会用反射实例化);如果调用的是静态资源,就直接返回
day01-Tomcat框架分析的更多相关文章
- tomcat架构分析 (connector NIO 实现)
出处:http://gearever.iteye.com 上一篇简单记录了缺省配置的connector的内部构造及消息流,同时此connector也是基于BIO的实现.除了BIO外,也可以通过配置快速 ...
- Android/Linux下CGroup框架分析及其使用
1 cgroup介绍 CGroup是control group的简称,它为Linux kernel提供一种任务聚集和划分的机制,可以限制.记录.隔离进程组(process groups)所使用的资源( ...
- 几款开源的hybird移动app框架分析
几款开源的Hybrid移动app框架分析 Ionic Onsen UI 与 ionic 相比 jQuery Mobile Mobile Angular UI 结论 很多移动开发者喜欢使用原生代码开发, ...
- 启动Tomcat一闪而过——分析及解决过程
启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...
- tomcat架构分析 (Session管理)
Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...
- 深入浅出 - Android系统移植与平台开发(十一) - Sensor HAL框架分析之一
作者:唐老师,华清远见嵌入式学院讲师. 1. Sensor的概念 Sensor即传感器,在当前智能手机上大量存在:G-Sensor.LightsSensor. ProximitySensor.Temp ...
- 深入浅出 - Android系统移植与平台开发(八)- HAL Stub框架分析
作者:唐老师,华清远见嵌入式学院讲师. 1. HAL Stub框架分析 HAL stub的框架比较简单,三个结构体.两个常量.一个函数,简称321架构,它的定义在:@hardware/libhardw ...
- openwrt: Makefile 框架分析
openwrt: Makefile 框架分析 原文链接:blog.chinaunix.net/uid-26675482-id-4704952.html 本篇的主要目的是想通过分析Makefile,了解 ...
- Android 核心分析 之六 IPC框架分析 Binder,Service,Service manager
IPC框架分析 Binder,Service,Service manager 我首先从宏观的角度观察Binder,Service,Service Manager,并阐述各自的概念.从Linux的概念空 ...
- VS2010/MFC编程入门之四(MFC应用程序框架分析)
VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html 上一讲鸡啄米讲的是VS2010应用 ...
随机推荐
- .Net Core 配置文件读取 - IOptions、IOptionsMonitor、IOptionsSnapshot
原文链接:https://www.cnblogs.com/ysmc/p/16637781.html 众所周知,appsetting.json 配置文件是.Net 的重大革新之心,抛开了以前繁杂的xml ...
- git reset总结
git reset git 的重置操作 有三种模式:hard.mixed(默认).soft 1. hard 用法 hard会重置stage区和工作区,和移动代码库上HEAD 和branch的指针所指向 ...
- Python入门系列(十一)一篇搞定python操作MySQL数据库
开始 安装MySQL驱动 $ python -m pip install mysql-connector-python 测试MySQL连接器 import mysql.connector 测试MySQ ...
- Elasticsearch-shell脚本实现定时删除指定时间以前索引
〇.前言 因为elastiflow的数据量还是挺大的,接入了两台交换机的flow数据量已经开始有点大了.所以得写个脚本专门来清理索引 一.如何使用elastic的API 1.手动查询所有索引 在ELK ...
- 国内外各大物联网IoT平台鸟瞰和资源导航
一.国内外物联网平台 国内 百度物接入IoT Hub 阿里云物联网套件 智能硬件开放平台 京东微联 机智云IoT物联网云服务平台及智能硬件自助开发平台 庆科云FogCloud Ablecloud物联网 ...
- Windows服务器无法配置IP
前天在给一台服务器配置IP地址的时候发现一个奇怪的问题.IP地址配置之后不生效,还是使用的169.254这个微软保留自动分配地址.由于这个是一台虚拟机,尝试了删除添加网卡也没有用.配置IP不成功的时候 ...
- 胎压监测系统(DWS)
胎压监测系统(DWS)通过监测和比较行驶时各车轮和轮胎的滚动半径和旋转特性,以确定是否一个或多个轮胎明显充气不足,而非直接测量各轮胎的压力. 系统监测到异常时指示灯将点亮,且仪表上出现信息. 必须校准 ...
- 服务器设置X-Frame-Options Header响应头(Tomcat,服务器,项目)
解决方案(修改tomcat配置文件) 打开Tomcat配置文件(conf\web.xml)搜索 httpHeaderSecurity有两处地方 <!--第一处将注释放开--> <fi ...
- 30分钟掌握 Webpack
本文基于:峰华前端工程师--30分钟掌握Webpack 为什么使用 Webpack 在我们进行传统网页开发中,会在 index.html 中引入大量的 js 和 css 文件,不仅可能会导致命名冲突, ...
- P7476 苦涩 题解
Link 一道很好的复杂度均摊题目. 只需要考虑删除操作时的时间复杂度.保证复杂度的重点之一是精确定位到所有包含最大值的区间,即不去碰多余的区间.每次删除操作会删除若干个整个区间,以及至多两个区间被删 ...