目录
2.1、编写一个拦截器实现HandlerInterceptor接口
2.2、将拦截器注册到容器中(添加一个配置类实现WebMvcConfigurer,重写addInterceptors)
4、Web原生组件注入(三大组件:Servlet、Filter、Listener)
4.1、使用@WebServlet、@WebFilter、@WebListener注入三大组件
4.2、使用@Configuration+@Bean注入三大组件 ,配置类
1、视图解析与模板引擎
1.1、视图解析
视图解析:Springboot默认是不支持JSP,需要引入第三方模板引擎技术实现页面渲染
1.2、模板引擎-Thymeleaf
2.1、表达式
th:href="@{/xxx}:使用@{}时,会自动补全项目根目录和后缀,所以xxx只需要写页面名称
2.2、使用步骤
1、导入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、使用Thymeleaf要在HTML页面加上命名空间:xmlns:th="http://www.thymeleaf.org"
<html lang="en" xmlns:th="http://www.thymeleaf.org">
1.3、Thymeleaf抽取公共页面
就是把所有很多页面都用到的代码抽取出来,放在一个页面,然后分成好多模块,哪个页面需要哪个模块就插入该模块
3.1、导入所有的需要的静态页面,给所有的静态页面添加Thymeleaf名称空间
3.2、将所有的页面的公共部分抽取出来放在common.html的页面上,包括静态资源导入。
3.3、将common.html中的导入静态的资源的链接改为Thymeleaf的格式th:href等,这样可以自动获取服务器的路径,以后部署在服务器上时也不需要再修改代码
3.4、将功能页面上各个模块(左侧菜单、顶部菜单等)加上 th:fragment="自定义模块名称 "
3.5、其他页面引用该公共页面上所需要的模块
插入: <div th:insert="公共页面名::xxx"></div>:在该div标签下将xxx模块全部引入
替换:<div th:replace="公共页面名::xxx"></div>:用xxx模块替换掉<div>标签
包含: <div th:include="公共页面名::xxx"></div>:在该div标签下将xxx模块下的内容全部引入
2、拦截器
2.1、编写一个拦截器实现HandlerInterceptor接口
/**
*拦截器:登录检查
*/
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目标方法执行之前
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录检查逻辑
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser!=null)//如果不为空,说明已经有用户登录
return true;//登录 放行
//拦截住,未登录 跳转到登录页面
request.setAttribute("msg","请先登录!");
request.getRequestDispatcher("/login").forward(request,response);
return false;
}
/**
* 目标方法执行完成以后
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHanle方法执行了");
}
/**
* 页面渲染以后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion方法执行了");
}
}
2.2、将拦截器注册到容器中(添加一个配置类实现WebMvcConfigurer,重写addInterceptors)
2.3、指定拦截规则
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")//所有请求都被拦截,包括静态资源
.excludePathPatterns("/","/login","/logmain","/css/**","/fonts/**","/images/**","/js/**");//放行/,/login,放行静态资源
}
}
注意:静态资源的放行,所有静态资源在static目录下css、fonts、images、js等目录下
3、错误处理
3.1、默认规则
- 默认情况下,Spring Boot提供
/error
处理所有错误的映射 - 对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据
机器客户端:响应Json
浏览器:响应页面
3.2、定制错误处理
自定义错误页
1、error/404.html error/5xx.html;有精确的错误状态码页面就匹配精确,没有就找 4xx.html;如果都没有就触发白页
4、Web原生组件注入(三大组件:Servlet、Filter、Listener)
4.1、使用@WebServlet、@WebFilter、@WebListener注入三大组件
1、@ServletComponentScan(basePackages = "com.rk.admin") :指定原生Servlet组件都放在那里,指定之后原生的Servelt组件才会生效
2、注入Servlet组件,继承HttpServlet。使用 @WebServlet(urlPatterns = "/rk"),直接响应,没有经过拦截器
@WebServlet("/rk")//访问路径
public class webservlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("66666");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3、注入Filter组件,实现Filter接口。过滤器@WebFilter(urlPatterns={"/css/*","/images/*"})
@WebFilter(urlPatterns = {"/css/*","/images/*"})//需要拦截的请求
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Myfilter初始化完成");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("fileter工作");
//编写逻辑代码
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("Myfilter销毁");
}
}
注意:Spring中拦截器的拦截css路径下的所有请求使用/css/**,Servlet中使用的是/css/*
4、注入Listener组件,监听器@WebListener
@WebListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("MyServletContextListener监听到项目初始化完成");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("监听到项目销毁");
}
}
4.2、使用@Configuration+@Bean注入三大组件 ,配置类
去掉上面三个注解,那三个组件就变成普通的类了,现在使用配置类注入
@Configuration
public class MyRegistConfig {
//注册Servlet
@Bean
public ServletRegistrationBean myServlet(){
webservlet webservlet=new webservlet();
//参数1为一个继承了HttpServlet的类,参数2可为多个请求
return new ServletRegistrationBean(webservlet,"/rk","/rk2");
}
//注册Filter
@Bean
public FilterRegistrationBean myfilter(){
MyFilter myFilter=new MyFilter();
//参数为一个Filter
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean(myFilter);
//设置filter的拦截路径
filterRegistrationBean.setUrlPatterns(Arrays.asList("/rk","/css/*"));
return filterRegistrationBean;
}
//注册Listener
@Bean
public ServletListenerRegistrationBean mylistener(){
MyServletContextListener myServletContextListener=new MyServletContextListener();
return new ServletListenerRegistrationBean(myServletContextListener);
}
}
5、嵌入式tomcat服务器
5.1、切换嵌入式服务器
Springboot默认支持的web服务器有:Tomcat
, Jetty
, or Undertow。
切换为Undertow服务器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
导入web场景,排除它内置的tomcat这个jar包,导入一个新的undertow服务器,此时启动项目,使用的是undertow服务器。
5.2、定制嵌入式服务器
1、修改配置文件:server.xxx
例如:修改服务器启动端口:server.port=xxx
2、实现 WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>。把配置文件的值和ServletWebServerFactory 进行绑定
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.stereotype.Component;
@Component
public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(9000);
}
}
3、编写自定义的配置类 xxxConfiguration;+ @Bean替换、增加容器中默认组件;视图解析器 。Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能;+ @Bean给容器中再扩展一些组件 吧
@EnableWebMvc + WebMvcConfigurer —— @Bean 可以全面接管SpringMVC,所有规则全部自己重新
5.3、定制化原理
场景starter - xxxxAutoConfiguration -利用@Bean导入xxx组件 - 绑定xxxProperties -- 绑定配置文件项