zoukankan      html  css  js  c++  java
  • Servlet开发

    在上一节中,我们看到,一个完整的Web应用程序的开发流程如下:

    1. 编写Servlet;
    2. 打包为war文件;
    3. 复制到Tomcat的webapps目录下;
    4. 启动Tomcat。

    这个过程是不是很繁琐?如果我们想在IDE中断点调试,还需要打开Tomcat的远程调试端口并且连接上去。

    许多初学者经常卡在如何在IDE中启动Tomcat并加载webapp,更不要说断点调试了。

    我们需要一种简单可靠,能直接在IDE中启动并调试webapp的方法。

    因为Tomcat实际上也是一个Java程序,我们看看Tomcat的启动流程:

    1. 启动JVM并执行Tomcat的main()方法;
    2. 加载war并初始化Servlet;
    3. 正常服务。

    启动Tomcat无非就是设置好classpath并执行Tomcat某个jar包的main()方法,我们完全可以把Tomcat的jar包全部引入进来,然后自己编写一个main()方法,先启动Tomcat,然后让它加载我们的webapp就行。

    我们新建一个web-servlet-embedded工程,编写pom.xml如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.itranswarp.learnjava</groupId>
        <artifactId>web-servlet-embedded</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>war</packaging>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
            <java.version>11</java.version>
            <tomcat.version>9.0.26</tomcat.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>${tomcat.version}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
                <version>${tomcat.version}</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </project>
    

    其中,<packaging>类型仍然为war,引入依赖tomcat-embed-coretomcat-embed-jasper,引入的Tomcat版本<tomcat.version>9.0.26

    不必引入Servlet API,因为引入Tomcat依赖后自动引入了Servlet API。因此,我们可以正常编写Servlet如下:

    @WebServlet(urlPatterns = "/")
    public class HelloServlet extends HttpServlet {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html");
            String name = req.getParameter("name");
            if (name == null) {
                name = "world";
            }
            PrintWriter pw = resp.getWriter();
            pw.write("<h1>Hello, " + name + "!</h1>");
            pw.flush();
        }
    }
    

    然后,我们编写一个main()方法,启动Tomcat服务器:

    public class Main {
        public static void main(String[] args) throws Exception {
            // 启动Tomcat:
            Tomcat tomcat = new Tomcat();
            tomcat.setPort(Integer.getInteger("port", 8080));
            tomcat.getConnector();
            // 创建webapp:
            Context ctx = tomcat.addWebapp("", new File("src/main/webapp").getAbsolutePath());
            WebResourceRoot resources = new StandardRoot(ctx);
            resources.addPreResources(
                    new DirResourceSet(resources, "/WEB-INF/classes", new File("target/classes").getAbsolutePath(), "/"));
            ctx.setResources(resources);
            tomcat.start();
            tomcat.getServer().await();
        }
    }
    

    这样,我们直接运行main()方法,即可启动嵌入式Tomcat服务器,然后,通过预设的tomcat.addWebapp("", new File("src/main/webapp"),Tomcat会自动加载当前工程作为根webapp,可直接在浏览器访问http://localhost:8080/

    embedded-tomcat

    通过main()方法启动Tomcat服务器并加载我们自己的webapp有如下好处:

    1. 启动简单,无需下载Tomcat或安装任何IDE插件;
    2. 调试方便,可在IDE中使用断点调试;
    3. 使用Maven创建war包后,也可以正常部署到独立的Tomcat服务器中。

    对SpringBoot有所了解的童鞋可能知道,SpringBoot也支持在main()方法中一行代码直接启动Tomcat,并且还能方便地更换成Jetty等其他服务器。它的启动方式和我们介绍的是基本一样的,后续涉及到SpringBoot的部分我们还会详细讲解。

    练习

    下载练习:使用嵌入式Tomcat运行Servlet (推荐使用IDE练习插件快速下载)

    注意:引入的Tomcat的scope为provided,在Idea下运行时,需要设置Run/Debug Configurations,选择Application - Main,钩上Include dependencies with "Provided" scope,这样才能让Idea在运行时把Tomcat相关依赖包自动添加到classpath中。

    小结

    开发Servlet时,推荐使用main()方法启动嵌入式Tomcat服务器并加载当前工程的webapp,便于开发调试,且不影响打包部署,能极大地提升开发效率。

  • 相关阅读:
    c/c++ 标准库 map multimap元素访问
    c/c++ 标准库 map set 删除
    c/c++ 标准库 map set 插入
    c/c++ 标准库 map set 大锅炖
    c/c++ 标准库 pair 介绍
    c/c++ 标准库 set 自定义关键字类型与比较函数
    c/c++ 标准库 插入迭代器 详解
    python基础-内置函数 isinstance() 与 issubclass()
    移动端事件(其他触摸事件)hammer.js
    移动端事件(touchstart+touchmove+touchend)
  • 原文地址:https://www.cnblogs.com/wxdlut/p/14950506.html
Copyright © 2011-2022 走看看