• day01-Tomcat框架分析


    引入课程和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>alimavenid>
      <name>aliyunname>
      <url>https://maven.aliyun.com/nexus/content/groups/publicurl>
      <mirrorOf>centralmirrorOf>
      mirror>
    11. 返回idea的窗口中,选择刚才配置的xml文件和要存储下载的jar包的目录,点击override,点击ok

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

      image-20221115183053123
    12. 在项目的pom.xml文件中添加配置

      在dependency元素中添加配置如下:

      <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>javax.servlet-apiartifactId>
      <version>3.1.0version>
      <scope>providedscope>
      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>CalServletservlet-name>
    <servlet-class>com.li.servlet.CalServletservlet-class>
    servlet>
    <servlet-mapping>
    <servlet-name>CalServletservlet-name>
    <url-pattern>/calServleturl-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("

    " + num1 + "+" + num2 + "=" + result + "

    "
    );
    writer.flush();
    writer.close();
    }
    }

    cal.html:

    html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>计算器title>
    head>
    <body>
    <h1>计算器h1>
    <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线程模型来模拟。

    整个流程如下:

    1. 浏览器在地址栏输入请求的URL,发送http请求
    2. http请求到达Tomcat后,底层的socket网络编程会接收这个请求,创建一个线程(每一个请求对应一个线程)
    3. 被创建的线程就会去解析这个URL是什么请求,如果是请求Servlet资源,就去调用Servlet(底层会用反射实例化);如果调用的是静态资源,就直接返回
  • 相关阅读:
    室内定位之CSI指纹定位
    海藻酸钠-四嗪|TZ-PEG-alginate|海藻酸钠-peg-四嗪TZ
    OSPF实验:配置与检测全网互通
    Java通过JNI技术调用C++动态链接库的helloword测试
    在 imx6q 上适配 YT8531S
    WebDAV之葫芦儿·派盘+恒星播放器
    URLDNS利用链分析
    [vs+qt] vs2015+qt tool属性设置处无法添加模块
    管理员已经阻止软件运行bug的解决
    docker下载mongo
  • 原文地址:https://www.cnblogs.com/liyuelian/p/16893932.html