一、开启一个网络服务
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 如果输入正确的用户名密码会显示所有用户,输入错误提示用户名或密码错误