web基础知识
浏览器和服务器之间的交互:
- 交互模式是:请求-响应。
- 客户端先发出请求,服务器根据请求内容发送响应内容。客户端根据响应内容进行显示。
请求与响应的格式:
客户端发出请求的格式
- 首先服务器的地址、端口、资源地址。 请求行
- 请求头
- 请求实体
注:客户端向服务器传参,如果将参数放到请求行,即为get方式!如果将参数放到请求实体中,即为post方式!
服务器受到请求内容后发送响应内容
- 状态行(200,404,500)
- 响应头
- 响应实体
服务器如何收到请求内容?
- 建立监听。ServerSocket, s.accept()。
- 启动一个线程(轻量级的进程),为请求的客户提供服务。
- 为了封装客户端提供的请求信息,于是我定义一个对象:HttpServletRequest对象。
- 为了封装回送给客户端的响应内容,我们定义一个对象:HttpServietResponse对象。
根据请求内容调用相应的程序的过程
- 我们通过web.xml中定义的url和servlet的关系,找到相应的servlet程序。
- 于是我们定义了HttpServlet,并且增加service(HttpServletRequest req, HttpServletResponse response) 方法
- 将response对象中的信息,转译成基于http协议的响应内容。再将这些响应内容通过socket传送给客户端。
计网预备知识
协议:
1)应用层 HTTP,FTP,TELNET,SNMP,DNS
2)传输层 TCP,UDP
3)网络层 IP
HTTP协议简介:
用户打开web浏览器(常见的HTTP客服端),输入URL地址,就能接收到远程HTTP服务器端发送过来的网页.
即HTTP遵循请求(Request)/应答(Response)模型。
HTTP客户端和服务器分别由不同的软件开发商提供,它们都可以用任意的语言,他们共同遵守HTTP协议。
HTTP请求格式分析:
1)方法 URL 协议/版本 eg:POST /hello.jsp HTTP/1.1
2)请求头(Request Header)
请求头包含许多有关的客户端环境和请求正文的有用信息。eg:请求头可以什么浏览器所用的语言,请求正文的长度等
3)请求正文(Request Content)
请求头和请求正文之间必须存在CRLF(\r\n),与请求头分开。通常post方式的数据存放于此,请求正文中可以包含客户提交的查询字符串信息:
name=test&psw=12
HTTP响应格式分析:
1)HTTP协议版本、状态代码、描述
常用的状态码(应答码)
200 ok
400 Bad Request
404 Not Found
405 Method Not Allowed
2)响应头(eg:服务器类型,日期类型,正文类型,正文长度)
常见类型:
Content-type:text/html;charset=GBK
Content-type:text/plain;charset=GBK
Content-type:application/octet-stream
3)响应正文
返回的HTML页面
/*
* 服务器启动
* 1、请求
* 2、响应
*/
public class Server3 {
private ServerSocket server;
public static final String CRLF = "\r\n";
public static final String BLANK = " ";
public static void main(String[] args) {
Server3 server = new Server3();
server.start();
}
/*
如果你的电脑有多块网卡. 那么就可以指定本地IP中的一个
如果你是单网卡, 那么就无需指定
也就是说没有指定本地其他Ip的时候, 服务器会把此端口绑定到0.0.0.0上面
*/
/*
* 启动方法
*/
public void start() {
try {
server = new ServerSocket(8888);
this.receive();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 接收客户端发送的信息
*/
private void receive() {
try {
Socket client = server.accept();
byte[] data = new byte[2048];
int len = client.getInputStream().read(data);
//从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。
//接收客户端的请求信息
String requestInfo = new String(data,0,len).trim();
System.out.println(requestInfo);
//响应
StringBuilder responseContext = new StringBuilder(); //响应正文
responseContext.append("<html><head><title>HTTP响应示例</title></head><body>Hello world!</body></html>");
StringBuilder response = new StringBuilder();
//1)HTTP协议版本 状态代码 描述
response.append("HTTP/1.1").append(BLANK).append("200").append(BLANK).append("OK").append(CRLF);
//2)响应头(Response Head)
response.append("Server:bjsxt Server/0.0.1").append(CRLF);
response.append("Date:").append(new Date()).append(CRLF);
response.append("Content-type:text/html;charset=GBK").append(CRLF);
response.append("Content-Length:").append(responseContext.toString().getBytes().length).append(CRLF); //正文字节长度
//3)正文之前
response.append(CRLF);
//4)正文
response.append(responseContext);
System.out.println(responseContext);
//输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
bw.write(response.toString());
bw.flush();
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//监听,等待连接,一旦有client端连接便创建socket实例.
}
public void stop() {
}
}
==================HTML========================
method:请求方式 get/post
get: 默认方式,数据量小,安全性不高
post:量大,安全性相对高
action:请求的服务器路径
id:编号,前端区分唯一性 ,js中使用
name:名称,后端(服务器)区分唯一性 ,获取值,只要提交数据给后台,必须存在name