手寫webserve——概念

需求

簡單實現一臺web服務器:
客戶請求——服務器響應(請求響應式)

概念

九大概念

  • oop(面向對象)
  • 容器
  • IO
  • 多線程
  • 網絡編程
  • xml解析
  • 反射
  • HTML
  • http協議

反射

概念: 反射Reflection:把java類中的各種結構(方法,屬性,構造器,類名)映射成一個個的對象。

注: jvm在編譯的時候會創建類的模子,用模子來new一個對象,放射就是讓我們來創建類的模子

作用: 利用反射技術可以對一個類進行解剖。

獲取Class的三種方式:

  • 1,對象.getClass();
  • 2,類.class;
  • 3,Class.forName(“包名.類名”);//完整路徑

Class的用途:

  • 動態地創建對象
Iphone i = (Iphone) c.getConstructor().newInstance();//通過構造器創建對象

等等。。。

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)
  • 響應正文(與響應頭有一個空行)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章