任务目标
设计一个 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))
效果如下: