Servlet知识总结(1~4)

Servlet知识总结

1.Servlet简介

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

我们把实现了Servlet接口的Java程序叫做Servlet

2.HelloServlet

Servlet接口有两个默认的实现类:HttpServlet和GenericServlet

下面用一个例子说明如何写一个最简单的HelloServlet

  1. 构建一个普通的Maven项目,将src目录删掉,作为我们的Maven主工程

  2. 关于Maven父子工程的理解

    当我们建立一个子项目时,父项目的pom.xml文件中会生成一个,如

    <modules>
        <module>servlet-01</module>
      </modules>
    

    相应的,子项目中会生成,如

    <parent>
        <artifactId>javaweb-02-servlet</artifactId>
        <groupId>com.shida</groupId>
        <version>1.0-SNAPSHOT</version>
      </parent>
    

特别要注意的是,对于新手来说,建立父项目时记得删掉父项目pom.xml中的为provide的标签

如此一来,父项目中的java子项目可以直接使用

3.Maven环境优化

  • 将web.xml修改成最新的(最好使用Tomcat默认的)

    <?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>
    

    本人习惯于在主工程下建立一个file文件保存该信息,复用起来比较方便

  • 将Maven的结构搭建完整(包括Java文件夹和resources文件夹)

4.编写一个Servlet程序

通过查看源码我们发现Servlet接口中有着名为service的抽象方法

GenericServlet实现了这个接口,但并未重写service方法

而是由HttpServlet继承GenericServlet重写service方法

所以我们自己写的类若继承了HttpServlet,我们就只需要重写父类中service方法中被调用的方法即可,如doGet()和doPost()等。

综上,我们编写一个Servlet程序的步骤应该是

  • 编写一个普通类

  • 实现Servlet接口,这里我们选择继承HttpServlet

    public class Helloservlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("ujdfgff");
            PrintWriter writer = resp.getWriter();
            writer.print("hellogfgffgfg");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    5.编写Servlet映射

首先我们要明白一件事情,即:为什么需要映射

归根到底,我们写的是Java程序,但是需要通过浏览器来访问,而浏览器进行访问需连接web服务器,所以我们需要在web服务中注册我们写的Servlet,给一个浏览器能够访问的路径

<!--注册Servlet-->
<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.shida.servlet.HelloServlet</servlet-class>
  </servlet>
<!--Servlet的请求路径-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

6.配置Tomcat

这里只需稍注意一下配置artifacts中项目发布的路径即可

7.启动测试

3.Servlet原理

Servlet由web服务器调用,过程如下

  • web服务器收到浏览器发送的Http请求
  • web生成Request和Response对象,Request对象从service拿到请求,并将得到的响应交给Response
  • web服务器读取Response的响应信息(web服务器首次访问会生成servlet的class文件
  • web服务器将信息响应给客户端

所以我们自己编写的实现类主要做的有两件事

  1. 接收并处理请求
  2. 给出响应的信息

4.Mapping问题

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

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
    
  2. 一个Servlet可以指定多个映射路径

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello3</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello4</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello5</url-pattern>
      </servlet-mapping>
    
  3. 一个Servlet可以指定通用映射路径

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
      </servlet-mapping>
    
  4. 默认请求路径

     <!--默认请求路径-->
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
      </servlet-mapping>
    
  5. 指定一些前缀或者后缀等

    <!--可以自定义后缀实现请求映射
      注意点,*前面不能加项目映射的路径
      hello/sajdlkajda.shida
      -->
    <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>*.shida</url-pattern>
    </servlet-mapping>
    
  6. 优先级问题

    指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求

posted @ 2020-08-06 23:02  Meeseeks  阅读(121)  评论(0)    收藏  举报