Servlet的基础配置

时间:2025-04-21 21:56:12

Servlet的基础配置

​ servlet是一种相对动态的web开发技术,对于用户输入不同的参数,可以得到不同的输出结果,因此我们说servlet是相对动态的,servlet在实际web开发时,也以动态开发为主。对于servlet而言,实际上它是javaee的十三个规范之一,我们在进行开发的时候,通常首先要有一个关于它的实现类(继承servlet接口)。

servlet的简单演示(试着练习两边)
  • 在中导入servlet的相关依赖坐标:

    <dependency>
          <groupId></groupId>
          <artifactId>-api</artifactId>
          <version>3.1.0</version>    
          <scope>provided</scope> 
        </dependency>
    
  • 定义一个类,实现servlet接口,并且重写接口中的方法(主要是servlet方法),并在servlet方法中加入一些输出语句,并在实现类的基础上加上注释@WebServlet(访问的最后路径)

    @WebServlet("/helloWorld")
    public class myServlet implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {}
        @Override
        public ServletConfig getServletConfig() {return null;}
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("万岁~");}
        @Override
        public String getServletInfo() {return null;}
        @Override
        public void destroy() {}
    }
    
  • 最后启动Tomcat(我这里安装的是本地的Tomcat服务器)即可,在浏览器的url中输入相应的访问路径。

  • 注意事项:

    有时候,我们打开了完成了servlet的相关部署,但是却并不能运行自己的java代码,这一点在已经部署完成servlet相关坐标后即将要运行实现servlet的实现类的时候,特别需要注意,对于控制台会显示出"java5无法运行"的字样,对于这一点我们可以在中导入如下配置,即可解决版本问题:(需要注意我的jdk版本是十七,需要先调节成为自己的jdk版本

      <properties>
        <>17</>
        <>17</>
      </properties>
    
servlet的运行相关机理(包括内部实现与生命周期)

​ servlet通常是作为一种Web程序的服务,它由Web服务器去执行(我这里用的是本地的Tomcat服务器),servlet由Web服务器去创建,关于servlet方法也是由Web服务器去调用,具体来说Web服务器首先去寻找servlet接口,进而可以寻找到我们创建的servlet实现类,进而它可以找出servlet的方法,然后便可以去执行。

servlet的生命周期可以类比于线程的执行,包括了从出生到死亡的过程,其实主要还是受Web服务器的控制,一般来说有:

servlet受Web服务器的响应开始执行实现接口化

初始化阶段:servlet对象生成以后,要先进行初始化操作,完成一些初始化操作,这个过程由servlet中的init()方法完成,且该方法仅仅调用一次

​ init()方法一般会在启动服务的时候调用一次,完成初始化,默认情况下,它会在启动的时候调用。但是这个参数是可以调整的,要是想要它的运行效率更高一些,我们可以让这个初始化的过程提前就完成操作(在servlet项目启用之前) 在@WebServlet()中加入loadOnStartup 参数,使其大于等于0即可(默认情况下是小于0的)

下面演示代码与运行过程:默认

package ServletDemo;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet(urlPatterns = "/helloWorld")
public class myServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("我永远维护~不顾个人");
    }
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("万岁~");
    }
    //还有其他方法一定需要重写,在这里暂且忽略
   //运行结果:
我永远维护~不顾个人
万岁~
[2022-09-23 11:31:21,523] 工件 Tomcat-MavenWeb:war: 正在部署工件,请稍候…
[2022-09-23 11:31:21,524] 工件 Tomcat-MavenWeb:war exploded: 正在部署工件,请稍候…
[2022-09-23 11:31:22,141] 工件 Tomcat-MavenWeb:war: 工件已成功部署
[2022-09-23 11:31:22,141] 工件 Tomcat-MavenWeb:war: 部署已花费 618 毫秒
[2022-09-23 11:31:22,276] 工件 Tomcat-MavenWeb:war exploded: 工件已成功部署
[2022-09-23 11:31:22,276] 工件 Tomcat-MavenWeb:war exploded: 部署已花费 752 毫秒
23-Sep-2022 11:31:31.378 信息 [localhost-startStop-1]  把web 应用程序部署到目录 [D:\迅雷下载\apache-tomcat-8.5.82-windows-x64\apache-tomcat-8.5.82\webapps\manager]
23-Sep-2022 11:31:31.501 信息 [localhost-startStop-1]  Web应用程序目录[D:\迅雷下载\apache-tomcat-8.5.82-windows-x64\apache-tomcat-8.5.82\webapps\manager]的部署已在[121]毫秒内完成
我永远维护~不顾个人

下面演示代码与运行过程:在servlet项目正式启动之前就先进行初始化

package ServletDemo;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
//提前初始化,就是使得loadOnStartup >= 0 即可,默认是负整数
@WebServlet(urlPatterns = "/helloWorld",loadOnStartup = 1)
public class myServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("我永远维护~不顾个人");
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("万岁~");
    }
    //还有其他方法一定需要重写,在这里暂且忽略
}
[2022-09-23 12:01:47,559] 工件 Tomcat-MavenWeb:war: 正在部署工件,请稍候…
[2022-09-23 12:01:47,559] 工件 Tomcat-MavenWeb:war exploded: 正在部署工件,请稍候…
我永远维护~不顾个人
[2022-09-23 12:01:48,128] 工件 Tomcat-MavenWeb:war: 工件已成功部署
[2022-09-23 12:01:48,128] 工件 Tomcat-MavenWeb:war: 部署已花费 570 毫秒
我永远维护~不顾个人
[2022-09-23 12:01:48,263] 工件 Tomcat-MavenWeb:war exploded: 工件已成功部署
[2022-09-23 12:01:48,263] 工件 Tomcat-MavenWeb:war exploded: 部署已花费 704 毫秒

若将loadOnStartup参数调成非负数,则在Web服务器启动阶段就完成了servlet的初始化init(),不用打开相关的Web项目。

对于整个Servlet生命周期中,我们最需要的就是Servlet接口调用servlet方法,当我们访问浏览器时,就会执行相应的相关的servlet方法,每次访问浏览器时,都会访问一遍相关方法。

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("万岁~");
    }

最后我们要关闭项目(正常的关闭),需要调用destory方法,相当于一个清理资源的作用。

servlet的简单架构
  • 一个常见的方法getServletConfig方法

        @Override
        public ServletConfig getServletConfig() {return null;}
    //可以看到用来生成一个ServletConfig对象
    
  • servlet的体系结构

    其作用是用来简化servlet的开发,servlet中只有servlet方法会经常调用,所以我们寻找一种更加简单的代码编写方式。Servlet其实就是一种接口,一个Servlet体系的最根本的接口,开发人员为了简化使用它进行开发,已经定义了属于它的专有实现类,比如GenericServlet(Servlet抽象实现类),HttpServlet(对HTTP进行过封装的servlet实现类)

    开发Web项目是需要基于HTTP协议的,所以我们会借助HttpServlet来简化我们的开发(继承这个类),范例如下:

    package ServletDemo1;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    @WebServlet("/helloWeb")
    public class ServletWeb2 extends HttpServlet {
        //可以表明两种不同的请求方式
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("get...请求方式");     //浏览器用get方式进行请求
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("post...请求方式");    //浏览器用post方式进行请求
        }
    }
    

    一般的,默认情况下用的是get请求方式

    23-Sep-2022 16:54:30.486 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\迅雷下载\apache-tomcat-8.5.82-windows-x64\apache-tomcat-8.5.82\webapps\Tomcat_MavenWeb1_war]的部署已在[79]毫秒内完成
    23-Sep-2022 16:54:30.486 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\迅雷下载\apache-tomcat-8.5.82-windows-x64\apache-tomcat-8.5.82\webapps\Tomcat_MavenWeb_war]
    23-Sep-2022 16:54:30.574 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\迅雷下载\apache-tomcat-8.5.82-windows-x64\apache-tomcat-8.5.82\webapps\Tomcat_MavenWeb_war]的部署已在[88]毫秒内完成
    get...请求方式
    get...请求方式
    

    我们也可以利用post请求方式(效果更好)

    首先创建一个html文件,加上表单

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>子网站</title>
    </head>
    <body>
    <!--加载一个图片-->
    <img src="" height="400" width="200">
    <!--添加一个请求路径,浏览器将输出的东西通过请求发送给服务器,服务器接收后做出响应-->
    <!--请求的方式是post请求-->
    <form action="http://localhost:8080/MavenWeb_Tomcat_war/helloWeb" method="post">
    <input name="username"><input type="submit">
    </form>
    </body>
    </html>
    

​ 然后启动Web程序,借助其中内置的servlet启动运行机制,进而帮助我们将浏览器中的数据传给后台进行处理,传递时进行请求,而请求的方式就是post方式。不同的请求方式对应不同的处理逻辑。HttpServlet的使用:1.继承HttpServlet 2.重写doGet和doPost的方法,doGet方法来写相应的Get请求的逻辑语句,doPost方法来写相应的Post请求的逻辑语句。

servlet相关的urlPatten配置
  1. servlet中一个Servlet可以配置多个urlPatten

    urlPatten存在于@WebServlet()之中是用来配置不同的访问路径的比如: @WebServlet(urlPatten={“demo1”,“demo2”})

    @WebServlet({"/Get","/Post"})
    public class ServletWeb3  extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("do GET...");
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("do Post...");
        }
    }
    

的配置规则

​ 1.精确匹配:精确匹配是我们最为常用的一种方式,把需要在浏览器扩展的目录名称全部写出来,写到@WebServlet()中去,这是企业开发中最为常见的一种匹配方式

​ 2.目录匹配(/确定的目录/任意的目录) 3.扩展名匹配(任意的路径.固定的扩展名) 4.任意匹配(“/”,“/*”)(最好别用)