目录
1. springboot整合Servlet,Filter,Listener
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模板引擎,语法简单且功能强大
总结:从图中可以看出,使用模板引擎,能够进行数据和静态模板之间的交互。其作用我认为就是相当于原来的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格式的资源能够被插入应用模板中,并且可以放心的知道这些资源中包含的代码将不会被执行。