XML:可扩展的标记语言。
XML全称为Extensible Markup Language,意思是可扩展的标记语言。
W3C在1998年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是1.0版本!!!标记,就是标签。例如:
xml文件要求:
- 固定的文档声明 —
<?xml version="1.0" encoding="utf-8" ?>
- 必须<?xml 开头 , 以?>结束
- 必须用文档最前端开始
- 声明只有两个属性:version和encoding
- 合格的元素和属性
- 正确的注解
- 符合要求的特殊字符编写规则
- 文件扩展名必须为xml
- 必须只有一个根元素
注释:
转义字符:
- <;<
- >;>
- ";”
- &apos;’
- &;&
CDATA区:当大量的转义字符出现在xml中时,会使xml文档的可读性降低。以上转义字符在CDATA中都不需要转义,直接使用,提高可读性。
格式:
<![CDATA[任意内容]]>
<?xml version="1.0" encoding="utf-8" ?>
<!-- xml中的标签名和属性名都可以自定义 -->
<bean id="xx" className="zz">
<property name="xml" value="xx">
</property>
</bean>
<!-- 如果在xml中需要处理注释 - 注释过后的文件内容不会被解析,要将xml代码注释 -->
<![CDATA[ .........]]>
<?xml version="1.0" encoding="utf-8"?>
<beans>
<bean id="userId01" className="day2.demo.ba3.User">
<property name="uid" value="u001"></property>
<property name="userName" value="jack"></property>
<property name="password" value="123456"></property>
</bean>
<bean id="bookId002" className="day2.demo.ba3.Book">
<property name="bid" value="u001"></property>
<property name="title" value="java从入门到放弃"></property>
<property name="price" value="88"></property>
</bean>
</beans>
bean:表示一个对象(反射的对象)
id:对象命名(对象的引用)
className:实体类(反射的类)
property:表示一个属性
name:类的属性
value:属性的值
DOM4J:用来解析xml
dom4j是一个第三方的提供的一种专门用于解析xml的工具类,功能十分强大。
4:for
j:java
常用api:**
- SAXReader()构造对象
- read() - 加载执行xml文档
- Document对象
- getRootElement() - 获取根元素
- Element对象
- elements() - 获取指定名称的所有子元素
- element() - 获取指定名称第一个子元素
- getName() - 获取当前的元素名
- attributeValue() - 获取指定属性名的属性值
- elementText() - 获取指定名称子元素的文本值
- getText() - 获取当前元素的文本内容
使用步骤:**
- 获取核心类
- 获取document(整个xml文档)
- 获取beans
- 获取所有的子元素bean - bean属性 ```java package day2.demo.xml;
import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test;
import java.util.List;
public class DOM4JDemo {
@Test
public void testParse() throws DocumentException {
//1.获取核心类
SAXReader saxReader = new SAXReader();
//2.获取document(整个xml文档)
Document document = saxReader.read(“src/day2/demo/xml/beans.xml”);
//3.获取beans
Element rootElement = document.getRootElement();
//4.获取所有的子元素bean
List
<a name="aLI2Y"></a>
# 设计模式:工厂模式
**设计模式:23种,常用的有:单例模式、工厂模式、代理模式、模板模式...**
**工厂模式:相当于工厂的作用,创建出对象,之后如果需要这个对象,可以直接去工厂拿就行。**<br />**<br />**当前案例的操作是将xml中的数据封装到BeanConfig中,使用工厂模式的概念。**
- **1.BeanFactory首先加载xml配置文件 - 静态代码块**
- **2.将每一个bean标签配置内容,封装到BeaConfig中去**
- **3.最后将整个xml中的内容封装到一个容器中,便于快速查询,map进行数据存储**
```java
package day2.demo.ba3;
import org.apache.commons.beanutils.BeanUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BeanFactory {
//1.提供map存放beans.xml中的配置文件内容,使用map,建议使用静态处理 - 好处是只要加载一次
private static Map<String,BeanConfig> cache = new HashMap<>();
//静态代码块处理数据添加
static{
try{
//加载xml,获取document
SAXReader saxReader = new SAXReader();//使用DOM4J工具
Document document = saxReader.read("src/day2/demo/ba3/beans.xml");
//获取根节点
Element rootElement = document.getRootElement();
//获取根下的bean
List<Element> allBeanElement = rootElement.elements("bean");
//遍历list
for (Element beanElement : allBeanElement) {
//获取bean中的属性
String id = beanElement.attributeValue("id");
String className = beanElement.attributeValue("className");
//创建BeanConfig,并且封装id和className
BeanConfig beanConfig = new BeanConfig();
beanConfig.setId(id);
beanConfig.setClassName(className);
//再获取bean下的子标签
List<Element> allProperty = beanElement.elements("property");
for (Element prop : allProperty) {
//获取属性:name value
String name = prop.attributeValue("name");
String value = prop.attributeValue("value");
//将name和value保存到BeanConfig
beanConfig.getProps().setProperty(name,value);
}//内存for
//将封装好的数据存放到map中
cache.put(id,beanConfig);
}//外层for
//测试
System.out.println("初始化数据:"+cache);
} catch(Exception e){
throw new RuntimeException(e);
}
}
//因为这是一个工厂,需要提供对象的方法 - 外面需要的时候可以通过这个方法来拿对象
//通过指定的beanId来获取相对应的BeanConfig
public static Object getBean(String beanId){
//创建beanId获取相应的BeanConfig
BeanConfig beanConfig = cache.get(beanId);
//判断这个对象是不是合法
if(beanConfig == null){
throw new RuntimeException("获得的对象["+beanId+"]不存在");
}else{
//如果存在 - 通过反射机制进行获取
try{
String className = beanConfig.getClassName();
Class cla = Class.forName(className);
Object obj = cla.newInstance();//获取实例对象
//循环解析 - BeanUtils
for(String name:beanConfig.getProps().stringPropertyNames()){
//每遍历到一个name,就返回name对应的value
String value = beanConfig.getProps().getProperty(name);
//使用BeanUtils封装数据
BeanUtils.setProperty(obj,name,value);
}
return obj;
} catch (Exception e){
throw new RuntimeException(e);
}
}
}
}