十五、表单

1.处理表单的输入

新增一个login.html文件

<html>
<head>
<title></title>
</head>
<body>
<form action="http://127.0.0.1:9090/login?username=astaxie" method="post">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit" value="登陆">
</form>
</body>
</html>
 1 package main
 2 
 3 import (
 4     "fmt"
 5     "html/template"
 6     "log"
 7     "net/http"
 8     "strings"
 9 )
10 
11 //浏览器里面打开http://127.0.0.1:9090/login
12 
13 func sayhelloName(w http.ResponseWriter, r *http.Request) {
14     r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主体(request body)
15     //注意:如果没有调用ParseForm方法,下面无法获取表单的数据
16     fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
17     fmt.Println("path", r.URL.Path)
18     fmt.Println("scheme", r.URL.Scheme)
19     fmt.Println(r.Form["url_long"])
20     for k, v := range r.Form {
21         fmt.Println("key:", k)
22         fmt.Println("val:", strings.Join(v, ""))
23     }
24     fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的
25 }
26 
27 func login(w http.ResponseWriter, r *http.Request) {
28     fmt.Println("method:", r.Method) //获取请求的方法
29     if r.Method == "GET" {
30         t, _ := template.ParseFiles("login.html")
31         t.Execute(w, nil)
32     } else {
33         //请求的是登陆数据,那么执行登陆的逻辑判断
34         r.ParseForm()
35         fmt.Println("username:", r.Form["username"])
36         fmt.Println("password:", r.Form["password"])
37     }
38 }
39 
40 func main() {
41     http.HandleFunc("/", sayhelloName)       //设置访问的路由
42     http.HandleFunc("/login", login)         //设置访问的路由
43     err := http.ListenAndServe(":9090", nil) //设置监听的端口
44     if err != nil {
45         log.Fatal("ListenAndServe: ", err)
46     }
47 }

结果:

method: POST


username: [astaxie liubiao]


password: [123456]


map[]


path /favicon.ico


scheme


[]

2.验证表单的输入

2.1 必填字段

if len(r.Form["username"][0])==0{
    //为空的处理
}

复选框和单选按钮通过r.Form.Get()来获取值  

2.2 数字

if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {
    return false
}

2.3 中文

if m, _ := regexp.MatchString("^[\\x{4e00}-\\x{9fa5}]+$", r.Form.Get("realname")); !m {
    return false
}

2.4 英文

if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("engname")); !m {
    return false
}

2.5 电子邮件

if m, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})$`, r.Form.Get("email")); !m {
    fmt.Println("no")
}else{
    fmt.Println("yes")
}

2.6 手机号码

if m, _ := regexp.MatchString(`^(1[3|4|5|8][0-9]\d{4,8})$`, r.Form.Get("mobile")); !m {
    return false
}

2.7 下拉菜单

slice:=[]string{"apple","pear","banane"}

for _, v := range slice {
    if v == r.Form.Get("fruit") {
        return true
    }
}
return false

2.8 单选按钮

slice:=[]int{1,2}

for _, v := range slice {
    if v == r.Form.Get("gender") {
        return true
    }
}
return false

2.9 复选框

   操作slice和map的库),https://github.com/astaxie/beeku

slice:=[]string{"football","basketball","tennis"}
a:=Slice_diff(r.Form["interest"],slice)
if a == nil{
    return true
}

return false

2.10 日期和时间

t := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
fmt.Printf("Go launched at %s\n", t.Local())

2.11 身份证号码

//验证15位身份证,15位的是全部数字
if m, _ := regexp.MatchString(`^(\d{15})$`, r.Form.Get("usercard")); !m {
    return false
}

//验证18位身份证,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
if m, _ := regexp.MatchString(`^(\d{17})([0-9]|X)$`, r.Form.Get("usercard")); !m {
    return false
}
posted on 2013-02-25 11:51  liubiaoren  阅读(372)  评论(0)    收藏  举报