13

day01-Tomcat框架分析 - 一刀一个小西瓜

 2 years ago
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.
neoserver,ios ssh client

引入课程和Maven

1.Maven

maven中央仓库:Maven Repository: Search/Browse/Explore (mvnrepository.com)

maven仓库是国外的一个网站,由于网络问题,我们也常使用maven仓库的镜像

maven的原理和java程序操作数据库,然后数据库返回相关数据类似。

image-20221115171930402
image-20221115171704790

1.1创建maven-web项目

  1. 先创建一个Maven的Web项目

    选择file-new-project

    image-20221115172109262
  2. 在弹出的窗口中选择Maven,点击选择右边的create from archetype

    image-20221115172300940
  3. 在下面选择maven-archetype-webapp,然后点击next

    image-20221115172433603
  4. 输入相关数据,点击next

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

    image-20221115175347101
  6. 默认创建的项目结构如下:

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

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

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

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

    image-20221115181521555

    添加新镜像如下:

    <mirror> <id>alimaven</id> <name>aliyun</name> <url>https://maven.aliyun.com/nexus/content/groups/public</url> <mirrorOf>central</mirrorOf> </mirror>
  11. 返回idea的窗口中,选择刚才配置的xml文件和要存储下载的jar包的目录,点击override,点击ok

    这样就完成了maven的镜像配置

    image-20221115183053123
  12. 在项目的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>
  13. 点击右边的Maven,点击循环按钮,开始下载依赖

    image-20221115185040582
  14. 下载完毕后,可以在配置的下载目录中看到该依赖:

    下一次如果要使用依赖,就会先到下载目录下去找该依赖。

    image-20221115185334672

2.测试小案例

编写如下的测试案例

image-20221115190809188

创建java目录,存放源文件

image-20221115191037149

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

image-20221115191206217

在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的配置)

image-20221115194241633

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

image-20221115194627533

输入数据,点击提交:

image-20221115194717837
image-20221115194730259

2.Tomcat整体项目架构分析

我们创建web项目,都要依赖于Tomcat等web服务以及实现继承Servlet接口。

可以看出对Tomcat的底层机制和调用到Servlet的流程的理解是十分重要的。

现在我们来模拟Tomcat底层实现,并能调用我们自己设计的Servlet,完成相同的功能。

说明:Tomcat有三种运行模式(BIO,NIO,APR),因为核心讲解的是Tomcat如何接受客户端请求,解析请求,调用Servlet,并返回结果的流程机制,因此采用BIO线程模型来模拟。

Tomcat-bio-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B.png

整个流程如下:

  1. 浏览器在地址栏输入请求的URL,发送http请求
  2. http请求到达Tomcat后,底层的socket网络编程会接收这个请求,创建一个线程(每一个请求对应一个线程)
  3. 被创建的线程就会去解析这个URL是什么请求,如果是请求Servlet资源,就去调用Servlet(底层会用反射实例化);如果调用的是静态资源,就直接返回

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK