Go Web開發之Revel - 網頁請求處理流程


我們之前已經已經創建了myapp的應用,現在我們來看看revel是如何處理一個瀏覽器訪問http://localhost:9000的請求的。

Routes(路由)

首先revel會檢查conf/routes文件,這個文件包含一個路由,如下:

GET     /                                       Application.Index

這個路由信息告訴revel當訪問 / 路徑是應該調用Application Controller的Index方法

 Actions(行為)

下面我們我們來看一下Controll中的Action,所在路徑為app/controllers/app.go

package controllers

import "github.com/robfig/revel"

type Application struct {
    *rev.Controller
}

func (c Application) Index() rev.Result {
    return c.Render()
}

所有的controller必須struct類型的同時里面嵌入rev.Controller 或 *rev.Controller,在Controller中任何Action的返回值都是rev.Result,revel Controller提供了很多有用的方法來生成Result,在上面的代碼中它調用了Render方法來生成Result,這個方法告訴Revel查找和渲染一個模板來作為輸出結果。

Templates(模板)

全部的模板都存放在app/views目錄下,當一個模板的名字沒有被顯式聲明的時候,revel會查找匹配action的名字,按照上面的代碼revel會找到app/views/Application/Index.html這個文件同時把它作為一個Go模板render輸出。

{{set . "title" "Home"}}
{{template "header.html" .}}

<h1>Your Application Is Ready</h1>

{{template "footer.html" .}}

上面的函數是有Go模板提供的,Revel也添加了一些自己輔助方法。

這個模板的意思如下

1.為render的上下文添加一個title變量
2.包含header.html模板文件
3.顯示歡迎信息
4.包含footer.html

如果你看一下header.html文件,你會發現更多的模板標簽

<!DOCTYPE html>
<html>
  <head>
    <title>{{.title}}</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel="stylesheet" type="text/css" media="screen" href="/public/stylesheets/main.css">
    <link rel="shortcut icon" type="image/png" href="/public/images/favicon.png">
    <script src="/public/javascripts/jquery-1.5.2.min.js" type="text/javascript" charset="utf-8"></script>
    {{range .moreStyles}}
      <link rel="stylesheet" type="text/css" href="/public/{{.}}">
    {{end}}
    {{range .moreScripts}}
      <script src="/public/{{.}}" type="text/javascript" charset="utf-8"></script>
    {{end}}
  </head>
  <body>

你可以看到里面有用到之前定義title,還可以通過調用模板方法包含更多的JS和CSS文件,主要是通過moreStylesmoreScripts這兩個變量添加進去的。

Hot-reload(熱重載)

Revel支持熱重載,真是開發的福音啊,修改一下Index.html是一下,把“Your Application Is Ready”改成“Hello World”試一下,然后刷新你的瀏覽器,你應該可以立即看到變化,Revel已經知道了你的修改並重新加載了它。

Revel會監視如下內容(Revel通過另一個開源項目(fsnotify)實現的文件監控,都是同一個作者開發的)

  • app目錄下面的所有代碼
  • app/views下面的全部模板文件
  • conf/routes下面的路由

改變任何上面所監控的文件Revel都會用最新代碼更新你的應用,現在試試改變一下app/controllers/app.go

return c.Render()

改成

return c.Renderx()

刷新頁面將會產生一個錯誤提示信息

最后我們來試試給模板傳遞一些參數

return c.Renderx()

改為

greeting := "Aloha World"
return c.Render(greeting)

修改一下模板文件app/views/Application/Index.html

<h1>Hello World</h1>

改為

<h1>{{.greeting}}</h1>

刷新瀏覽器將看到如下所示表示修改成功。

至此結束。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM