• 渲染Web视图


    Spring MVC定义了一个名为ViewResolver的接口

      public interface ViewResolver{

        View resolveViewName(String viewName, Locale locale) throws Exception;

      }

      public interface View{

        String getContentType();

        void render(Map<String, ? > model, HttpServletRequest request, HttpServletResponse response) throws Exception;

      }

    View接口的任务就是接受模型以及Servlet的request和response,并将输出结果渲染到response中。

    BeanNameViewResolver      将视图解析为Spring应用上下文中的bean,其中bean的ID与视图的名字相同

    ContentNegotiatingViewResovler   通过考虑客户端需要的内容类型来解析视图,委托给另外一个能够产生对应内容类型的视图解析器

    FreeMarketViewResovler       将视图解析为FreeMarker模板

    InternalResourceViewResolver    将视图解析为Web应用的内部资源

    JasperReportsViewResolver     将视图解析为JasperReports定义

    ResourceBundleViewResolver    将视图解析为资源bundle

    TilesViewResovler         将视图解析为Apache Tile定义,其中tile ID与视图名称相同

    UrlBasedViewResolver        直接根据视图的名称解析视图,视图的名称会匹配一个屋里视图的定义

    VelocityLayoutViewResolver     将视图解析为Velocity布局,从不同的Velocity模板中组合页面

    VelocityViewResolver         将视图解析为Velocity模板

    XmlViewResolver           将视图解析为特定XML文件中的bean定义

    XsltViewResolver         将视图解析为XSML转换后的结果

    Spring提供了两种支持JSP视图的方式:  

      InternalResourceViewResolver会将视图名解析为JSP文件。若在JSP页面使用了JSP标准标签库(JavaServer Pages Standard Tag Library, JSTL)的话,InternalResourceViewResolver能够将视图名解析为JstlView形式的JSP文件,蓉儿将JSTL本地化的资源bundle变量暴漏给JSTL格式化(formatting)和信息(message)标签。

      Spring提供了两个JSP标签库,一个用于表单到模型的绑定,另一个提供了通用的工具类特性

    InternalResourceViewResolver会在视图名上添加前缀和后缀,进而确定一个Web应用中视图资源的物理路径

    Java配置

    @Bean
    public ViewResolver viewResolver(){
      InternalResourceViewResolver resolver = new InternalResourceViewResolver();
      resolver.setPrefix("/WEB-INF/views/");
      resolver.setSuffix(".jsp");
      return resolver;        
    }

    XML配置

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views" p:suffix=".jsp" />

    解析JSTL视图

    JSTL的格式化标签需要一个Locale对象,以便于恰当地格式化地域相关的值。信息标签可以借助Spring的信息资源和Locale,从而选择适当的信息渲染到HTML中,通过解析JstlView,JSTL能够获得Locale对象以及Spring中配置的信息资源。

    Java实现

    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
        return resolver;
    }

    XML实现

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceResolver" p:prefix="/WEB-INF/views" p:suffix=".jsp" p:viewClass="org.springframework.web.servlet.view.JstlView" />

    使用Spring的JSP库

      将表单绑定到模型上

        Spring的表单绑定JSP标签库包含了14个标签。它们与原生HTML标签的区别在于它们会绑定模型中的一个对象,能够根据模型中对象的属性填充值。标签库中还包含了一个为用户展现错误的标签,它会将错误信息渲染到最终的HTML之中。

        为了使用表单绑定库,需要在JSP页面中对其进行声明:

          <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" /> (制定前缀为form)

      form:checkbox    渲染成一个HTML<input>标签,其中type属性设置为checkbox

      form:checkboxes    渲染成多个HTML<input>标签,其中type属性设置为checkbox

      form:errors      在一个HTML<span>中渲染输入域错误

      form:form      渲染成一个HMTL<form>标签,并为其内部标签暴漏绑定路径,用于数据绑定。它会通过commandName属性构建针对某个模型对象的上下文信息,在其他的表单绑定标签中,会引用这个模型对象的属性。

      form:hidden     渲染成一个HTML<input>标签,其中type属性设置为hidden

      form:input       渲染成一个HTML<input>标签,其中type属性为text

      form:label      渲染成一个HTML<label>标签

      form:options      渲染成一个HTML<option>标签,其selected属性根据所绑定的值设置

      form:password    渲染成一个HTML<input>标签,其type属性设置为password

      form:radiobutton   渲染成一个HTML<radiobutton>标签,其type属性设置为radio

      form:radiobuttons   渲染成一个HTML<radiobuttons>标签,其type属性设置为radio

      form:select       渲染成一个HTML<select>标签

      form:textarea     渲染成一个HTML<textarea>标签

    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
    <form:form method="POST" commandName="spitter">
        First Name : <form:input path="firstName" /><br />
        Last Name : <form:input path="lastName" /><br />
        Username : <form:input path="username" /><br />
        Password : <form:password path="password" /><br />
    </form>

    commandName属性设置为spitter。在模型中必须有一个key为spitter的对象,否则表单不能正常渲染。

    @RequestMapping(value="/register", method=RequestMethod.GET)
    public String showRegistrationForm(Model model){
      model.addAttribute(new Spitter());
      return "registerForm";    
    }

    Spring通用的标签库

      要使用Spring通用的标签库,必须要在页面上对其进行声明:

        <%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>

      <s:bind>        将绑定属性的状态到处到一个名为status的页面作用域属性中,与<s:path>组合使用获取绑定属性的值

      <s:escapeBody>    将标签体中的内容进行HTML和/或JavaScript转义

      <s:hasBindErrors>   根据指定模型对象是否有绑定错误,有条件渲染内容

      <s:htmlEscape>     为当前页面设置默认的HTML转义值

      <s:message>       根据给定的编码获取信息,然后要么进行渲染,要么将其设置为页面作用域,请求作用域、会话作用域或应用作用域的变量(通过var和scope属性实现)

      <s:nestedPath>      设置嵌入式的path,用于<s:bind>之中

      <s:theme>         根据给定的编码获取主题信息,然后要么进行渲染,要么将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量(通过var和scope属性实现)

      <s:transform>      使用命令对象的属性编辑器转换命令对象中不包含的属性

      <s:uri>           创建相对于上下文的URL,支持URI模板变量以及HTML/XML/JavaScript转义,可以渲染URL,也可以将其作为页面作用域、请求作用域、会话作用域或应用作用域的变量

      <s:eval>         计算负荷Spring表达式语言(Spring Expression Language, SpEL)语法的某个表达式的值,要么进行渲染,要么将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量

    使用Apache Tiles视图定义布局

       在Spring中使用Tiles,需要配置几个bean。需要一个TilesConfigurer bean,它会负责定位和加载Tile定义并协调生成Tiles。除此之外,还需要TilesViewResolver bean将逻辑视图名称解析为Tile定义。

      当配置TilesConfigurer的时候,所要设置的最重要的属性就是definitions。这个属性接受一个String类型的数组,其中每个条目都指定一个Tile定义的XML文件。

    @Bean
    public TilesConfigurer tilesConfigurer(){
        TilesConfigurer tiles = new TilesConfigurer();
        tiles.setDefinitions(new String[]{"/WEB-INF/layout/tiles.xml"});
        tiles.setCheckRefresh(true);
        return tiles;
    }

    配置TilesViewResolver

    @Bean
    public ViewResolver viewResolver(){
        return new TilesViewResolver();
    }

    定义Tiles

      Apache Tiles提供一个文档类型的定义(document type definition, DTD),用来在XML文件中指定Tile的定义。每个定义中需要包含一个<definition>元素,这个元素会有一个或多个<put-attribute>元素。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" 
        "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
    <tiles-definitions>
        
        <definition name="base" template="/WEB-INF/layout/page.jsp">
            <put-attribute name="header" value="/WEB-INF/layout/header.jsp" />
            <put-attribute name="footer" value="/WEB-INF/layout/footer.jsp" />
        </definition>
        
        <definition name="home" extends="base">
            <put-attribute name="body" value="/WEB-INF/jsp/home.jsp"/>
        </definition>
        
        <definition name="registerForm" extends="base">
            <put-attribute name="body" value="/WEB-INF/jsp/registerForm.jsp" />
        </definition>
        
        <definition name="profile" extends="base">
            <put-attribute name="body" value="/WEB-INF/jsp/profile.jsp" />
        </definition>
        
        <definition name="spittles" extends="base">
            <put-attribute name="body" value="/WEB-INF/jsp/spittles" />
        </definition>
        
        <definition name="spittle" extends="base">
            <put-attribute name="body" value="/WEB-INF/jsp/spittle" />
        </definition>
        
    </tiles-definitions>
    <%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
    <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="t" %>
    <%@ page session="false" %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Spittr</title>
    </head>
    <body>
        
        <div id="header">
            <t:insertAttribute name="header" />
        </div>
        
        <div id="content">
            <t:insertAttribute name="body" />
        </div>
        
        <div id="foot">
            <t:insertAttribute name="footer" />
        </div>
    </body>
    </html>

    使用Thymeleaf

      配置Thymeleaf视图解析器

        我们需要启动三个Thymeleaf与Spring集成的bean:

          ThymeleafViewResolver:将逻辑视图名称解析为Thymeleaf模板视图

          SpringTemplateEngine:处理模板并渲染结果

          TemplateResolver:加载Thymeleaf模板

    Java Config

    @Bean
    public ViewResolver viewResolver(SpringTemplateEngine templateEngine){
        ThymeleafViewResolver viewResolver = new TyhmeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine);
        return viewResolver;
    }
    
    @Bean
    public TemplateEngine templateEngine(ITemplateResolver templateResovler){
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResovler);
        return templateEnigine;
    }
    
    @Bean
    public ITemplateResolver templateResolver(){
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setPrefix("/WEB-INF/templates");
        templateResolver.setSuffixe(".html");
        templateResolver.setTemplateMode("HTML5");
        return templateResolver;
    }

    xml configure

    <bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver" p:templateEngine-ref="templateEngine" />
    
    <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine" p:templateResolver=ref="templateResolver" />
    
    <bean id="templateResolver" class="org.thymeleaf.template.ServletContextTemplateResolver" p:prefix="/WEB-INF/templates" p:suffix=".html" p:templateMode="HTML5" />

    ThymeleafViewResolver是Spring MVC中viewResolver的一个实现类,他会接受一个逻辑视图名称,并将其解析为视图。视图会是一个Thymeleaf模板。ThymeleafViewResolver bean中注入了一个对SpringTemplateEngine bean的引用。SpringTemplateEngine会在Spring中启动Thymeleaf引擎,用来解析模板,并基于这些模板渲染结果。TemplateResolver会最终定位和查找模板,使用了prefix和suffiex属性,前缀和后缀将会与逻辑视图名组合使用,进而定位Thymeleaf引擎。

    th:href属性的特殊之处在于它的值中可以包含Thymeleaf表达式,用来计算动态的值。它会渲染成一个标准的href属性,其中会包含在渲染时动态创建得到的值。这是Thymeleaf命名空间中很多属性的运行方式:它们对应标准的HTML属性,并且具有相同的名称,但是会渲染计算后得到的值

    th:class属性会渲染为一个class属性,它的值是根据给定的表达式计算得到的。

    th:field属性用来引用后端对象的域。通过th:field,可以达到同时设置name和value。

    th:if属性用来检查是否有校验错误。

    th:each属性将会通知Thymeleaf为每项错误都渲染一个标签。

    th:text属性会计算某个表达式并将它的值填入到内容体

    ${} 是变量表达式。*{}是选择表达式。变量表达式是基于整个SpEL上下文计算的,选择表达式是基于某个选中对象计算的

  • 相关阅读:
    windows下部署MySQL 8.0.11
    基于beego构建Restful API服务
    Go 并发
    Go语言的面向对象(OOP)
    Go基础语法纪要
    软件工程基础图式(第四章 系统设计-面向过程的系统设计)
    概率论与数理统计图式(第三章 多维随机变量)
    编译技术图式(第四章 语法分析)01文法和语法的定义
    计算机组成原理和结构图式(第三章 CPU子系统)
    Java图式(第三章 流程控制、数组)
  • 原文地址:https://www.cnblogs.com/forerver-elf/p/6407039.html
Copyright © 2020-2023  润新知