
main.go
package main
import (
"net/http"
"com.jtthink.net/myhttpserver/core"
)
type MyHandler struct {
}
func(*MyHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request){
writer.Write([]byte("hello,myhandler"))
}
func main() {
router:=core.DefaultRouter()
router.Add("/",&NewsController{})
http.ListenAndServe(":8099",router)
}
NewsController.go
package main
import "com.jtthink.net/myhttpserver/core"
type NewsController struct {
core.MyController
}
func(this *NewsController) GET() {
this.Ctx.WriteString("this is newscontroller")
}
func(this *NewsController) POST() {
this.Ctx.WriteString("this is newscontroller for POST")
}
MyRouter.go
package core
import (
"net/http"
)
type MyHandlerFunc func(ctx *MyContext)
type MyRouter struct {
Mapping map[string]ControllerInterface
}
func DefaultRouter() *MyRouter {
return &MyRouter{make(map[string]ControllerInterface)}
}
//加入 path 和Controller的對應關系
func(this *MyRouter) Add(path string,c ControllerInterface) {
this.Mapping[path]=c
}
func(this *MyRouter) ServeHTTP(writer http.ResponseWriter, request *http.Request){
//chrome 會預設請求圖示位址
if f,OK:=this.Mapping[request.URL.Path];OK{
f.Init(&MyContext{request,writer}) //關鍵代碼
if request.Method=="GET"{//沒有做防錯處理
f.GET()
}
if request.Method=="POST"{//沒有做防錯處理
f.POST()
}
}
}
MyController.go
package core
type MyController struct {
Ctx *MyContext
}
func(this *MyController) Init (ctx *MyContext) {
this.Ctx=ctx
}
type ControllerInterface interface {
Init(ctx *MyContext)
GET()
POST()
}
MyContext.go
package core
import "net/http"
type MyContext struct { //上下文對象
request *http.Request
http.ResponseWriter
}
func(this *MyContext) WriteString(str string){
this.Write([]byte(str))
}