|
|
@@ -118,7 +118,7 @@ func load(title string) (*Page, error) {
|
|
|
|
|
|
让我们来通读代码:
|
|
|
|
|
|
-- 首先导入必要的包。由于我们在构建网页服务器,`http` 当然是必须的。不过还导入了 `io/ioutil` 来方便地读写文件,`regexp` 用于验证输入标题,以及 `tremplate` 来动态创建 html 文档。
|
|
|
+- 首先导入必要的包。由于我们在构建网页服务器,`http` 当然是必须的。不过还导入了 `io/ioutil` 来方便地读写文件,`regexp` 用于验证输入标题,以及 `template` 来动态创建 html 文档。
|
|
|
- 为避免黑客构造特殊输入攻击服务器,我们用如下正则表达式检查用户在浏览器上输入的 URL(同时也是 wiki 页面标题):
|
|
|
```go
|
|
|
var titleValidator = regexp.MustCompile("^[a-zA-Z0-9]+$")
|
|
|
@@ -146,7 +146,7 @@ func load(title string) (*Page, error) {
|
|
|
它基于模板执行,用 `Page` 结构体对象 p 作为参数对模板进行替换,并写入 `ResponseWriter` 对象 w。必须检查该方法的 error 返回值,万一有一个或多个错误,我们可以调用 `http.Error` 来明示。在我们的应用程序中,这段代码会被多次调用,所以把它提取为单独的函数 `renderTemplate`。
|
|
|
- 在 `main()` 中网页服务器用 `ListenAndServe` 启动并监听 8080 端口。但正如 [15.2节](15.2.md) 那样,需要先为紧接在 URL `localhost:8080/` 之后, 以`view`, `edit` 或 `save` 开头的 url 路径定义一些处理函数。在大多数网页服务器应用程序中,这形成了一系列 URL 路径到处理函数的映射,类似于 Ruby 和 Rails,Django 或 ASP.NET MVC 这样的 MVC 框架中的路由表。请求的 URL 与这些路径尝试匹配,较长的路径被优先匹配。如不与任何路径匹配,则调用 / 的处理程序。
|
|
|
|
|
|
- 在此定义了 3 个处理函数,由于包含重复的启动代码,我们将其提取到单独的 `markHandler` 函数中。这是一个值得研究的特殊高阶函数:其参数是一个函数,返回一个新的闭包函数:
|
|
|
+ 在此定义了 3 个处理函数,由于包含重复的启动代码,我们将其提取到单独的 `makeHandler` 函数中。这是一个值得研究的特殊高阶函数:其参数是一个函数,返回一个新的闭包函数:
|
|
|
```go
|
|
|
func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc {
|
|
|
return func(w http.ResponseWriter, r *http.Request) {
|