1
0
mirror of https://github.com/astaxie/beego.git synced 2024-11-25 19:00:55 +00:00
This commit is contained in:
xiemengjun 2012-03-26 23:18:16 +08:00
parent 3e8871370a
commit 446daaea37
7 changed files with 313 additions and 3 deletions

View File

@ -1,7 +1,27 @@
package beego package beego
import "fmt" import "./core"
func main(){ type C struct {
fmt.Printf("hello world") core.Content
}
type M struct{
core.Model
}
type D struct{
core.Config
}
type U struct{
core.URL
}
type A struct{
core.Controller
}
type V struct{
core.View
} }

View File

@ -0,0 +1,19 @@
package beego
// Interface for controller types that handle requests
type Controller interface {
// When implemented, handles the request
HandleRequest(c *Context)
}
// The ControllerFunc type is an adapter to allow the use of
// ordinary functions as goweb handlers. If f is a function
// with the appropriate signature, ControllerFunc(f) is a
// Controller object that calls f.
type ControllerFunc func(*Context)
// HandleRequest calls f(c).
func (f ControllerFunc) HandleRequest(c *Context) {
f(c)
}

View File

@ -0,0 +1,144 @@
package beego
import (
"regexp"
"strings"
)
/*
Route
*/
// Represents a single route mapping
type Route struct {
pattern string
parameterKeys ParameterKeyMap
extension string
Path string
Controller Controller
MatcherFuncs []RouteMatcherFunc
}
func (r *Route) String() string {
return "{Route:'" + r.Path + "'}"
}
// Makes a new route from the given path
func makeRouteFromPath(path string) *Route {
// get the path segments
segments := getPathSegments(path)
regexSegments := make([]string, len(segments))
// prepare the parameter key map
var paramKeys ParameterKeyMap = make(ParameterKeyMap)
var extension string
// pull out any dynamic segments
for index, _ := range segments {
if isDynamicSegment(segments[index]) {
// e.g. {id}
paramKeys[strings.Trim(segments[index], "{}")] = index
regexSegments[index] = ROUTE_REGEX_PLACEHOLDER
} else if isExtensionSegment(segments[index]) {
// e.g. .json
extension = segments[index]
// trim off the last space (we don't need it)
regexSegments = regexSegments[0 : len(regexSegments)-1]
} else {
// e.g. "groups"
regexSegments[index] = segments[index]
}
}
patternString := "/" + strings.Join(regexSegments, "/")
// return a new route
var route *Route = new(Route)
route.pattern = patternString
route.extension = extension
route.parameterKeys = paramKeys
route.Path = path
route.Controller = nil
return route
}
// Gets the parameter values for the route from the specified path
func (route *Route) getParameterValueMap(path string) ParameterValueMap {
return getParameterValueMap(route.parameterKeys, path)
}
// Checks whether a path matches a route or not
func (route *Route) DoesMatchPath(path string) bool {
match, error := regexp.MatchString(route.pattern, path)
if error == nil {
if match {
if len(route.extension) > 0 {
// make sure the extensions match too
return strings.HasSuffix(strings.ToLower(path), strings.ToLower(route.extension))
} else {
return match
}
} else {
return false
}
}
// error :-(
return false
}
// Checks whether the context for this request matches the route
func (route *Route) DoesMatchContext(c *Context) bool {
// by default, we match
var match bool = true
if len(route.MatcherFuncs) > 0 {
// there are some matcher functions, so don't automatically
// match by default - let the matchers decide
match = false
// loop through the matcher functions
for _, f := range route.MatcherFuncs {
// modify 'match' based on the result of the matcher function
switch f(c) {
case NoMatch:
match = false
case Match:
match = true
}
}
}
// return the result
return match
}

14
beego/server/server.go Normal file
View File

@ -0,0 +1,14 @@
package server
import (
"bufio"
"bytes"
"errors"
"io"
"log"
"net"
"net/url"
"runtime/debug"
"strconv"
"strings"
)

View File

@ -0,0 +1,96 @@
// Copyright 2011 Google Inc. All rights reserved.
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package guestbook
import (
"io"
"net/http"
"text/template"
"time"
"appengine"
"appengine/datastore"
"appengine/user"
)
type Greeting struct {
Author string
Content string
Date time.Time
}
func serve404(w http.ResponseWriter) {
w.WriteHeader(http.StatusNotFound)
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
io.WriteString(w, "Not Found")
}
func serveError(c appengine.Context, w http.ResponseWriter, err error) {
w.WriteHeader(http.StatusInternalServerError)
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
io.WriteString(w, "Internal Server Error")
c.Errorf("%v", err)
}
var mainPage = template.Must(template.New("guestbook").Parse(
`<html><body>
{{range .}}
{{with .Author}}<b>{{.|html}}</b>{{else}}An anonymous person{{end}}
on <em>{{.Date.Format "3:04pm, Mon 2 Jan"}}</em>
wrote <blockquote>{{.Content|html}}</blockquote>
{{end}}
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form></body></html>
`))
func handleMainPage(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" || r.URL.Path != "/" {
serve404(w)
return
}
c := appengine.NewContext(r)
q := datastore.NewQuery("Greeting").Order("-Date").Limit(10)
var gg []*Greeting
_, err := q.GetAll(c, &gg)
if err != nil {
serveError(c, w, err)
return
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
if err := mainPage.Execute(w, gg); err != nil {
c.Errorf("%v", err)
}
}
func handleSign(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
serve404(w)
return
}
c := appengine.NewContext(r)
if err := r.ParseForm(); err != nil {
serveError(c, w, err)
return
}
g := &Greeting{
Content: r.FormValue("content"),
Date: time.Now(),
}
if u := user.Current(c); u != nil {
g.Author = u.String()
}
if _, err := datastore.Put(c, datastore.NewIncompleteKey(c, "Greeting", nil), g); err != nil {
serveError(c, w, err)
return
}
http.Redirect(w, r, "/", http.StatusFound)
}
func init() {
http.HandleFunc("/", handleMainPage)
http.HandleFunc("/sign", handleSign)
}

View File

@ -0,0 +1,3 @@
application: guestbook-go
handlers:
- url: /.*

View File

@ -0,0 +1,14 @@
package helloworld
import (
"fmt"
"net/http"
)
func init() {
http.HandleFunc("/", handle)
}
func handle(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "<html><body>Hello, World! 세상아 안녕!</body></html>")
}