Spring Boot 中的Servlet简单使用
当使用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.访问结果
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包裹一层 动态的加上一些初始参数。
推荐阅读
-
Spring Boot 中的Servlet简单使用
-
Spring Boot的listener(监听器)简单使用实例详解
-
Spring Boot使用AOP实现REST接口简易灵活的安全认证的方法
-
spring boot中的静态资源加载处理方式
-
Spring Boot的filter(过滤器)简单使用实例详解
-
spring boot的拦截器简单使用示例代码
-
spring boot与kafka集成的简单实例
-
在Spring Boot应用程序中使用Apache Kafka的方法步骤详解
-
举例讲解Android应用中SimpleAdapter简单适配器的使用
-
Redis系列三 - Spring boot如何使用redis做缓存及缓存注解的用法总结