基础理论
软件框架分类
1.B/S:browser/server,瘦客户端
2.C/S:client/server,胖客户端
Http协议(超文本传输协议)
协议:通讯双方共同遵守的规则
Hypertext transfer protocol:超文本传输协议
为什么重要:B/S结构使用的协议:
特点:
-
基于TCP/IP协议的子协议,是应用层的传输协议;主要用于浏览器与客户端之间的通讯;ServerSocket,Socket
-
无状态,无连接的协议
-
HTTP是基于请求-》响应的模式来进行通讯的;
Request(请求)的组成部分
三部分:
-
请求行(第一行)
-
若干消息头(多行,从第二行到空白行)
-
请求体(空白行后的所有内容,也可能没有请求体)
请求包括三部分,用空格隔开
Get /seedproject/first.html Http/1.1
Get:请求方式
/seedproject/first.html:url统一资源描述符
Http/1.1:协议版本号
Respone(响应)的组成部分
三部分:
-
状态行
-
消息头
-
实体内容
状态行分为三部分,用空格隔开
HTTP/1.1:协议版本
200:状态码
ok:状态的简单说明
GET与POST
-
Get请求时使用请求行来传递数据,POST请求时使用请求体来传递数据;
-
Get传递数据时,数据长度有限制,并且明文传递(不安全)
-
Post传递数据时。数据长度无限制,安全,同时可以传递进制信息
编程来模拟Http协议的请求
Mycat
开发mycat的思路;
1.创建一个Serversocket,端口号是8080,accept;
2.获取到Socket,调用Scoket
public class MyCat {
public static void main(String[] args) throws IOException{
Map<String, String> params=new HashMap<>();
//1.create sever Socket监听http 8080端口
ServerSocket server=new ServerSocket(8080);
System.out.println("开始监听");
//2.get socket ; blocking method
Socket socket=server.accept();
//3.get InputStream and wrap
//字节流转换成字符流转换成缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//存入数组 readLine方法一次读一行
String requestLine = br.readLine();
//输出数组
System.out.println(requestLine);
//输出数组中空格前的值GET 请求行
//split方法 将一个字符串分割为子字符串,然后将结果作为字符串数组返回
String method=requestLine.split(" ")[0];
System.out.println(method);
//消息头
Map<String, String> hearder= new HashMap<String,String>();
String str=null;
while(!(str=br.readLine()).equals("")) {
System.out.println(str);
hearder.put(str.split(":")[0], str.split(":")[1]);
}
//获得请求体 equals IgnoreCase无视大小写
if("post".equalsIgnoreCase(method)) {
String sizeString=hearder.get("Content-Length");
Integer length=Integer.valueOf(sizeString.trim());
char[] body=new char[length];
System.out.println(method);
//将请求体的所有内容都读到body中;
br.read(body);
String values=new String(body);
System.out.println("请求体内容"+ new String(body));
String[] value =values.split("&");
for(String v:value ) {
params.put(v.split("=")[0],v.split("=")[1]);
}
}
//响应 字节转成字符流
BufferedWriter bwriter=new BufferedWriter (new OutputStreamWriter(socket.getOutputStream()));
//写状态
bwriter.write("HTTP/1.1 200 OK\r\n");
//写消息头
bwriter.write("Content-Type: text/html\r\n");
//空白行
bwriter.write("\r\n");
bwriter.write("<html><head><title>first html</title></head>");
bwriter.write("<body><p>hellow Word</p><a href='http://www.qq.com'>腾讯</a></body>");
bwriter.write("</html>");
bwriter.flush();
bwriter.close();
br.close();
server.close();
}
}
html 代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="http://localhost:8080/first.html" method="post">
id<input type="text" name="name" id="name"/>
密码<input type="text" name="password" id="password"/>
<input type="submit" value="添加"/>
</form>
</body>
</html>
JavaWeb环境搭建
-
web:容器tomcat
-
开发环境:Eclipse
Tomcat容器介绍
-
免费开源的web容器
-
Tomcat是Apache组织托管的一个绿色软件,直接解压即可
-
Tomcat的目录结构
-
bin:tomcat的各种命令;
-
cofn:tomcat的配置文件
-
lib:tomcat的依赖jar包
-
webapps:存储用户部署的javaweb项目
-
works:jsp的工作目录
-
配置Eclipse
window->preferences->server->runtime environments->add->tomcat
创建servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
System.out.println("这是我的第一个网页!");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("这是我的第一个网页!!");
}·