SpringBoot - 03整合Web层技术
(1)整合Servlet
(1.1) 通过@WebServlet + @ServletComponentScan注解
@WebServlet(name="FirstServlet", urlPatterns = "/first") public class FirstServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) { System.out.println("First Servlet ..."); } }
@SpringBootApplication // 在SpringBoot启动时扫描@WebServlet、@WebFilter注解,并将该类实例化 @ServletComponentScan public class SpringBoot03WebApplication { public static void main(String[] args) { SpringApplication.run(SpringBoot03WebApplication.class, args); } }
(1.2)通过方法完成Servlet组件注册: @Bean + @Configuration
创建Servlet
public class SecondServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) { System.out.println("Second Servlet ..."); } }
完成Servlet配置类
@Configuration public class ServletConfig { @Bean public ServletRegistrationBean getServletRegistrationBean(){ ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet()); bean.addUrlMappings("/second"); return bean; } }
(2)整合Filter
(2.1)通过注解扫描完成Filter组件注册
@WebFilter(filterName = "FirstFilter", urlPatterns = "/first") public class FirstFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("进入到First Filter 中......"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("离开First Filter ......"); } @Override public void destroy() { } }
@SpringBootApplication // 在SpringBoot启动时扫描@WebServlet、@WebFilter注解,并将该类实例化 @ServletComponentScan public class SpringBoot03WebApplication { public static void main(String[] args) { SpringApplication.run(SpringBoot03WebApplication.class, args); } }
结果:
进入到First Filter 中......
First Servlet ...
离开First Filter ......
(2.2)通过方法完成Filter组件注册
public class SecondFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("进入到Second Filter 中......"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("离开Second Filter ......"); } @Override public void destroy() {} }
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean getFilterRegistrationBean(){ FilterRegistrationBean bean = new FilterRegistrationBean(new SecondFilter()); // bean.addUrlPatterns(new String[]{"*.do","*.jsp"}); bean.addUrlPatterns("/second"); return bean; } }
(3)整合Listener
(3.1)注解方式
@WebListener public class FirstListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent event){ } public void contextInitialized(ServletContextEvent event){ System.out.println("First Listener Init ......"); } }
@SpringBootApplication // 在SpringBoot启动时扫描@WebServlet、@WebFilter、@WebListener注解,并将该类实例化 @ServletComponentScan public class SpringBoot03WebApplication { public static void main(String[] args) { SpringApplication.run(SpringBoot03WebApplication.class, args); } }
(3.2)通过方法完成Listener组件注册
public class SecondListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent event){ } public void contextInitialized(ServletContextEvent event){ System.out.println("Second Listener Init ......"); } }
@Configuration public class ListenerConfig { @Bean public ServletListenerRegistrationBean getServletListenerRegistrationBean(){ ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(new SecondListener()); return bean; } }
访问: http://localhost:8081/first
2020-12-11 20:56:15.752 INFO 3960 --- [ main] c.b.s.SpringBoot03WebApplication : Starting SpringBoot03WebApplication on MonDay with PID 3960 () 2020-12-11 20:56:15.754 INFO 3960 --- [ main] c.b.s.SpringBoot03WebApplication : No active profile set, falling back to default profiles: default 2020-12-11 20:56:16.467 INFO 3960 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) 2020-12-11 20:56:16.467 INFO 3960 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2020-12-11 20:56:16.467 INFO 3960 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.38] 2020-12-11 20:56:16.530 INFO 3960 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2020-12-11 20:56:16.530 INFO 3960 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 734 ms Second Listener Init ...... First Listener Init ...... 2020-12-11 20:56:16.686 INFO 3960 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2020-12-11 20:56:16.729 INFO 3960 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [META-INF/resources/index.html] 2020-12-11 20:56:16.792 INFO 3960 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '' 2020-12-11 20:56:16.794 INFO 3960 --- [ main] c.b.s.SpringBoot03WebApplication : Started SpringBoot03WebApplication in 1.29 seconds (JVM running for 1.818) 进入到First Filter 中...... First Servlet ... 离开First Filter ......
(4)SpringBoot访问静态资源
在SpringBoot项目中没有之前常规web开发的WebContent(Webapp),它只有src目录。在src/main/resources下面有两个文件夹,static 和 templates。
SpringBoot默认在static 目录中存放静态页面,而templates中放动态页面。
- static目录
- SpringBoot通过 classpath/static 目录访问静态资源。注意存放静态资源的目录名称必须是static。
- templates目录
- 在SpringBoot中不推荐使用jsp作为视图层技术,而是默认使用Thymeleaf来做动态页面。 Templates目录就是存放Thymeleaf的页面。
(4.1)静态资源访问测试
Controller层
@Controller public class PageController { @RequestMapping("/page") public String showPage(){ return "index.html"; } }
src/resources/static/index.html 图片资源: static/11.jpg, static/img/12.jpg
<html> <head> <title>index</title> </head> <body> <h2>Hello Bear PX</h2> <img src="11.jpg"/> <img src="img/12.jpg"/> </body> </html>
测试:http://localhost:8081/page
项目静态资源目录结构
(4.2)静态资源存放其他位置
- SpringBoot访问静态资源的位置
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
- 自定义视图
- # 配置静态资源访问路径
- spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/static/,classpath:/public/
调整后静态资源目录结构
当静态资源放置在static文件目录之外后,通过spring.resources.static-locations 配置路径。
图片文件在使用时,不要用去添加新配置的目录。
<html> <head> <title>index</title> </head> <body> <h2>Hello Bear PX</h2> <img src="11.jpg"/> <img src="img/12.jpg"/> <img src="14.jpg"/> // 14.jpg 放置在 public 下。 相对于index.html文件的位置。 </body> </html>