day11作业
大约 5 分钟
day11作业
一、今日方法:
1. Properties集合中方法名称以及作用:
提示
- setPXXX--保障存储的是字符串
- getPXXX
2. 日志技术中涉及的类名以及方法名称:
提示
// 日志对象
public static final Logger LOGGER = LoggerFactory.getLogger("当前类名");
- 日志常用级别 debug info error warning
3. 多线程中涉及类名以及方法名称:
提示
- Thread 线程类----start方法
- Runnable 接口---run方法
- 线程睡觉方法、线程名字方法
三、简答题:
1. 配置文件有什么作用?
提示
- 传输文件,存储软件配置
2. 今天学习的配置文件,各有什么特点?
提示
- properties 格式简单,存储简单信息方便,和集合直接对接(解析方便)
- xml格式清晰,阅读性强,文件相对较大,解析不方便
3. 日志技术有什么作用?日志技术使用步骤有哪些?
提示
- 思考下日记的作用?---日志用来记录程序运行情况
- 步骤:见在线笔记
4. 日志有几种级别,分别是什么?
提示
- 思考下日记的作用?---日志用来记录程序运行情况
- 步骤:见在线笔记
5. 什么是多线程?有几种实现方式?
提示
- 理解三个臭皮匠顶一个诸葛亮的典故
- 点击任务管理器,查看程序的线程数,观察是不是越复杂的程序,线程越多
- 理解线程就是程序的执行路径
- 实现方式3种,具体见笔记
6. 多线程实现方式有什么特点?
提示
- 单继承
- 多实现
- 有返回值
对照笔记中的案例,理解上述的特点
四、排错题:
排错题1:指出下述xml文件出现的语法错误并说明原因?

提示
- xml只有一个根标签
- 特殊字符需要转义或者使用CDATA转义区
CDATA转义区的快捷键:在idea中输入CD 回车
排错题2:指出下述xml中标签出现的语法错误的位置并且说明原因?

提示
<?xml version="1.0" encoding="UTF-8" ?>
<students >
<student id = "1">
<name>heheie</name>
<author>23</author>
<price value="nan"></price>
</student>
</students>
- 标签属性要使用
""
包裹 - 标签要成对出现
四、代码题:
第一题:分析以下需求,并用代码实现
训练目标:
掌握java中xml解析的基本使用,以及理解其在实际开发中的应用
需求描述:
将下图中的xml的数据,解析到java中,并将User标签的id属性作为键,User标签中的子标签中的数据,封装到User对象中,并作为值,存入Map<Integer,User>集合中。
最后遍历map集合中的键值对数据,打印在控制台。
User类中属性:name、sex、address、password

提示
- 参考在线笔记中的练习案例
- 解析思想:擒贼先擒王(获得根标签),挟天子以令诸侯(通过根标签获得子标签)
点击查看代码
/**
* 目标:掌握使用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);
}
}
}
第二题:分析以下需求,并用代码实现
训练目标:
掌握单元测试的应用
需求描述:
- 创建TestThread测试类,定义若干个测试方法,完成以下需求
- 需求1:定义一个测试方法,输出1000次,我要好好学Java
- 需求2:定义一个测试方法,完成表白100次,返回:我们在一起。并且表白的每次间隔1秒
提示
- 参考在线笔记中的练习案例
- 提示:间隔可以用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 "好,在一起";
}
}