【Java】Tomcat、Maven以及Servlet的基本使用

  • Tomcat
    • 什么是Tomcat
    • Tomcat的目录结构
    • 启动Tomcat
  • Maven
    • Maven依赖管理流程
    • 配置镜像源
  • Servlet
    • 主要工作
    • 实现Servlet
      • 添加依赖
      • 实现
      • 打包
      • 分析
    • 配置插件

Tomcat

什么是Tomcat

Tomcat 是一个 HTTP 服务器。前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式。HTTP 服务器可以通过 Java Socket 来实现,而 Tomcat 就是基于 Java 实现的一个开源免费, 也是被广泛使用的 HTTP 服务器。

Tomcat的目录结构

【Java】Tomcat、Maven以及Servlet的基本使用_第1张图片
其中最关注的目录就是 webapps 目录。web applications 的简称, 意思是用来存放 web 应用的文件夹。 "web 应用"就是一个具有独立完整功能的 “网站”, 我们就可以称为一个 “web 应用”。
例如搜狗搜索实现了独立完整的 “搜索引擎功能”, 淘宝网 实现了独立完整的 “电商功能” 。
一个 Tomcat 服务器上是可以同时部署多个这样的 web 应用的。这些 web 应用以目录的形式被放到 webapps 目录中。

启动Tomcat

在 bin 目录中, 双击 startup.bat 即可启动 Tomcat 服务器。然后在浏览器中输入 127.0.0.1:8080 即可看到 Tomcat 的默认欢迎页面。
【Java】Tomcat、Maven以及Servlet的基本使用_第2张图片

Maven

什么是Maven?
Maven 是一个项目构建工具,创建的项目只要遵循 Maven 规范 (称为Maven项目),即可使用Maven 来进行: 管理 jar 包、编译项目,打包项目等功能。
为什么学习 Servlet 之前要学 Maven?
因为 Servlet 是框架,要使用 Maven 进行iar 包管理和项目打包和发布。

Maven依赖管理流程

【Java】Tomcat、Maven以及Servlet的基本使用_第3张图片

配置镜像源

在配置Maven的settings文件时,主要是需要配置国内镜像源。
【Java】Tomcat、Maven以及Servlet的基本使用_第4张图片

Servlet

Servlet 是 Tomcat 这个 HTTP 服务器提供给 Java 的一组 API, 来完成构建动态页面这个任务。

主要工作

1.建立连接:客户端和程序的连接(当用户输入了请求URL之后,程序能够感知到用户的请求);
2.获取用户请求参数:处理request对象
3.将服务器处理结果返回给客户端:返回response对象

实现Servlet

添加依赖

新建空项目之后,在pom.xml中添加Servlet依赖。

        
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
            <version>3.1.0version>
            <scope>providedscope>
        dependency>

其中,groupId表示组织Id,artifactId表示项目Id,version表示版本号,scope表示作用域。
作用域的类型:
compile: 默认作用域,在编译、运行、测试时均有效
provided: 在编译、测试时有效,但是在运行时无效。意味着打包的时候可以不用包进去,别的设施(WebContainer)会提供。
runtime: 在运行、测试时有效,但是在编译代码时无效。
test: 只在测试时有效,包括测试代码的编译,执行。例如: JUnit.
system: 在编译、测试时有效,但是在运行时无效。
这里的作用域是provided,也就是在运行时无效,此时用的是Tomcat内置的一套Servlet Api
【Java】Tomcat、Maven以及Servlet的基本使用_第5张图片

实现

1.创建webapp目录。在 main 目录下, 和 java 目录并列, 创建一个 webapp 目录 (注意, 不是 webapps)
2.创建 web.xml。然后在 webapp 目录内部创建一个 WEB-INF 目录, 并创建一个 web.xml 文件。
【Java】Tomcat、Maven以及Servlet的基本使用_第6张图片
web.xml中的内容:

DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Archetype Created Web Applicationdisplay-name>
web-app>

注意:webapp 目录就是未来部署到 Tomcat 中的一个重要的目录。当前我们可以往 webapp 中放一些静态资源, 比如 html , css 等。在这个目录中还有一个重要的文件 web.xml。Tomcat 找到这个文件才能正确处理 webapp 中的动态资源。

代码实现:

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端对象
        String name = req.getParameter("name");
        //将结果返回给前端
        resp.getWriter().println("name=" + name);
    }
}

• 创建一个类 HelloServlet , 继承自 HttpServlet
• 在这个类上方加上@WebServlet(“/hello”) 注解, 表示 Tomcat 收到的请求中, 路径为 /hello的请求才会调用HelloServlet 这个类的代码。(这个路径未包含 Context Path)
• 重写 doGet 方法。doGet 的参数有两个,分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发。
• HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转 成了一个HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取。
• HttpServletResponse 表示 HTTP 响应。 代码中把响应对象构造好(构造响应的状态码,header, body 等)
• resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器。

打包

将程序打包放在Tomcat中运行。
使用 maven 进行打包。 打开 maven 窗口 (一般在 IDEA 右侧就可以看到 Maven 窗口) ,然后展开 Lifecycle , 双击 package 即可进行打包,得到一个.jar后缀的包。
【Java】Tomcat、Maven以及Servlet的基本使用_第7张图片
【Java】Tomcat、Maven以及Servlet的基本使用_第8张图片

但此时这样的 jar 包并不是我们需要的, Tomcat 需要识别的是另外一种 war 包格式,而且这个包的名字太复杂。此时需要在pom.xml文件中在新增一个 packing 标签, 表示打包的方式是打一个 war 包。还可以再新增一个 build 标签, 内置一个 finalName 标签, 表示打出的 war 包的名字是ServletHelloWorld。

    <packaging>warpackaging>
    <build>
        <finalName>ServletHelloWorldfinalName>
    build>

【Java】Tomcat、Maven以及Servlet的基本使用_第9张图片

war 包和 jar 包的区别:
jar 包是普通的 java 程序打包的结果。 里面会包含一些 .class 文件。 war 包是 java web 的程序, 里面除了会包含 .class 文件之外, 还会包含 HTML, CSS, JavaScript, 图片,以及其他的 jar 包。打成 war 包格式才能被 Tomcat 识别。

将打包好的Servlet项目放在前面提到的Tomcat的webapps的根目录下才能正常运行。
【Java】Tomcat、Maven以及Servlet的基本使用_第10张图片
此时双击Tomcat的bin目录下的statup.bat文件启动Tomcat,在浏览器中输入localhost:8080/ServletHelloWorld/hello,这样就简单实现了一个Servlet项目。注意,这里必须要输入完整的地址,ServletHelloWorld表示content-path,这里我以war包的名字命名,hello表示代码中的注解地址。

【Java】Tomcat、Maven以及Servlet的基本使用_第11张图片

在这里可以发现,整个代码不是通过 main 方法作为入口了。main 方法已经被包含在 Tomcat 里, 我们写的代码会被Tomcat 在合适的时机调用起来。此时写的代码并不是一个完整的程序, 而是 Tomcat 这个程序的一小部分逻辑。
那随便写个类都能被 Tomcat 调用嘛? 满足啥样条件才能被调用呢?
主要满足三个条件:
a) 创建的类需要继承自 HttpServlet
b) 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径
c) 这个类需要实现 doXXX 方法.
当这三个条件都满足之后, Tomcat 就可以找到这个类, 并且在合适的时机进行调用。

分析

通过开发者工具,可以看见通过浏览器访问的时候默认的是GET请求。
【Java】Tomcat、Maven以及Servlet的基本使用_第12张图片
此时不能发送POST请求。我们使用postman发送POST请求来模拟接口。
Postman的使用:
【Java】Tomcat、Maven以及Servlet的基本使用_第13张图片
当发送GET请求时:
【Java】Tomcat、Maven以及Servlet的基本使用_第14张图片

而当发送post请求时,出现错误。
【Java】Tomcat、Maven以及Servlet的基本使用_第15张图片
进而说明通过浏览器(URL)时默认GET请求。那如何让他支持post该怎么做呢?继续重写doPost方法。然后打包新程序,停止之前的Tomcat服务,将新程序的war包放到tomcat的webapps下,再启动tomcat服务

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端对象
        String name = req.getParameter("name");
        //将结果返回给前端
        resp.getWriter().println("name=" + name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //将请求转发到doGet方法中。
        this.doGet(req,resp);
    }
}

【Java】Tomcat、Maven以及Servlet的基本使用_第16张图片

配置插件

上述整个流程中,每次更改程序之后都要重新打包,然后将其放在tomcat的目录下,非常不方便,我们需要一种方便的部署方式。可以通过下载smart Tomcat插件并重启IDEA(专业版忽略)。
【Java】Tomcat、Maven以及Servlet的基本使用_第17张图片

设置好配置信息
【Java】Tomcat、Maven以及Servlet的基本使用_第18张图片
将运行出的链接粘贴到浏览器并指定自己的注解即可。
【Java】Tomcat、Maven以及Servlet的基本使用_第19张图片


继续加油~
【Java】Tomcat、Maven以及Servlet的基本使用_第20张图片

你可能感兴趣的:(JavaEE初阶,servlet,java,javaee,开发语言,服务器,maven,tomcat)