SpringBoot學習系列-Spring Web MVC 視圖技術

Spring Web MVC 視圖技術java

Bean 生命週期

實例化 -> Bean Class -> Bean Objectweb

初始化前 -> Bean before/pre init()spring

  • org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization

初始化 -> init()緩存

  • org.springframework.beans.factory.InitializingBean#afterPropertiesSet()

初始化後bash

  • org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization()

銷燬jsp

  • org.springframework.beans.factory.DisposableBean#destroy()

主要內容

Thymeleaf 視圖技術

渲染上下文(模型) Model

  • Spring Web MVC
    • 接口類型
      • Model
      • ModelMap
      • ModelAndView
        • Model -> ModelMap
        • View -> Object
    • 註解類型
      • @ModelAttrtibute

EL 表達式

  • 字符值
  • 多種數據類型
  • 邏輯表達式
    • if else
  • 迭表明達式
    • for each / while
  • 反射
    • Java Reflection
    • CGLib

視圖解析

模板尋址

prefix + view-name + suffix工具

classpath:/templates/thymeleaf/index.dota2
複製代碼

view.setUrl(getPrefix() + viewName + getSuffix())post

Class<?> viewClass = this.getViewClass();
        Assert.state(viewClass != null, "No view class");
        AbstractUrlBasedView view = (AbstractUrlBasedView)BeanUtils.instantiateClass(viewClass);
        view.setUrl(this.getPrefix() + viewName + this.getSuffix());
        String contentType = this.getContentType();
        if (contentType != null) {
            view.setContentType(contentType);
        }

        view.setRequestContextAttribute(this.getRequestContextAttribute());
        view.setAttributesMap(this.getAttributesMap());
        Boolean exposePathVariables = this.getExposePathVariables();
        if (exposePathVariables != null) {
            view.setExposePathVariables(exposePathVariables);
        }

        Boolean exposeContextBeansAsAttributes = this.getExposeContextBeansAsAttributes();
        if (exposeContextBeansAsAttributes != null) {
            view.setExposeContextBeansAsAttributes(exposeContextBeansAsAttributes);
        }

        String[] exposedContextBeanNames = this.getExposedContextBeanNames();
        if (exposedContextBeanNames != null) {
            view.setExposedContextBeanNames(exposedContextBeanNames);
        }
複製代碼

模板緩存

默認 Cache = true學習

Cache = false -> 設置緩存時間ui

Spring MVC 模板渲染邏輯

Spring MVC 核心總控制器 DispatcherServlet

  • C :DispatcherServlet

  • M

    • Spring MVC(部分)

      • Model / ModelMap / ModelAndView(Model 部分)
      • @ModelAttribute
    • 模板引擎(一般)

      • 通用的方式

        • 模板上下文
          • 內建/內嵌本身工具變量
      • JSP 內置( built-in )九大變量

      • Servlet Scope 上下文(Spring @Scope

        • PageContext(page 變量)
          • 關注當前頁面
          • A forward B
            • A 變量只能 A 頁面使用,不能共享給 B
            • A t 和 B t 能夠採用同名變量,同時使用
        • Servlet Request(請求上下文) - WebApplicationContext#SCOPE_REQUEST
          • 關注當前請求
            • A forward B
              • A 請求變量能夠用於 B 頁面
        • Servlet Session(會話上下文) - WebApplicationContext#SCOPE_SESSION
          • 關注當前會話
            • A forward / redirect B
              • A 請求變量能夠用於 B 頁面
        • Servlet ServletContext(應用上下文) - WebApplicationContext#SCOPE_APPLICATION
          • 關注當前應用
            • 用戶 A 和 用戶 B 會話能夠共享
      • JSP 內置變量( JSP = Servlet )

        • out(Writer = ServletResponse#getWriter())
        • exception ( Throwable)
        • config( ServletConfig )
        • page ( Jsp Servlet 對象)
        • response(ServletResponse)
      • Thymeleaf 內置變量

        StandardExpressionObjectFactory -> 構建 IExpressionContext

        • 上下文(模型)
        • ####strings
        • #numbers
        • ...
  • V:

    • 視圖對象

      • Servlet

        • RequestDispatcher#forward
        • RequestDispatcher#include
        • HttpServletResponse#sendRedirect
      • Spring MVC

        • View
          • forward:
            • InternalResourceView
          • redirect:
            • RedirectView
      • Struts

        • Action
          • ForwardAction
          • RedirectAction
    • 視圖處理對象

      • Spring MVC

        • *.do -> DispatcherServlet -> Controller -> View -> ViewResolver -> View#render -> HTML -> HttpServletResponse

          • Thymeleaf

            • ViewResolver -> ThymeleafViewResolver
            • View -> ThymeleafView
            • 經過模板名稱解析模板資源(ClassPathResource
              • TemplateResolution
            • 讀取資源,而且渲染內容 HTML
              • IEngineContext
              • ProcessorTemplateHandler
            • HTML 內容輸出到 Response
            • 源碼路徑
              • org.thymeleaf.TemplateEngine#process(org.thymeleaf.TemplateSpec, org.thymeleaf.context.IContext, java.io.Writer)
              • org.thymeleaf.engine.TemplateManager#parseAndProcess
          • JSP

            <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
                <property name="prefix" value="/WEB-INF/jsp/"/>
                <property name="suffix" value=".jsp"/>
            </bean>
            複製代碼
            • ViewResolver ->InternalResourceViewResolver
            • View -> JstlView
              • Foward -> RequestDispatcher
      • Struts

        • *.do -> ActionServlet -> Action -> ForwardAction -> RequestDispatcher -> JSP(Servlet) -> HTML -> HttpServletResponse

學習技巧

學會配置代碼

假設須要瞭解的技術是 thymeleaf -> thymeleaf Properties -> ThymeleafProperties

第一步:找到 @ConfigurationProperties,確認前綴

@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
    
}
複製代碼

好比:「spring.thymeleaf」

第二步:進一步確認,是否字段和屬性名一一對應

spring.thymeleaf.cache
spring.thymeleaf.mode=HTML
複製代碼
@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
    ...
	private boolean cache = true;
    ...
    private String mode = "HTML";
    ...
}
複製代碼

MessageSource + Properties = MessageSourceProperties

配置項前綴 - spring.messages

學會打斷點

DispatcherServlet#doDispatch -> 攔截請求

Controller -> 執行業務,而且控制視圖

DispatcherServlet#resolveViewName -> 視圖解析

DispatcherServlet#render -> 視圖渲染

國際化

Locale

Spring MVC

  • Locale
    • Servlet
      • ServletRequest#getLocale()
        • Accept-Language: en,zh;q=0.9,zh-TW;q=0.8
    • LocaleContextHolder
      • 來自於
        • DispatcherServlet
          • FrameworkServlet#initContextHolders
      • 存儲是ThreadLocal

Spring Boot

  • MessageSource

    • MessageSourceAutoConfiguration
      • MessageSourceProperties
        • message.properties
        • message_en.properties
        • message_zh.properties
        • message_zh_CN.properties
        • message_zh_TW.properties
  • Thymeleaf

    • #key => messageSource.get

問答環節

ask.gupaoedu.com/questions

JSP 爲何 Spring 拋棄

  • Java EE 和 Spring 競爭關係的

  • Spring 想獨立門戶

    • WebFlux
      • Servlet 3.1
      • Reactor +Netty
    • @Controller@RequestParam
      • Spring Web MVC
      • Spring WebFlux
      • 再也不看到 Servlet API
        • ServletRequest
        • ServletResponse

JSP -> JSP 模板 -> 翻譯 Servlet Java 源文件 -> 編譯 Servlet Class -> Servlet 加載 -> Servlet 執行(字節碼執行)

Thymeleaf -> Thymeleaf 模板 -> 解釋執行模板表達式(動態運行時)

相關文章
相關標籤/搜索