Grails面试试题:控制器篇

Tomás Lin在其博客中公布了一套面试Grails开发人员的题目,本站将陆续公布问题的答案。今天公布的是控制器部分的试题回答。

控制器篇

  • 请解释一下Grails中,Controller与Service的区别。
    • Controller属于Web层的范畴,主要作用是为View的显示做好准备工作,或是针对请求准备好响应的数据。每次请求创建新实例
    • 服务层的作用是封装复杂业务逻辑,尤其是这种逻辑涉及到多个Domain Class的时候。
  • 什么是flash对象?在Grails应用中,flash对象有替代用法么?
  • Flash对象是在会话中临时保存的map,可用于下一次请求。在下一次请求结束后,该对象会自动清除。
    可以使用chain代替flash,用法:

    chain(action:"a", model:[one:1],params:[p:"v"])
    
  • 表单中有6个朋友的名字,均使用名为‘friendName’的text输入框。在Controller中如何获得它们的list?
  • params.list(friendName)
    
  • 我想在Controller的Action中给一些请求返回XML文件,而另一些请求返回一个HTML文件。该如何做?
  • 首先在grails-app/conf/Config.groovy中,使用grails.mime.types告诉Grails需要支持哪些HTTP请求类型,这个属性缺省已经配置:

    grails.mime.types = [ 
        html: ['text/html','application/xhtml+xml'],
        xml: ['text/xml', 'application/xml'],
        text: 'text/plain',
        js: 'text/javascript',
        rss: 'application/rss+xml',
        atom: 'application/atom+xml',
        css: 'text/css',
        csv: 'text/csv',
        all: '*/*',
        json: ['application/json','text/json'],
        form: 'application/x-www-form-urlencoded',
        multipartForm: 'multipart/form-data'
    ] 
    

    在Controller中可根据HTTP请求的类型,确定返回的内容:

    import grails.converters.*
    
    class BookController { 
        def books def list = { 
           this.books = Book.list() 
           withFormat { 
              html bookList:books 
              js { render "alert('hello')" }
              xml { render books as XML } 
           } 
        } 
    }
    
  • 我想把Domain对象转换成XML。怎么样能够保证Domain对象的所有子项都完整的转换到了XML中?
  • 可以使用grails.converters.XML或者grails.converters.deep.XML。

  • Grails中的redirect()使用的是哪种重定向?如何改变?
  • 缺省情况下,redirect()方法是用的是302重定向。但是如果要修改可使用如下方法:

    redirect(action: "list")
    
    //变更为
    response.setStatus(301)
    response.setHeader("Location", "list") 
    
  • 什么是Filter?
  • 请记住:Grails Filter != JEE Filter。Grails实际上就是grails-app/conf下以Filters结尾的Groovy类。Grails的Filter同样有Filter链的概念,它本质上是由多个filter定义组成,定义顺序=执行顺序。Filter应用的范围可以是针对Controller和Action。

By huwh - Posted on 18 二月 2011