天天看点

手写webserve——概念

需求

简单实现一台web服务器:

客户请求——服务器响应(请求响应式)

概念

九大概念

  • oop(面向对象)
  • 容器
  • IO
  • 多线程
  • 网络编程
  • xml解析
  • 反射
  • HTML
  • http协议

反射

概念: 反射Reflection:把java类中的各种结构(方法,属性,构造器,类名)映射成一个个的对象。

注: jvm在编译的时候会创建类的模子,用模子来new一个对象,放射就是让我们来创建类的模子

作用: 利用反射技术可以对一个类进行解剖。

获取Class的三种方式:

  • 1,对象.getClass();
  • 2,类.class;
  • 3,Class.forName(“包名.类名”);//完整路径

Class的用途:

  • 动态地创建对象

等等。。。

xml解析

  • XML: Extensible Markup Language,可扩展标记语言,作为数据的一种存储格式或用于存储软件的参数,程序解析此配置文件就可以达到不修改代码就更改程序的目的。
  • SAX解析:

    1,获取解析工厂

    2,从解析工厂获取解析器

    3,编写处理器

    4,加载文档Document注册处理器

    5,解析

  • 解析过程

    1,SAX解析xml文件是以流的形式,类似于用递归的形式,从最外面的标签解析到最里面的标签,再解析出去

    2,SAX解析重写五个方法,startDocument()/startElement()/characters()/endElement()/endDocument(),分别对应着**“开始解析文档”/“开始解析qName标签”/“获得标签内的内容”/结束解析qName标签“/”结束解析文档“**

    3,解析xml文档时要注意,本来标签与标签之间是不能有换行和空格的,但是为了清楚好看,给加了空格,这就导致characters()方法会得到标签之间的空格,所以要加入tag标记当前是否在同一个标签的头标签和尾标签之间。

    p.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<persons>
	<person>
		<name>至尊宝</name>
		<age>9000</age>
	</person>
</persons>
           
public class XML {
	public static void main(String[] args) throws Exception {
		//1,获取解析工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//2,从解析工厂获取解析器
		SAXParser parser = factory.newSAXParser();
		//3,编写处理器
		//4,加载文档Document注册处理器
		PHandler handler = new PHandler();
		//5,解析
		parser.parse(Thread.currentThread().getContextClassLoader()
				.getResourceAsStream("serve/p.xml")
				,handler);
		for(Person p : handler.person) {
			System.out.println(p.getName() + ":" + p.getAge());
		}
	}
}
class PHandler extends DefaultHandler{
	public List<Person> person;//xml文件里所有perosn放在一个容器内
	private Person pp;//xml文件里每一个person
	private String tag;//存储操作的标签
	@Override
	public void startDocument() throws SAXException {
		person = new ArrayList<Person>();
	}
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.println(qName + "--->解析开始");
		if(qName != null) {
			tag = qName;
			if(qName.equals("person")) {
				pp = new Person();
			}
		}
	}
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		String msg = new String(ch,start,length).trim();
		if(msg.length() > 0) {
			if(tag.equals("name"))
				pp.setName(msg);
			else if(tag.equals("age"))
				pp.setAge(Integer.valueOf(msg));
		}
	}
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		System.out.println(qName + "--->解析结束");
		if(qName.equals("person")) {
			person.add(pp);
		}
		tag = "";
	}
	@Override
	public void endDocument() throws SAXException {
		System.out.println("---------解析文档结束------------");
	}
}

           

HTML

HyperText Markup Language :超文本标记语言,简单理解为浏览器使用的语言。

是一个网页的骨架

固定结构

<html>----开始标签
<head>----网页上的控制信息
<title>页面标题</title>
</head>
<body>页面显示内容</body>
</html>----结束标签
           

表单的使用:

<form method = "post" action="http://localhost:8888/index.html">
	用户名:<input type="text" name="uname" id="uname"/>
	密码:<input type="password" name="pwd" id="pwd"/>
	<input type="submit" value="登录"/>
           
  • post:一般用来提交数据,基于https 量大 请求参数url不可见 安全
  • get:默认,一般用来获取数据 量小 请求参数url可见 不安全
  • action: 请求web服务器资源
  • name:后端使用,区分唯一: 请求服务器必须存在,否则数据不能提交
  • id:前端使用,区分唯一

HTTP协议

超文本传输协议(HTTP,Hyper Text Transfer Protocol)是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。

HTTP协议底层用的TCP/IP协议

请求协议

  • 请求行:方法(GET/POST),URI,协议/版本(POST的URI和协议在最后,且与请求正文有空行)
  • 请求头:(Request Header)
  • 请求正文

响应协议

  • 状态行:协议/版本,状态码,状态描述(2xx:连接成功/4xx:客户端问题
  • 响应头:(Response Header)
  • 响应正文(与响应头有一个空行)