goWeb编程

一、开启一个网络服务

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 如果输入正确的用户名密码会显示所有用户,输入错误提示用户名或密码错误

感谢韩晓东(老韩)指导

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦