前言:

本文内容:HelloServlet、Servlet原理

推荐免费JavaWeb入门到实战视频:【狂神说Java】JavaWeb入门到实战_哔哩哔哩_bilibili

HelloServlet

JavaServlet简介

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

  • Servlet是Sun公司开发的动态web技术
  • Sun在这些API中提供一个接口:Servlet,如果想开发Servelt程序,只需要完成以下步骤:
    • 编写一个类,实现Servlet接口
    • 把开发好的Java类部署到web服务器中
  • 把实现了Servlet接口的Java程序叫做Servlet

创建Servlet

  1. 创建一个普通的Maven项目,删掉里面的src目录,我们在其中就创建Moudel

  2. 关于Maven父子工程的关系:

    父项目中会有

    1
    2
    3
    <modules>
    <mouble>servlet-01</mouble>
    </modules>

    子项目中会有

    1
    2
    3
    4
    5
    <parent>
    <artifactId>javaweb-02-servlet</artifactId>
    <groupId>com.jokerdig</groupId>
    <version>1.0-SNAPSHOT</version>
    </parent>

    父项目中的java子项目可以直接使用

    1
    son extends father

    最新的web.xml头文件

    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0"
    metadata-complete="true">

    </web-app>
  3. Maven环境优化

    • 修改web.xml为最新
    • 将Maven的结构完善
  4. 编写一个Servlet程序

    • 编写一个普通类

    • 实现Servlet接口(继承HttpServlet,还有另一个GenericServlet,它俩实现了Servlet接口)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      package com.jokerdig.servelt;

      import javax.servlet.ServletException;
      import javax.servlet.ServletOutputStream;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.io.PrintWriter;

      /**
      * @author Joker大雄
      * @data 2022/3/28 - 14:02
      **/
      public class HelloServlet extends HttpServlet {
      // 由于get和post只是请求实现的方式不同,可以互相调用,业务逻辑一样

      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      // ServletOutputStream outputStream = resp.getOutputStream();
      PrintWriter writer = resp.getWriter();// 响应流
      writer.print("Hello Servlet");
      }

      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      doGet(req,resp);
      }
      }
  5. 编写Servlet的映射

    为什么需要映射:我们写Java程序,但需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需要一个浏览器可以访问的路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0"
    metadata-complete="true">

    <!-- 注册Servlet-->
    <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.jokerdig.servlet.HelloServlet</servlet-class>
    </servlet>
    <!-- Servlet映射-->
    <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    </web-app>
  6. 配置Tomcat

  7. 启动测试

博主遇到的问题:

遇到pom.xml已经配置了对应的包,但是调用后运行项目仍然报错找不到包

这是新版(博主使用2020版)IDEA会出现的问题,因为Maven配置包版本不匹配

2022/7/30更新:别用IDEA2020.1的版本,否则你会变得不幸(该版本Bug超多)

解决办法:

别用IDEA2020.1的版本,就不会遇到该问题

Servlet原理

Servlet是由Web服务器调用,Web服务器收到浏览器请求

132

Mapping问题

一个Servlet可以指定一个映射路径

1
2
3
4
5
<!--    Servlet映射-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

一个Servlet可以指定多个映射路径

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--    Servlet映射-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>

一个Servlet可以指定通用映射路径

1
2
3
4
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>

默认请求路径

1
2
3
4
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

优先级问题

制定了固有的映射路径,优先级最高,找不到在去默认路径