JavaSEDemo34网络通讯 常用工具与设计模式

简介

  • 本文是2021/05/07整理的笔记
  • 赘述可能有点多,还请各位朋友耐心阅读
  • 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进

总结

在JDK中可以通过几种形式实现HTTP通讯?

在JDK中可以通过HttpURLConnection完成HTTP通讯,也可以直接通过Socket模拟完成HTTP的客户端和服务器端应用

HTTP服务器中线程池有什么重要性?

HTTP请求的生命周期很短,因此对其数据进行维护的线程生命周期也很短,在一个较短的时间段内也会存在大量的请求,如果每次都创建新的线程,则会存在大量的线程申请和释放的操作,消耗性能,因此HTTP服务器均需要创建适当的线程池来保证性能。

实现HTTP通讯

        URL url = new URL("http://127.0.0.1:9999");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        //响应状态码
        int responseCode = connection.getResponseCode();
        if(responseCode == HttpURLConnection.HTTP_OK){
            System.out.println("OK...");
        }

Http协议

请求报文

请求行:GET/HTTP/版本号 \r\n
请求头:
空行:
请求体:

响应报文

状态行:协议/版本号 状态 状态描述信息\r\n 例如:HTTP/1.1 200 OK\r\n
响应头
空行
响应体

线程池

特点:

  1. 效率高
  2. 可重用性好
  3. 节省资源

什么是XML

Extensible MarkUp Language 可扩展的标记语言

XML特点

1.传输数据
2.标签需要自定义
3.不依赖于语言平台
4.W3C 的推荐标准

合法的形式良好的 XML 的特点

1.必须有一个根元素
2.节点元素必须有关闭标签
3.标签大小写敏感
4.元素必须被正确的嵌套
5.属性值必须加引号

Dom 和 SAX 区别

DOM:DocumentObjectModel,文档对象模型,将整个文档加载进内存并分析整颗
树的数据结构,根据节点元素之间的父子关系完成整棵树上所有节点的遍历
•优势:符合 XML 树的数据结构逻辑定义,可以对树结构进行修改
•劣势:需要完整加载文档,对于 LDAP 领域等能够产生超大型 XML 文档的环
境明显不适用
SAX:•SimpleAPIforXML,针对 XML 文档的事件驱动解析引擎,逐行对文档进行分析,
遇到文档的特定组成部分后回调预先定义的事件回调
•优势:无需预先完整加载文档,不会对程序的运行时内存造成毁灭性影响
•劣势:不符合 XML 文档的本质数据结构,只能用来解析遍历,而不能修改

DOM 解析 XML

思路:
1.DocumentBuilderFactory.newInstance().newDocumentBuilder()返回 documentBuilder 实例
2.使用 documentBuilder 实例.parse(Inputstream)返回 Document 对象
3.使用 Document 对象.getDocumentElement()返回 Node
4.调用 Node.getChildNodes()返回 NodeList
5.遍历 NodeList

for (int i = 0; i < childNodes.getLength(); i++) {Node item = childNodes.item(i);
NodeList childNodes2 = item.getChildNodes();
//遍历
for (int j = 0; j < childNodes2.getLength(); j++) {
Node item2 = childNodes2.item(j);
if (item2!=null && item2.getNodeType()==Node.TEXT_NODE) {
System.out.println(item.getNodeName()+":"+item2.getNodeValue());
}
}
}

SAX 解析 XML

边加载边解析,不占太多的内存.一般用来解析 XML,不适合修改 XML. 思路:
1.创建 SaxParser 对象
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
2.得到 xmlReader 对象
XMLReader xmlReader = saxParser.getXMLReader();
3.设置 ContentHandler
xmlReader.setContentHandler(contentHandler)
contentHandler 的 3 个方法

/* 当解析器遇到开始元素回调执行 startElement 方法
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes atts)
throws SAXException {
System.out.println("TestSax.startElement([uri, localName, qName, atts])方法
"+qName);
builder=new StringBuilder();
}
@Override
public void endElement(String uri, String localName, String qName) throws
SAXException {
System.out.println("endElement:"+qName);
if (qName.equals("note")){
System.out.println("解析结束:"+qName+":"+builder);
}
}
/*将节点的文本内容放到字符数组 char[]中,从 start 开始,长度是 length
*/
@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch, start, length);
builder.append(content);
System.out.println("characters:"+content);
}

5.解析
xmlReader.parse(new InputSource(new FileInputStream(“Note.xml”)))

Gson使用总结

Gson 使用总结
Gson 对 json 的处理流程是什么?
创建 Gson 对象
对象->json 字符串:gson.toJson(对象)
Json 字符串->对象:gson.fromJson(json,类类型)
集合的类类型使用 TypeToken: new TypeToken(集合类型含泛型)(){}.getType()

设计模式总结

1.什么是设计模式

设计模式是一套代码经验的总结. 2.设计模式的分类可以分为哪 3 大类,说出常见的设计模式
创建型模式
工厂方法模式
抽象工厂模式
单例模式
建造者模式
原型模式
结构型模式
适配器
装配器
代理
外观
桥接
组合
享元模式
行为型模式
策略
模板
观察者

2.设计模式的 6 大原则

开闭原则:对扩展开发,对修改关闭
里氏代换:基类出现的地方=子类一定可以出现
依赖倒转:面向接口编程
接口隔离:解耦
迪米特最少知道:一个实体最少与其他实体发生相互作用合成复用:尽量使用合成/聚合,尽量不使用继承

3.什么是单例模式

在整个应用中某个类只有一个该类的实例叫做单例模式. 5.单例模式的特点
只能有一个实例
必须自己创建自己的一个实例
对外提供访问实例的公有方法

4.单例模式的分类

饿汉单例模式(类加载时创建实例,类加载速度慢,读对象的速度快)
懒汉单例模式(类加载时不创建实例)

1.饿汉式单例模式

1.private static Singleton instance=new Singleton();
2.private Singleton(){}
3.public static Singleton getInstance(){return instance;}

2.懒汉式

1.private static Singleton instance;
2.private Singleton(){}
3.public static Singleton getInstance(){
if()instancenull){
instance
new Singleton();
}
return instance;
}

3.同步方法

1.private static Singleton instance;
2.private Singleton(){}
3.public synchronized static Singleton getInstance(){
if()instancenull){
instance
new Singleton();
}
return instance;
}

4.同步代码块,双重空验证

1.private static Singleton instance;
2.private Singleton(){}
3.public static Singleton getInstance(){
if(instancenull){
synchronized(Singleton.class){
if(instance
null){
instance==new Singleton();
}
}
}return instance;
}

5.静态内部类

public class Singleton3 {
1.private static class SingletonHolder{
private static Singleton3 instance=new Singleton3();
}
//构造方法私有化
2.private Singleton3(){}
//公开的方法
3.public static Singleton3 getInstance(){
return SingletonHolder.instance;
}
}

6.枚举类

public enum SingletonBanana {
1.INSTANCE;
2.private Banana banana;
3.SingletonBanana() {
this.banana = new Banana();
}
4.public Banana getBanana() {
return banana;
}
}
public static void main(String[] args) {
for (int i = 0; i < 2000; i++) {
new Thread(){
@Override
public void run() {
Banana banana = SingletonBanana.INSTANCE.getBanana();
// System.out.println(banana);
}
}.start();
}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香鱼嫩虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值