返回介绍

6.2 使用 Groovy Server Pages 定义视图

发布于 2025-04-21 21:10:09 字数 3356 浏览 0 评论 0 收藏

到目前为止,我们都在用 Thymeleaf 模板定义阅读列表应用程序的视图。除了 Thymeleaf,Spring Boot 还支持 Freemarker、Velocity 和基于 Groovy 的模板。无论选择哪种模板,你要做的就是添加合适的起步依赖,在 Classpath 根部的 templates/目录里编写模板。自动配置会处理剩下的事情。

Grails 项目也提供 GSP 的自动配置。如果你想在 Spring Boot 应用程序里使用 GSP,必须向项目里添加 Spring Boot 的 GSP 库:

compile("org.grails:grails-gsp-spring-boot:1.0.0")

和 Spring Boot 提供的其他视图模板一样,库放在 Classpath 里就会触发自动配置,设置所需的视图解析器,以便在 Spring MVC 的视图层里使用 GSP。

剩下的就是为应用程序编写 GSP 模板了。在阅读列表应用程序中,我们要把 Thymeleaf 的 readingList.html 文件用 GSP 的形式重写,放在 readingList.gsp 文件(位于 src/main/resources/ templates)里。代码清单 6-5 就是新的 GSP 模板的代码。

代码清单 6-5 GSP 编写的阅读列表应用程序主视图

<!DOCTYPE html>
<html>
  <head>
    <title>Reading List</title>
    <link rel="stylesheet" href="/style.css"></link>
  </head>

  <body>
    <h2>Your Reading List</h2>

    <g:if test="${books}">
    <g:each in="${books}" var="book">      ←---罗列图书
      <dl>
        <dt class="bookHeadline">
          ${book.title} by ${book.author}
          (ISBN: ${book.isbn}")
        </dt>
        <dd class="bookDescription">
          <g:if test="book.description">
            ${book.description}
          </g:if>
          <g:else>
            No description available
          </g:else>
        </dd>
      </dl>
    </g:each>
    </g:if>
    <g:else>
      <p>You have no books in your book list</p>
    </g:else>

    <hr/>

    <h3>Add a book</h3>

    <form method="POST">         ←---图书表单
      <label for="title">Title:</label>
      <input type="text" name="title"
                         value="${book?.title}"/><br/>
      <label for="author">Author:</label>
      <input type="text" name="author"
                         value="${book?.author}"/><br/>
      <label for="isbn">ISBN:</label>
      <input type="text" name="isbn"
                         value="${book?.isbn}"/><br/>
      <label for="description">Description:</label><br/>
      <textarea name="description" rows="5" cols="80">
        ${book?.description}
      </textarea>
      <input type="hidden" name="${_csrf.parameterName}"    ←---CSRF 令牌
           value="${_csrf.token}" />
      <input type="submit" value="Add Book" />
    </form>

  </body>
</html>

如你所见,GSP 模板中使用了表达式语言引用(用 ${} 包围的部分)以及 GSP 标签库(例如 <g:if><g:each> )。这并不是 Thymeleaf 那样的纯 HTML。但如果习惯用 JSP,你会很熟悉这种方式,而且会觉得这是一个不错的选择。

代码里的绝大部分内容和第 2 章、第 3 章的 Thymeleaf 模板类似,映射 GSP 模板上的元素。但是有一点要注意,你必须要放一个隐藏域,其中包含 CSRF(Cross-Site Request Forgery)令牌。Spring Security 在提交 POST 请求时要求带有这个令牌,Thymeleaf 在呈现 HTML 时会自动包含这个令牌,但在 GSP 里你必须在隐藏域显式地包含它。

图 6-1 是 GSP 模板的显示效果,其中添加了一些图书。

{%}

图 6-1 使用了 GSP 模板的阅读列表

虽然 GORM 和 GSP 这样的 Grails 特性很吸引人,让 Spring Boot 应用程序更简单,但你在这里还不能真正体验 Grails。让我们再往 Spring Boot 的花生酱里放一点 Grails 巧克力。现在让我们来看看 Grails 3 如何将两者合二为一,带来完整的 Spring Boot 和 Grails 开发体验。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。