任务目标
设计一个 web 小应用,展示静态文件服务、js 请求支持、模板输出、表单处理、Filter 中间件设计等方面的能力。(不需要数据库支持)
基本要求
- 支持静态文件服务
- 支持简单 js 访问
- 提交表单,并输出一个表格
- 对 /unknown 给出开发中的提示,返回码 5xx
实现过程
-
搭建基本框架
首先按照老师给的博客上的内容建立目录与基本框架
cloudgo
|--assets
|--css
|--images
+--js
|--service
+--server.go
+--main.go
-
实现静态文件服务
实现的方法很简单,只需要在server.go文件中加入
mx.PathPrefix("/").Handler(http.FileServer(http.Dir(webRoot + "/assets/")))
同时还需要把assets文件夹下的index.html文件移除(我在建立时就没有加进去),这样在网志上输入http://localhost:8080显示如下
可以点击直接访问文件夹下的文件
-
简单js访问
在server.go文件中添加mx.HandleFunc("/js", jsHandler(formatter)).Methods("GET")
,然后编写jshandler.go文件
package service
import (
"net/http"
"github.com/unrolled/render"
)
func jsHandler(formatter *render.Render) http.HandlerFunc {
return func(w http.ResponseWriter, req *http.Request) {
formatter.JSON(w, http.StatusOK, struct {
Title string `json:"title"`
}{Title: "title"})
}
}
在浏览器上输入http://localhost:8080/js
访问
-
提交表单,显示表格
首先编写提交表单页面
<html>
<head>
<title></title>
</head>
<body>
<form action="/login" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
邮箱:<input type="text" name="email">
<input type="submit" value="登录">
</form>
</body>
</html>
这里有三个输入框,一个提交按钮,按钮点击后弹出login页面
编写login页面
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<table border="1">
<tr>
<th>username</th>
<th>password</th>
<th>email</th>
</tr>
<tr>
<td>{{.Username}}</td>
<td>{{.Password}}</td>
<td>{{.Email}}</td>
</tr>
</table>
</body>
</html>
然后使用模版将html文件输出到浏览器
package service
import (
"net/http"
"github.com/unrolled/render"
)
func tableinfoHandler(formatter *render.Render) http.HandlerFunc {
return func(w http.ResponseWriter, req *http.Request) {
req.ParseForm()
formatter.HTML(w, http.StatusOK, "login", struct {
Username string
Password string
Email string
}{Username: req.Form["username"][0], Password: req.Form["password"][0], Email: req.Form["email"][0]})
}
}
在server.go中添加mx.HandleFunc("/login",tableinfoHandler(formatter))
实现结果如下:
-
对/unknown页面的处理
编写unknown.go文件使用模版输出信息到浏览器上
package service
import (
"net/http"
"github.com/unrolled/render"
)
func UnknownHandler(formatter *render.Render) http.HandlerFunc {
return func(w http.ResponseWriter, req *http.Request) {
formatter.JSON(w, http.StatusNotImplemented, "5xx error")
}
}
然后在server.go文件中添加mx.HandleFunc("/unknown", UnknownHandler(formatter))
效果如下:
项目地址