Board logo

标题: 精通 Grails 了解插件(3) [打印本页]

作者: look_w    时间: 2018-8-8 10:25     标题: 精通 Grails 了解插件(3)

对 Searchable 插件的探讨知道了 Searchable 插件安装的位置(.grails/1.1.1/projects/blogito/plugins/searchable-0.5.5)后,我们就可以对它进行探讨了。这个目录结构(如图 3 所示)应该看上去有点眼熟 — 插件和应用程序共享同样的基础布局:
图 3. 目录结构SearchableController 恰恰处于我们想要的位置:grails-app/controllers。在一个文件编辑器中打开这个文件。清单 10 显示了部分源代码:
清单 10. SearchableController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import org.compass.core.engine.SearchEngineQueryParseException
class SearchableController {
  def searchableService

  def index = {
    if (!params.q?.trim()) {
      return [:]
    }
    try {
      return [searchResult: searchableService.search(params.q, params)]
    } catch (SearchEngineQueryParseException ex) {
      return [parseException: true]
    }
  }

  //snip
}




如您所见,SearchableService 在类被声明后被注入到此控制器。这个熟悉的 index 动作就是默认的目标。如果没有传递进 q 参数,就会将一个空的 hashmap 返回给 grails-app/views/searchable/index.gsp。基于视图中的逻辑,它将显示一个空白页。
在 index.gsp 的第 100 行左右的位置,应该能够找到一个表单,它可设置 q 参数及递归地将自身提交回 index 动作。清单 11 显示了这个表单:
清单 11. index.gsp 中的 searchable 表单
1
2
3
4
5
6
7
<g:form url='[controller: "searchable", action: "index"]'
        id="searchableForm"
        name="searchableForm"
        method="get">
  <g:textField name="q" value="${params.q}" size="50"/>
  <input type="submit" value="Search" />
</g:form>




回过头,再看看 ,可以发现一旦 q 参数内有了一个搜索条件,searchableService.search() 调用的结果就会被返回给 index.gsp。在 index.gsp 中的第 150 行左右,会显示这些结果,如清单 12 所示:
清单 12. 显示搜索结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<g:if test="${haveResults}">
  <div class="results">
    <g:each var="result" in="${searchResult.results}" status="index">
      <div class="result">
        <g:set var="className" value="${ClassUtils.getShortName(result.getClass())}" />
        <g:set var="link"
               value="${createLink(controller: className[0].toLowerCase() +
                 className[1..-1],
               action: 'show',
               id: result.id)}" />
        <div class="name"><a href="${link}">${className} #${result.id}</a></div>
        <g:set var="desc" value="${result.toString()}" />
        <g:if test="${desc.size() > 120}">
          <g:set var="desc" value="${desc[0..120] + '...'}" />
        </g:if>
        <div class="desc">${desc.encodeAsHTML()}</div>
        <div class="displayLink">${link}</div>
      </div>
    </g:each>
  </div>

  <!-- snip -->
</g:if>




我鼓励您更深入地去探索 Searchable 插件的奥秘。请见 grails-app/services/SearchableService.groovy。注意到 lib 目录中已经包含了 Lucene 和 Compass 的 JAR 文件。到 src/java 和 src/groovy 目录去看看所有支持的类。再回顾一下 tests 目录中的 GroovyTestCase。一个典型 Grails 应用程序的所有部分都在这个插件里。
每当安装一个新插件,都要留意一下它的实现。这将有助于您识别所有可移动部分、了解它们是如何组合起来发挥作用的,并且 — 最重要的是 — 给您启示,教您如何能更好地将它们融入到您的应用程序中。接下来的一节,您将看到如何将搜索功能从默认实现转到您自已的定制组件中。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0