一、开启一个网络服务
go语言本身就对网络进行了封装,所以开启一个网络服务非常容易
1、 设置监听端口
http.ListenAndServe(“:9000”, nil)
:9000监听的端口handler:一般传nil
2、设置访问路由
http.HandleFunc(“/”, Hello) 指定访问
localhost:9000时调用Hello函数
新建main.go
package main
import (
	"net/http"
	"log"
	"io"
)
func main() {
	http.HandleFunc("/", Hello)
	//设置监听端口
	err := http.ListenAndServe(":9000", nil)
	if err != nil {
		log.Fatal("端口监听发生错误:", err)
	}
}
func Hello(w http.ResponseWriter, r *http.Request) {
	io.WriteString(w,"hello world")
}
- 运行上面的代码
 - 浏览器访问
localhost:9000 
运行正常的话,浏览器页面可以看到hello world显示
访问页面
新建temp.hmtl文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    div{
        color: red;
    }
</style>
<body>
<div > this is tempView</div>
</body>
</html>
页面显示
this is tempView字体颜色红色
打开main.go
main函数中新增temp页面路由
http.HandleFunc("/temp.html",TempView)
TempView函数
func TempView(w http.ResponseWriter,r *http.Request){
	page := filepath.Join("temp.html")
	//创建page转为一个模板实例
	result,err := template.ParseFiles(page)
	if err != nil {
		fmt.Println("创建模板实例错误:",err)
	}
	//融合模板数据
	err = result.Execute(w,nil)
	if err != nil {
		fmt.Println("融合模板数据时发生错误:",err)
	}
}
访问页面需要使用
template对象来转化,输出
打开浏览器输入http://localhost:9000/temp.html 会有红色的this is tempView显示
访问虚拟路径
main函数添加路由
访问指定页面 http.HandleFunc(“/login.html”, LoginView) 访问虚拟路径 http.HandleFunc(“/login”, Login)
LoginView函数
func LoginView(w http.ResponseWriter, r *http.Request)  {
    // 指定页面
    page := filepath.Join("login.html")
    // 创建模板实例
    templateResult, err := template.ParseFiles(page)
    if err != nil {
        fmt.Println("创建模板实例错误: ", err)
    }
    // 融合模板数据
    err = templateResult.Execute(w, nil)
    if err != nil {
        fmt.Println("融合模板数据时发生错误: ", err)
    }
}
Login函数,响应登录按钮,跳转至登录成功页面
func Login(w http.ResponseWriter,r *http.Request)  {
	// 指定页面
	page := filepath.Join( "loginSuccess.html")
	// 创建模板实例
	templateResult, err := template.ParseFiles(page)
	if err != nil {
		fmt.Println("创建模板实例错误: ", err)
	}
	// 融合模板数据
	err = templateResult.Execute(w, nil)
	if err != nil {
		fmt.Println("融合模板数据时发生错误: ", err)
	}
}
新建login.html文件
<html>
<head>
    <title>用户登录</title>
    <link href="/static/css/style.css" rel="stylesheet"/>
</head>
<body>
    <div class="login">
        <form action="/login" method="post">
            用户名:<input type="text" name="userName" value="" placeholder="请输入用户名"/><br/>
            密码: <input type="password" name="password" placeholder="请输入密码"/><br/>
            <div class="btn">
                <span><input type="submit" value="登录"/></span>
                <span><input type="reset" value="重置"/></span>
            </div>
        </form>
    </div>
</body>
</html>
action=”/login” 指定数据提交的路由,即登录按钮跳转的路由 新建
loginSuccess.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>登录成功</div>
</body>
</html>
浏览器打开 http://localhost:9000/login.html 会有登录页面显示,点击登录按钮跳转至loginSuccess页面
template模板语法
有时需要根据数据动态显示页面,这时候需要使用template语法
实现登录功能
- 假设现在数据库中有5个用户,只有用户名和密码都正确时,才可以登录成功
 - 登录成功跳转页面,显示所有用户
 - 登录失败,提示登录失败
 
1、新建domain.go
新建controller目录,在该目录下新建domain.go文件
- 声明用户结构体
 - 初始化数据
 
package controller
type Person struct {
    Pid string
    Name string
    Password string
    Age int
    Gender string
}
var Persons []Person
func init() {
//创建5个用户,数组模拟数据库存储
    p := Person{Pid:"111", Name:"jack", Password:"123456", Age:21, Gender:"m"}
    p2 := Person{Pid:"111", Name:"Jerry", Password:"123", Age:23, Gender:"m"}
    p3 := Person{Pid:"111", Name:"alice", Password:"123456", Age:26, Gender:"f"}
    p4 := Person{Pid:"111", Name:"bob", Password:"qazx", Age:29, Gender:"m"}
    p5 := Person{Pid:"111", Name:"candy", Password:"123456", Age:22, Gender:"f"}
    Persons = append(Persons, p)
    Persons = append(Persons, p2)
    Persons = append(Persons, p3)
    Persons = append(Persons, p4)
    Persons = append(Persons, p5)
}
修改Login函数
func Login(w http.ResponseWriter,r *http.Request)  {
	userName := r.FormValue("userName")
	password := r.FormValue("password")
	loginSuccess := false
	fmt.Println(userName," ====  ",password)
	for _,person := range controller.Persons {
		if person.Name == userName {
			if person.Password == password {
				loginSuccess = true
				break
			}else {
				loginSuccess = false
				break
			}
		}
	}
	//如果用户名,密码验证成功,跳转至登录成功页面
	if loginSuccess {
		// 指定页面
		page := filepath.Join( "loginSuccess.html")
		// 创建模板实例
		templateResult, err := template.ParseFiles(page)
		if err != nil {
			fmt.Println("创建模板实例错误: ", err)
		}
		//需要展示的数据
		data := &struct {
			Persons []controller.Person
		}{
			Persons:controller.Persons,
		}
		// 融合模板数据
		err = templateResult.Execute(w, data)
		if err != nil {
			fmt.Println("融合模板数据时发生错误: ", err)
		}
	}else {
		// 指定页面
		page := filepath.Join( "login.html")
		// 创建模板实例
		templateResult, err := template.ParseFiles(page)
		if err != nil {
			fmt.Println("创建模板实例错误: ", err)
		}
		//需要展示的数据
		data := &struct {
			Flag bool
		}{
			Flag: true,
		}
		// 融合模板数据
		err = templateResult.Execute(w, data)
		if err != nil {
			fmt.Println("融合模板数据时发生错误: ", err)
		}
	}
}
r.FormValue(key) 获取表单中的数据 data 页面需要动态加载的数据
修改login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="login">
    <!--template语法 获取Flag属性的值-->
    <div>用户名或密码错误</div>
    <form action="/login" method="post">
        用户名:<input type="text" name="userName" value="" placeholder="请输入用户名"/><br/>
        密码: <input type="password" name="password" placeholder="请输入密码"/><br/>
        <div class="btn">
            <span><input type="submit" value="登录"/></span>
            <span><input type="reset" value="重置"/></span>
        </div>
    </form>
</div>
</body>
</html>
修改loginSuccess.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录成功</title>
</head>
<body>
<table>
    <tr>
        <th>ID</th>
        <th>名称</th>
        <th>密码</th>
        <th>年龄</th>
        <th>性别</th>
    </tr>
    <!--遍历Persons-->
    <tr>
        <!--person.Pid-->
        <td></td>
        <!--person.Name-->
        <td></td>
        <td></td>
        <td></td>
        <td></td>
    </tr>
</table>
</body>
</html>
获取一个属性的值通过获取 判断bool值–代码– 判断字符串是否相等 遍历数组–需要循环执行的代码–
浏览器访问http://localhost:9000/login.html 如果输入正确的用户名密码会显示所有用户,输入错误提示用户名或密码错误
            
            
      
      
                
                
