需求
简单实现一台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)
- 响应正文(与响应头有一个空行)