spring boot(2)- web

目录

 

1.  springboot整合Servlet,Filter,Listener

2. 静态资源配置

2.1 加载webjars文件

2.2 加载静态资源

2.3 首页的配置 index.html

3. 模板引擎

4. Thymeleaf


1.  springboot整合Servlet,Filter,Listener

步骤:

1. 创建servlet,filter,listener。

servlet继承HttpServlet

filter 实现Filter接口

listener 实现HttpSessionListener 接口

2. 将这些类注入到spring中

 

1.1 创建Servlet类

servlet 需要 servletname 和 url

方式1:用注解@WebServlet的方式+@ServletComponentScan

@WebFilter

@WebListener

package com.hww.springbootdemo.servlet;

import com.hww.springbootdemo.listener.MyListener;

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;

/**
 * springboot 整合servlet
 * 1. 创建自定义servlet,继承HttpServlet类,自定义doGet或者doPost方法
 * 2. 需要将自定义的servlet注册到spring中。通过Configuration类实现。
 */
@WebServlet(name ="myServlet",urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入自定义servlet-----------");
        super.doGet(req, resp);
    }
}

1.2 创建Filter类

package com.hww.springbootdemo.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "myFilter",urlPatterns = "/*")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("自定义filter-init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("自定义doFilter");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("自定义filter-destroy");
    }
}

1.3 创建监听类

package com.hww.springbootdemo.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MyListener implements HttpSessionListener {

    public static int online = 0;

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("session创建,用户登录");
        online++;
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session销毁,用户下线");
//        online--;
    }
}

1.4 注册Servlet Filter Listener


@SpringBootApplication(scanBasePackages = "com.hww")
@ServletComponentScan
public class SpringbootdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootdemoApplication.class, args);
    }

}

方式2:去掉注解。利用@Configuretion 配置类来注册

可以指定servletname 和 urlpatten。注意urlpatten 必须是 / 开头

package com.hww.springbootdemo.configuration;

import com.hww.springbootdemo.filter.MyFilter;
import com.hww.springbootdemo.listener.MyListener;
import com.hww.springbootdemo.servlet.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfiguration {

    /**
     * 将自定义servlet注册到spring中
     * @return
     */
    @Bean
    public ServletRegistrationBean<MyServlet> getServletRegistrationBean(){
        ServletRegistrationBean<MyServlet> bean = new ServletRegistrationBean<>(new MyServlet());
        bean.setName("myservlet");
        bean.setUrlMappings(Collections.singleton("/myservlet"));
        bean.setLoadOnStartup(1);
        return bean;
    }

    /**
     * 将自定义filter注册到spring中
     * @return
     */
    @Bean
    public FilterRegistrationBean<MyFilter> getFilterRegistrationBean(){
        FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<MyFilter>(new MyFilter());
        return bean;
    }

    /**
     * 将自定义监听listener注册到spring中
     * @return
     */
    @Bean
    public ServletListenerRegistrationBean<MyListener> getServletListenerRegistrationBean(){
        ServletListenerRegistrationBean<MyListener> bean = new ServletListenerRegistrationBean<MyListener>(new MyListener());
        return bean;
    }
}

2. 静态资源配置

默认情况下,Spring Boot 将在 classpath 或者 ServletContext 根目录下从名为 /static (/public、/resources 或 /META-INF/resources)目录中服务静态内容。它使用了 Spring MVC 的 ResourceHttpRequestHandler,因此您可以通过添加自己的 WebMvcConfigurerAdapter 并重写 addResourceHandlers 方法来修改此行为。

2.1 加载webjars文件

在pom文件中添加jquery的相关依赖,直接可以通过浏览器访问到http://localhost:8080/webjars/jquery/3.4.1/jquery.js

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.4.1</version>
</dependency>

2.2 加载静态资源

在resource根目录

会有/public、/resources 、 /META-INF/resources、 /static等目录,用来存储静态文件

优先级为 classpath:/META-INF/resources/ > classpath:/resources/ >classpath:/static/ >classpath:/public/

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
            "classpath:/resources/", "classpath:/static/", "classpath:/public/" };

 

2.3 首页的配置 index.html

Spring Boot 支持静态和模板化的欢迎页面。它首先在配置的静态内容位置中查找 index.html 文件。如果找不到,则查找 index 模板。如果找到其中任何一个,它将自动用作应用程序的欢迎页面。

3. 模板引擎

除了 REST web 服务之外,您还可以使用 Spring WebFlux 来服务动态 HTML 内容。Spring WebFlux 支持多种模板技术,包括 Thymeleaf、FreeMarker 和 Mustache。

Spring Boot 包含了以下的模板引擎的自动配置支持:

当您使用这些模板引擎的其中一个并附带了默认配置时,您的模板将从 src/main/resources/templates 自动获取。

意思就是说,在没有引入模板引擎时,静态资源只能从/public、/resources 、 /META-INF/resources、 /static 目录获取。

当使用任意一个模板引擎,,静态资源就可以从src/main/resources/templates目录获取

4. Thymeleaf

4.1. 什么是模板引擎

在早期开发的时候,我们完成的都是静态页面也就是html页面,随着时间轴的发展,慢慢的引入了jsp页面,当在后端服务查询到数据之后可以转发到jsp页面,可以轻松的使用jsp页面来实现数据的显示及交互,jsp有非常强大的功能,但是,在使用springboot的时候,整个项目是以jar包的方式运行而不是war包,而且还嵌入了tomcat容器,因此,在默认情况下是不支持jsp页面的。如果直接以纯静态页面的方式会给我们的开发带来很大的麻烦,springboot推荐使用模板引擎。

模板引擎有很多种,jsp,freemarker,thymeleaf,模板引擎的作用就是我们来写一个页面模板,比如有些值呢,是动态的,我们写一些表达式。而这些值,从哪来呢,我们来组装一些数据,我们把这些数据找到。然后把这个模板和这个数据交给我们模板引擎,模板引擎按照我们这个数据帮你把这表达式解析、填充到我们指定的位置,然后把这个数据最终生成一个我们想要的内容给我们写出去,这就是我们这个模板引擎,不管是jsp还是其他模板引擎,都是这个思想。只不过不同的模板引擎语法不同而已,下面重点学习下springboot推荐使用的thymeleaf模板引擎,语法简单且功能强大

 

img

总结:从图中可以看出,使用模板引擎,能够进行数据和静态模板之间的交互。其作用我认为就是相当于原来的js控制。利用js获取页面的值,然后发给后台服务。同理从后台服务返回的值,在js中做处理,然后填充到页面中。(自己的小理解。。)

4.2 Thymeleaf处理的模板

Thymeleaf支持处理六种类型的模板,每一种模板被称为模板模式(Template Mode)。

  • HTML
  • XML
  • TEXT
  • JAVASCRIPT
  • CSS
  • RAW

这之中有两种markdown模板模式(HTML, XML),三种文本模板模式(TEXT, JAVASCRIPT和CSS)和一种无操作模板模式(RAW)

HTML模板模式支持任何类型的HTML输入,包括HTML5,HTML4和XHTML。对这些输入不会进行严格的验证和格式的检查,而且模板代码/结构在输出时会尽最大可能保持原有的内容。

XML模板模式支持XML输入。在这种模式下,代码应当是结构良好的--没有未闭合的括号,没有不带引号的属性等等--所以如果违背了结构要求解析器将会抛出异常。需要注意的是,不会针对DTD或XML Schema对XML文件进行校验。

Text模板模式允许对非markup格式的模板使用特殊的语法。这种模式的例子有邮件或者是文档模板。需要注意的是,HTML或XML模板也能作为TEXT模式被处理,它们在这种模式下不会被解析为markup语法,每一个标签,DOCTYPE,备注等等都会被当做是纯文本。

JAVASCRIPT模板模式允许在Thymeleaf应用中处理JavaScript文件。这意味着能够在JS文件中使用和HTML文件中相同的方式读取模型数据,但是需要结合JS进行特定的集成比如转义和自然脚本。这个模式属于文本模板模式,因此也和别的文本模板模式一样,使用同样的特殊语法。

CSS模板模式允许在Thymeleaf应用中处理CSS文件。类似于JAVASCRIPT模板模式,CSS模板模式也是一个文本模式,并且使用文本模式的特殊处理语法。

RAW模板模式不对模板进行处理。这种模式用于将不变的资源(文件, URL 响应, 等等)待处理的模板。比如,外部的不受控制的HTML格式的资源能够被插入应用模板中,并且可以放心的知道这些资源中包含的代码将不会被执行。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值