Grails 1.2参考文書速読(12):URL Mappings


前編まではGrailsにおけるMVCの対応を知っていたが、それだけでは足りなかった.ユーザーが要求したURLを対応するControllerのアクションにマッピングする方法に触れていないからだ.これがURL Mappingsの役割です.
実は、URL Mappingsでは、Grailsはデフォルトの方法を提供しています.これに文句がなければ、この方面の心を使わなくてもいいです.しかし、自分で他のことをしたいなら、この方面の知識を理解しなければなりません.
GrailsのURL Mappingはgrails-app/conf/UrlMappings.groovyで行われ、その内容は以下の通りです.
class UrlMappings {
    static mappings = {
       //    
    }
}
具体的なURLのマッピング構文の例は次のとおりです.
  • フルフォーマット:“/product”(controller:“product”,action:“list”)
  • デフォルトAction:「/product」(controller:「product」)
  • を使用
  • 使用閉パッケージ:
    "/product" {
            controller = "product"
            action = "list"
        }
  • URIを別のURIにマッピングし、他のフレームワークと統合する際に「/hello」(uri:「/hello.dispatch」)
  • を使用することが多い.
    マッピング構文では、$で始まる変数値がparamsに自動的に入力される変数も使用できます.これにより、対応するactionでparams.変数名でアクセスできます.
  • params.id:"/product/$id"(...).「/product/1」のように、1はidの値であり、params.idでアクセスできます.
  • 個以上の変数:「/$blog/$year/$month/$day/$id」.「/graemerocher/2007/01/10/my_funky_blog_entry」のように、blogの値はgraemerocher、yearの値は2007、monthの値は01の順に類推されます.

  • 変数を使用すると、ControllerとActionの名前を動的に構築することもできます.
  • "/$controller/$action?/$id?"()は、paramsの変数名でControllerとActionの名前を取得します.
  • 同様に、パケットを閉じることによって実現することもできる:
    "/$controller" {
           action = { params.goHere }
        }
  • URLマッピング構文ではオプションパラメータもサポートされており、ルールは簡単で、変数名の後に追加しますか?できます.前例の「$id?」のように.Javaと同様に、オプションパラメータは最後に存在する必要があります.たとえば、「/.../$変数名?/$変数名?/$変数名?」はだめですが、「/.../$変数名/$変数名?/$変数名?」は可能です.
    定義変数もURL上で行う必要はありません.また、次のように閉パッケージで定義することもできます.
    //     
    "/holiday/win" {
         id = "Marrakech"
         year = 2007
    }
    //    
    "/holiday/win" {
         id = { params.id } 
         isEligible = { session.user != null }
    }
    上記の例では、ControllerのActionにURLをマッピングする方法を示しています.Viewにもマッピングできます.
  • root urlをgrails-app/views/index.gsp:「/」(view:「/index」)
  • にマッピング
  • あるControllerのView:“/help”(controller:“site”,view:“help”)
  • にマッピング
    Http応答コードについても、単調なアプリケーションサーバに関連するエラーページではなく、より友好的なエラー情報インタフェースを表示することができます.
  • 応答コードをController:“500”(controller:“errors”,action:“serverError”)
  • にマッピングする
  • 応答コードをView:"500"(view:"/errors/serverError")
  • にマッピングする
    URLマッピングは、Restful Apiを定義する際に非常に有用なHttpをマッピングする方法もあります.
    static mappings = {
       "/product/$id"(controller:"product"){
           action = [GET:"show", PUT:"update", 
                     DELETE:"delete", POST:"save"]
       }    
    }
    Grailsでは、マッピングでワイルドカードを使用することもサポートされています.
  • "/images/*.jpg"(controllers:"image")
  • "/images/$name.jpg"(controllers:"image")では、効果は同じで、変数名が使用されているのとは異なります.
  • はまた、**を使用してマルチレベルディレクトリ:「/images/**.jpg」(controllers:「image」)
  • をマッピングすることもできます.
  • のより良い方法は、params.nameに一致するパスが格納される「/images/$name**.jpg」(controllers:「image」)です.

  • マッピングでは、どのURLがマッピングに参加しないかを指定することもできます.UrlMappings.groovyでexcludesで定義すればいいです.
    class UrlMappings = {
        static excludes = ["/images/**", "/css/**"]
        static mappings = {
            ...
        }
    }
    GrailsのURLマッピングでは、リンクの自動書き換えもサポートされています.マッピングの場合:"/$blog/$year?/$month?/$day?/$id?(controller:"blog",action:"show")、以下のリンク:
  • My Blog
  • My Blog - October 2007 Posts

  • 結果:
  • My Blog
  • My Blog - October 2007 Posts

  • URLの直接使用を回避し、リンクの定義と使用をより柔軟にします.
    前の記事ではcontraintsのメリットを理解しています.URLマッピングでは、URLの有効性を検証するために同様に使用できます.
    "/$blog/$year?/$month?/$day?/$id?" {
         controller = "blog"
         action = "show"
         constraints {
              year(matches:/d{4}/)
              month(matches:/d{2}/)
              day(matches:/d{2}/)
         }
    }
    結果:
  • 有効:/graemerocher/2007/01/10 my_funky_ブログentry
  • 無効:/graemerocher/2007/01/101/my_funky_ブログentry

  • マッピングの場合、名前を付けることもできます.これが名前マッピングの由来です.構文:name:{...}例は次のとおりです.
    static mappings = {
        name personList: "/showPeople" {
            controller = 'person'
            action = 'list'
        }
        name accountDetails: "/details/$acctNumber" {
            controller = 'product'
            action = 'accountDetails'
        }
    }
    名前を参照するには、次の操作を行います.
  • List People
  • Show Account

  • を使用することもできますが、上記の例では次のようになります.
  • List People
  • Show Account