Springboot-Web开发二

目录

1、视图解析与模板引擎

1.1、视图解析

1.2、模板引擎-Thymeleaf

        1.2.1、表达式

        1.2.2、使用步骤

1.3、Thymeleaf抽取公共页面

2、拦截器

2.1、编写一个拦截器实现HandlerInterceptor接口

2.2、将拦截器注册到容器中(添加一个配置类实现WebMvcConfigurer,重写addInterceptors)

2.3、指定拦截规则

3、错误处理

3.1、默认规则

3.2、定制错误处理

4、Web原生组件注入(三大组件:Servlet、Filter、Listener)

4.1、使用@WebServlet、@WebFilter、@WebListener注入三大组件

4.2、使用@Configuration+@Bean注入三大组件 ,配置类     

5、嵌入式tomcat服务器

5.1、切换嵌入式服务器

5.2、定制嵌入式服务器

5.3、定制化原理


1、视图解析与模板引擎

1.1、视图解析

视图解析:Springboot默认是不支持JSP,需要引入第三方模板引擎技术实现页面渲染

Springboot-Web开发二

1.2、模板引擎-Thymeleaf

        2.1、表达式

Springboot-Web开发二

        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

Springboot-Web开发二

浏览器:响应页面

Springboot-Web开发二

3.2、定制错误处理

自定义错误页

        1、error/404.html error/5xx.html有精确的错误状态码页面就匹配精确,没有就找 4xx.html;如果都没有就触发白页

Springboot-Web开发二

4、Web原生组件注入(三大组件:Servlet、Filter、Listener)

4.1、使用@WebServlet、@WebFilter、@WebListener注入三大组件

        1、@ServletComponentScan(basePackages = "com.rk.admin") :指定原生Servlet组件都放在那里,指定之后原生的Servelt组件才会生效

Springboot-Web开发二

        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服务器有:TomcatJetty, 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服务器。

Springboot-Web开发二

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 -- 绑定配置文件项

上一篇:第四章 Python运算符和流程控制


下一篇:组策略模板DIY