需求
簡單實現一臺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)
- 響應正文(與響應頭有一個空行)