

day01-Tomcat框架分析 - 一刀一个小西瓜
source link: https://www.cnblogs.com/liyuelian/p/16893932.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

引入课程和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(底层会用反射实例化);如果调用的是静态资源,就直接返回
Recommend
-
9
Java注解 1.注解的理解 注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息 和注释一样,注解不影响程序逻辑,但注解可以被编译或者运...
-
5
线程基础01 1.程序 进程 线程 程序(program):是为完成的特定任务,用某种语言编写的一组指令的集合。简单来说,就是我们写的代码。
-
6
JavaOI流02 4.常用的类 4.1文件字节流输入流-FileInputStream InputStream抽象类是所有类字节输入流的超类 InputStream常用的...
-
8
JavaIO流03 4.常用的类02 4.4节点流和处理流
-
8
JavaIO流05 4.常用的类04 4.4节点流和处理流03 4.4.8打印流-PrintStream和PrintWriter 打印流只有输出流,没有输...
-
6
多用户即时通讯系统05 4.编码实现04(拓展) 拓展功能: 实现离线留言,如果某个用户不在线 ,当登陆后,可以接收离线的消息 实现离线发文件,如果某个功能没有在线,当登...
-
6
MySQL基础知识02 4.CRUD 数据库CRUD语句:增(create)、删(delete)、改(update)、查(Retrieve) Insert 语句 (添加数据) Update 语句(更新数据) Delete 语句(删除数据)...
-
8
Spring基本介绍 1.官方资料和下载 1.1Spring5下载 直接访问
-
5
SpringMVC介绍-01 1.离线文档 解压 spring-5.3.8-dist.zip文件。 位置:spring-framework-5.3.8/docs/reference/html/web.html#spring-web
-
7
Redis入门 1.初始Redis 1.1认识NoSQL SQL(关系型数据库) NoSQL(非关系型数据库) 数据结构 ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK