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
  • 必须只有一个根元素


注释:

转义字符:

  • &lt;<
  • &gt;>
  • &quot;”
  • &apos;’
  • &amp;&

CDATA区:当大量的转义字符出现在xml中时,会使xml文档的可读性降低。以上转义字符在CDATA中都不需要转义,直接使用,提高可读性。
格式:

  1. <![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() - 获取当前元素的文本内容


使用步骤:**

  1. 获取核心类
  2. 获取document(整个xml文档)
  3. 获取beans
  4. 获取所有的子元素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 allBeanElement = rootElement.elements(“bean”); //遍历list for (Element element : allBeanElement) { //根据自己设定的属性进行解析 String id = element.attributeValue(“id”); String className = element.attributeValue(“class”); System.out.println(id+”—“+className); //获取子元素的property List propertys = element.elements(“property”); for (Element property : propertys) { String name = property.attributeValue(“name”); System.out.println(“xx”+name); } } } }

<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);
            }
        }
    }
}