欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Boot 中的Servlet简单使用

程序员文章站 2024-02-27 12:44:45
当使用spring-boot时,嵌入式servlet容器通过扫描注解的方式注册servlet、filter和servlet规范的所有监听器(如httpsessionlist...

当使用spring-boot时,嵌入式servlet容器通过扫描注解的方式注册servlet、filter和servlet规范的所有监听器(如httpsessionlistener监听器)。

spring boot 的主 servlet 为 dispatcherservlet,其默认的url-pattern为“/”。也许我们在应用中还需要定义更多的servlet,该如何使用springboot来完成呢?

在spring boot中添加自己的servlet有两种方法,代码注册servlet和注解自动注册(filter和listener也是如此)。

一、代码注册通过servletregistrationbean、 filterregistrationbean 和 servletlistenerregistrationbean 获得控制。

也可以通过实现 servletcontextinitializer 接口直接注册。

二、在 springbootapplication 上使用@servletcomponentscan 注解后,servlet、filter、listener 可以直接通过 @webservlet、@webfilter、@weblistener 注解自动注册,无需其他代码。

1.通过代码注册servlet示例代码

1).springbootsimpleapplication.java类:

package com.example;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.boot.web.servlet.servletregistrationbean;
import org.springframework.context.annotation.bean;
import com.example.servlet.myservlet;
@springbootapplication
public class springbootsimpleapplication {
  /**
   * 使用代码注册servlet(不需要@servletcomponentscan注解)
   */
  @bean
  public servletregistrationbean servletregistrationbean() {
    return new servletregistrationbean(new myservlet(), "/st/*");// servletname默认值为首字母小写,即myservlet
  }
  public static void main(string[] args) {
    springapplication.run(springbootsimpleapplication.class, args);
  }
}

2).myservlet.java类:

package com.example.servlet;
import java.io.ioexception;
import java.io.printwriter;
import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
public class myservlet extends httpservlet{
  @override
  protected void doget(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception {
    system.out.println(">>>>>>>>>>doget()<<<<<<<<<<<");
    dopost(req, resp);
  }
  @override
  protected void dopost(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception {
    system.out.println(">>>>>>>>>>dopost()<<<<<<<<<<<");
    resp.setcontenttype("text/html"); 
    resp.setcharacterencoding("utf-8");
    printwriter out = resp.getwriter(); 
    out.println("<html>"); 
    out.println("<head>"); 
    out.println("<title>hello world</title>"); 
    out.println("</head>"); 
    out.println("<body>"); 
    out.println("<h1>大家好,我的名字叫servlet</h1>"); 
    out.println("</body>"); 
    out.println("</html>"); 
  }
}

2.使用注解注册servlet示例代码

1).springbootsimpleapplication.java类:

package com.example;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.boot.web.servlet.servletcomponentscan;
import org.springframework.boot.web.servlet.servletregistrationbean;
import org.springframework.context.annotation.bean;
import com.example.servlet.myservlet;
@springbootapplication
@servletcomponentscan
public class springbootsimpleapplication {
  /**
   * 使用代码注册servlet(不需要@servletcomponentscan注解)
   */
  @bean
  public servletregistrationbean servletregistrationbean() {
    return new servletregistrationbean(new myservlet(), "/st/*");// servletname默认值为首字母小写,即myservlet
  }
  public static void main(string[] args) {
    springapplication.run(springbootsimpleapplication.class, args);
  }
}

2).myservlet2.java类:

package com.example.servlet;
import java.io.ioexception;
import java.io.printwriter;
import javax.servlet.servletexception;
import javax.servlet.annotation.webservlet;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
// 不指定name的情况下,name默认值为类全路径,即com.example.servlet.myservlet2
@webservlet(urlpatterns="/st/myservlet2", description="servlet的说明")
public class myservlet2 extends httpservlet{
  @override
  protected void doget(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception {
    system.out.println(">>>>>>>>>>doget2()<<<<<<<<<<<");
    dopost(req, resp);
  }
  @override
  protected void dopost(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception {
    system.out.println(">>>>>>>>>>dopost2()<<<<<<<<<<<");
    resp.setcontenttype("text/html");
    resp.setcharacterencoding("utf-8");
    printwriter out = resp.getwriter(); 
    out.println("<html>"); 
    out.println("<head>"); 
    out.println("<title>hello world</title>"); 
    out.println("</head>"); 
    out.println("<body>"); 
    out.println("<h1>大家好,我的名字叫servlet2</h1>"); 
    out.println("</body>"); 
    out.println("</html>"); 
  }
}

使用 @webservlet 注解,其中可以设置一些属性。

3.访问结果

Spring Boot 中的Servlet简单使用

4.dispatcherservlet默认拦截

dispatcherservlet 默认拦截“/”,myservlet 拦截“/st/*”,myservlet2 拦截“/st/myservlet”,那么在我们访问 的时候系统会怎么处理呢?如果访问 的时候又是什么结果呢?其结果是“匹配的优先级是从精确到模糊,复合条件的servlet并不会都执行”。

既然系统dispatcherservlet 默认拦截“/”,那么我们是否能做修改呢,答案是肯定的,我们在springbootsampleapplication中添加代码:

 /**
   * 修改dispatcherservlet默认配置
   */
  @bean
  public servletregistrationbean dispatcherregistration(dispatcherservlet dispatcherservlet) {
    servletregistrationbean registration = new servletregistrationbean(dispatcherservlet);
    registration.geturlmappings().clear();
    registration.addurlmappings("*.do");
    registration.addurlmappings("*.json");
    return registration;
  }

可以通过注入dispatcherservlet 然后用servletregistrationbean包裹一层 动态的加上一些初始参数。