博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SpringBoot - 03整合Web层技术

Posted on 2020-12-11 22:17  Kingdomer  阅读(118)  评论(0编辑  收藏  举报

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>