day11作业

YangeIT大约 5 分钟

day11作业

回到作业

一、今日方法:

1. Properties集合中方法名称以及作用:

提示

  1. setPXXX--保障存储的是字符串
  2. getPXXX

2. 日志技术中涉及的类名以及方法名称:

提示

// 日志对象
  public static final Logger LOGGER = LoggerFactory.getLogger("当前类名");
  1. 日志常用级别 debug info error warning

3. 多线程中涉及类名以及方法名称:

提示

  1. Thread 线程类----start方法
  2. Runnable 接口---run方法
  3. 线程睡觉方法、线程名字方法

三、简答题:

1. 配置文件有什么作用?

提示

  1. 传输文件,存储软件配置

2. 今天学习的配置文件,各有什么特点?

提示

  1. properties 格式简单,存储简单信息方便,和集合直接对接(解析方便)
  2. xml格式清晰,阅读性强,文件相对较大,解析不方便

3. 日志技术有什么作用?日志技术使用步骤有哪些?

提示

  1. 思考下日记的作用?---日志用来记录程序运行情况
  2. 步骤:见在线笔记

4. 日志有几种级别,分别是什么?

提示

  1. 思考下日记的作用?---日志用来记录程序运行情况
  2. 步骤:见在线笔记

5. 什么是多线程?有几种实现方式?

提示

  1. 理解三个臭皮匠顶一个诸葛亮的典故
  2. 点击任务管理器,查看程序的线程数,观察是不是越复杂的程序,线程越多
  3. 理解线程就是程序的执行路径
  4. 实现方式3种,具体见笔记

6. 多线程实现方式有什么特点?

提示

  1. 单继承
  2. 多实现
  3. 有返回值

对照笔记中的案例,理解上述的特点


四、排错题:

排错题1:指出下述xml文件出现的语法错误并说明原因?

image-20220108174449458
image-20220108174449458

提示

  1. xml只有一个根标签
  2. 特殊字符需要转义或者使用CDATA转义区

CDATA转义区的快捷键:在idea中输入CD 回车

排错题2:指出下述xml中标签出现的语法错误的位置并且说明原因?

image-20220108173625775
image-20220108173625775

提示

<?xml version="1.0" encoding="UTF-8" ?>
<students >
	<student  id = "1">

		<name>heheie</name>
		<author>23</author>
		<price value="nan"></price>
	</student>

</students>
  1. 标签属性要使用"" 包裹
  2. 标签要成对出现

四、代码题:

第一题:分析以下需求,并用代码实现

训练目标

​ 掌握java中xml解析的基本使用,以及理解其在实际开发中的应用

需求描述

​ 将下图中的xml的数据,解析到java中,并将User标签的id属性作为键,User标签中的子标签中的数据,封装到User对象中,并作为值,存入Map<Integer,User>集合中。

​ 最后遍历map集合中的键值对数据,打印在控制台。

​ User类中属性:name、sex、address、password

image-20220108173625775
image-20220108173625775

提示

  1. 参考在线笔记中的练习案例
  2. 解析思想:擒贼先擒王(获得根标签),挟天子以令诸侯(通过根标签获得子标签)
点击查看代码
/**
 * 目标:掌握使用Dom4j框架解析XML文件。
 * // 1、创建一个Dom4J框架提供的解析器对象
 * // 2、使用saxReader对象把需要解析的XML文件读成一个Document对象。
 * // 3、从文档对象中解析XML文件的全部数据了
 * // 4、获取根元素下的全部一级子元素。
 * // 5、获取当前元素下的某个子元素。
 * // 6、获取元素的属性信息呢?
 * // 7、如何获取全部的文本内容:获取当前元素下的子元素文本值
 */
public class Dom4JTest1 {
    public static void main(String[] args) throws Exception {

//        创建一个Dom4J框架提供的解析器对象
         SAXReader saxReader = new SAXReader();
//        使用saxReader对象把需要解析的XML文件读成一个Document对象。
         Document document = saxReader.read(new File("D:\\itcast\\subject_java\\79\\code\\javase\\properties-xml-log-app\\src\\book.xml"));
//        从文档对象中解析XML文件的全部数据了
         Element rootElement = document.getRootElement();
//        System.out.println(rootElement.getName());

        // 4、获取根元素下的全部一级子元素。

         List<Element> books = rootElement.elements("book");
//        System.out.println(books.size());

        for (Element book : books) {

             Element nameElement = book.element("name");//<name>凡人修仙传</name>
             Element authorElement = book.element("author");//<author>亡语</author>
             Element descElement = book.element("desc");//<desc>讲述韩立修仙的故事</desc>
             Attribute id1 = book.attribute("id");

//           获得一个键值对:key  value
            String id = id1.getValue();//<name>
            System.out.println("id:"+id);


             String namekey = nameElement.getName();//<name>
             String stringValue = nameElement.getStringValue();//凡人修仙传
            System.out.println(namekey+":"+stringValue);


            String namekey1 = authorElement.getName();//<author>
            String stringValue1 = authorElement.getStringValue();//亡语
            System.out.println(namekey1+":"+stringValue1);


            String namekey2 = descElement.getName();//<desc>
            String stringValue2 = descElement.getStringValue();//讲述韩立修仙的故事
            System.out.println(namekey2+":"+stringValue2);



        }



    }
}

第二题:分析以下需求,并用代码实现

训练目标

​ 掌握单元测试的应用

需求描述

  1. 创建TestThread测试类,定义若干个测试方法,完成以下需求
    • 需求1:定义一个测试方法,输出1000次,我要好好学Java
    • 需求2:定义一个测试方法,完成表白100次,返回:我们在一起。并且表白的每次间隔1秒

提示

  1. 参考在线笔记中的练习案例
  2. 提示:间隔可以用sleep方法,单位是毫秒
点击查看代码
/**
 * 目标:掌握线程的创建方式三:实现Callable接口。
 */
public class ThreadTest3 {
    public static void main(String[] args) throws Exception {
        // 1、创建一个Callable的对象
         MyCallable myCallable = new MyCallable();
        // 2、把Callable的对象封装成一个FutureTask对象(任务对象)
        //FutureTask的祖宗是Runnable
         FutureTask futureTask = new FutureTask(myCallable);
        //Thread只要Runnable
        new Thread(futureTask).start();
//获取线程执行完毕后返回的结果。
        Object o = futureTask.get();

        System.out.println(o);
    }
}
/**
 * 1、让这个类实现Callable接口
 */
public class MyCallable implements Callable{

    @Override
    public Object call() throws Exception {

        for (int i = 1; i <= 10; i++) {
            System.out.println("我和你表白第"+i+"次");
        }

        return "好,在一起";
    }



}