ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Springboot-Web开发二

2022-01-26 09:03:43  阅读:120  来源: 互联网

标签:Web Springboot void request response 开发 组件 public 页面


目录

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,需要引入第三方模板引擎技术实现页面渲染

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

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

标签:Web,Springboot,void,request,response,开发,组件,public,页面
来源: https://blog.csdn.net/m0_46979453/article/details/122369395

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有