黑马程序员------------web(第二天)

javaBean: 符合特定规则的java类


javaBean分两种
狭义:  私有字段,对外提供访问方法,setter getter
广义:  私有字段,对外提供访问方法,setter getter,任意数量的公有业务方法




内省(IntroSpector) 站在反射的角度:
java提供一些操作javaBean的api 


PropertyDescriptor 属性描述类
getWriteMethod(); setter
getReadMethod();  getter


IntroSpector
通过getBeanInfo()方法获取javaBean类的属性;
在通过属性描述类PropertiesDescriptors,进行setter,getter操作
getWriteMethod(); setter
getReadMethod();  getter


package day02;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//简单内省      复杂内省
public class IntroSpectorTest1
{
	public static void main(String[] args)throws Exception
	{
		Person p = new Person("a",11);
		String propertyName = "age";
		setProperety(p, propertyName);
		
		getProperty(p, propertyName);
	}

	private static void getProperty(Person p, String propertyName) throws IntrospectionException,
			IllegalAccessException, InvocationTargetException
	{
		/*
		PropertyDescriptor pd = new PropertyDescriptor(propertyName, p.getClass());
		Method method = pd.getReadMethod();
		method.invoke(p);
		*/
		//复杂内省操作
		BeanInfo bi = Introspector.getBeanInfo(p.getClass());
		PropertyDescriptor[] pd = bi.getPropertyDescriptors();
		for (PropertyDescriptor propertyDescriptor : pd)
		{
			if(propertyDescriptor.getName().equals(propertyName))
			{
				Method method = propertyDescriptor.getReadMethod();
				System.out.println(method.invoke(p));
			}
		}
	}

	private static void setProperety(Person p, String propertyName) throws IntrospectionException,
			IllegalAccessException, InvocationTargetException
	{
		/*
		PropertyDescriptor pd  = new PropertyDescriptor(propertyName, p.getClass());
		Method method = pd.getWriteMethod();
		method.invoke(p,60 );
		*/
		//复杂的内省操作
		BeanInfo bi = Introspector.getBeanInfo(p.getClass());
		PropertyDescriptor[] pds = bi.getPropertyDescriptors();
		for (PropertyDescriptor propertyDescriptor : pds)
		{
			if(propertyDescriptor.getName().equals(propertyName))
			{
				Method method = propertyDescriptor.getWriteMethod();
				method.invoke(p,90 );
			}
		}
	}
}



属性与getter有关,与setter无关, 
//证明 删除setter 删除字段


package day02;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
//javaBean测试
public class JavaBeanTest
{
	public static void main(String[] args)throws Exception
	{
		Person p = new Person("a",10);
		BeanInfo bi = Introspector.getBeanInfo(p.getClass());
		PropertyDescriptor[] pds  = bi.getPropertyDescriptors();
		for (PropertyDescriptor propertyDescriptor : pds)
		{
			System.out.println(propertyDescriptor.getName());
		}
		//类中定义name  age
		//class 是继承Object的getClass
		//S  是  getS()方法
		
		//所以getter方法只要返回值,可以没有setter与字段 
	}
}



getter方法必须有返回值

任何一个javaBean都有一个class属性,因为继承Object的,用于父类的getClass();

第二个字母小写,则单词字母小写

BeanUtils工具包
简化内省操作代码书写,内部String与基本类型的自动转换

//使用BeanUtil操作javaBean, Date类的级联

package day02;

import org.apache.commons.beanutils.BeanUtils;

//使用Beanutils工具包操作javaBean
public class BeanUtilsTest
{
	public static void main(String[] args)throws Exception
	{
		Person person = new Person("a",15);
		String name = "age";
		String str = BeanUtils.getProperty(person, name);
		System.out.println(person);
		
		
		BeanUtils.setProperty(person, name, 90);
		System.out.println(person);
		
		//属性级联
		String date	= BeanUtils.getProperty(person, "date.time");
		System.out.println(date);
	}
}



Converutils转换器 
通过register()方法,向BeanUtils注册自定义转换器
匿名内部类实现Converter子类, 并复写convert()方法
//自定义转换器Data  转 字符串  

SimpleDataFormat简单日期格式化类
使用format()方法

Date类的toLocalString(); 将日期转换为本地显示方式

BeanUtils内置提供了一些常用的转换器,就是Converter的子类

//使用内置的转换器 DateConverter, DateLocalConverter等


package day02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;


//ConvertUtils自定义转换器
public class ConverutilsTest
{
	public static void main(String[] args)throws Exception
	{
		Person person = new Person("静儿",50);
		String date = "date";

		
		
		//BeanUtils内置的  如DateLocalConvertor
		
		//ConvertUtils.register(new DateLocaleConverter(), Date.class);
		
		//自定义的日期转换  
		ConvertUtils.register(new Converter()
		{
			
			@SuppressWarnings("unchecked")
			@Override
			//目标字节码文件   还有传进来的参数
			public <T> T convert(Class<T> arg0, Object arg1)
			{
				String time = (String) arg1;
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
				try
				{
					return (T)sdf.parse(time);
				} catch (ParseException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
					return null;
				}
				
			}
		}, Date.class);  //要转换的字节码文件对象
		
		BeanUtils.setProperty(person, date, "2014-4-15");

		String str = BeanUtils.getProperty(person, date);
		System.out.println(str);
		
	}
}


泛型(Generic)  常用于集合
将运行发生的类型转换异常,转移到了编译时期,提高了安全性.同时也避免了强制转换的麻烦
编译之后产生的class文件不会保留泛型信息,这种操作称为:擦除,

<> 念 type of
ArrayList<E> E称为类型参数变量
ArrayList<Integer> Integer称为实际类型参数
ArrayList<E> 泛型类型
ArrayList<Integer> 参数化类型
ArrayList  原始类型

泛型类型参数变量必须为引用类型

//Map泛型取出元素,List泛型进行迭代元素
package day02;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;

//泛型 用于Map集合  List集合  
public class Generic
{
	public static void main(String[] args)
	{
		//注意 如果底层是哈希表数据结构,那么在进行删除的操作的时候,不能对参与哈希值运算的字段进行修改
		//这样删除元素就会失败
		
		Map<Integer, String> map = new HashMap<Integer,String>();
		map.put(1, "a");
		map.put(2, "c");
		map.put(3, "c");
		map.put(4, "d");
		
		for (Map.Entry<Integer, String> me : map.entrySet())
		{
			System.out.println(me.getKey()+""+me.getValue());
		}
		
		List<String> list = new ArrayList<String>();
		list.add("nima");
		list.add("kengdie");
		//如果想在迭代的时候,还要添加元素的话 就要List特有的迭代器listIterator
		ListIterator<String> li = list.listIterator();
		while(li.hasNext())
		{
			System.out.println(li.next());
			li.add("aaa");
		}
		System.out.println(list);
		
		
	}
}


BigDecimal大精度

泛型两边要么都不加泛型,要么两边的约束类型都要一直,同时也必须是引用类型
泛型中不存在继承
原始类型可以赋值给参数化类型,反之也行,这样目的是为了兼容1.4

切记,面向接口,面向父类编程,提高程序的扩展性以及后期维护性

//自定义泛型方法  实现两个元素的交换  使用Integer  int测试

package day02;

import java.util.Arrays;

//自定义泛型方法   
public class GenericTest
{
	public static void main(String[] args)
	{
		int[] arr = {1,2,3,4};
		
		String[] strs = {"a","b"};
		//print(arr);  //不能传基本类型数组
		print(strs);
		
	//	swap(arr, 0, 1); //不能传基本类型数组
		swap(strs, 0, 1);
		System.out.println(Arrays.toString(strs));
	}
	public static <T>void print(T[] t)
	{
		System.out.println(t);
	}
	public static <T>void swap(T[] arr,int i, int j)
	{
		T temp = arr[i];
		arr[i] = arr[j];
		arr[j] =temp;
	}
}


当一个类有大量的泛型属性或者泛型方法,那么就可以将该类定义为泛型类

//泛型类  
注意:static方法不能使用泛型类的类型的

package day02;
//字定义泛型类
public class GenericTest1<T>
{
	private T t;
	public void show(T t)
	{
		System.out.println(t);
	}
	//静态方法不能访问泛型类
	public static <T>void print(T t)
	{
		System.out.println(t);
	}
	public static void main(String[] args)
	{
		GenericTest1<String> g = new GenericTest1<String>();
		g.show("fff");
		
		g.print(10);
		g.print("a");
	}
}



泛型的高级应用 --  通配符

? 不确定的类型
可以匹配任意类型,但是在方法内不能调用与类型相关的方法,可以用Object接收任意类型

? 常用于引用对象

限定符
上限:  ? extends Number      只能接收Numebr或者Number的子类
下限:  ? super Number       只能接收Number或者Number的父类

String是final的,不可以继承

package day02;

import java.util.ArrayList;
import java.util.List;

//泛型通配符的使用 
public class GenericTest2
{
	public static void main(String[] args)
	{
		List<Integer> list = new ArrayList<Integer>();
		list.add(10);
		list.add(105);
		list.add(108);
		list.add(150);
		show(list);
		
		
		//上限  只能接收Number的子类以及Number
		List<? extends Number>  l = new ArrayList<Integer>();
		//下限  只能接收Integer 或者Integer的父类
		List<? super Integer>  x = new ArrayList<Number>();
	}
	//?通配符 表示任何任意类型   常用于参数类型引用
	public static void show(List<?> list)
	{
		// list.add(10);  //不可以调用与该类型有关的如添加等操作
		list.remove(0);
		System.out.println(list.size());
	}
}


//给集合中添加元素,倒序输出 用Collections.reverse() 反转

package day02;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

//反转集合
public class Reverse
{
	public static void main(String[] args)
	{
		List<Integer> list = new ArrayList<Integer>();
		list.add(15);
		list.add(14);
		//反转前
		System.out.println(list);
		//反转后
		Collections.reverse(list);
		
		System.out.println(list);
	}
}


XML(Extensile Markup Language)可扩展标记语言
W3C 2000年发布的XML1.0规范

为什么要学习xml?
需要使用xml通知计算机程序去处理关系数据

xml技术除用于保存关系数据外,它还常用于软件配置文件,已描述程序模板间的关系,还当一个小型数据库或者数据载体

保存xml文件时,一定要确保xml文件与保存的编码和encoding声明的编码一致或者兼容

xml语法:
一个xml文件分为以下几个部分:
1.文档声明
2.元素
3.属性(附加的信息描述)
4.注释(不能随意嵌套)
5.CDATA(特殊字符)
6.处理指令(processing instraction)



1.文档声明
enCoding 指定字符编码
version  指定xml版本
standalone 指定xml文件是否独立 可设置"yes" or "no"

各浏览器的xml解析器只是对xml的语法检测

2.元素
元素指xml文件中出现的标签
一个标签为开始标签,和结束标签.

可以包含标签体:
<a>www.nima.com</a>
不包含标签体:<a></a>  可以简写<a/>

允许嵌套若干个子标签,但不允许交叉嵌套(html可以)
<a><b></a></b>  //这是不允许的

并且只有一个根节点(标签)

程序会将标签的内容空白字符当做有效的字符

命名规范:
1.区分大小写,例如<p>与<P>是两个不同的标签
2.不能以数字或_开头
3.不能以xml Xml XML开头
4.不能包含空格
5.名称中不能包含(:冒号)

3.属性
1.一个标签可以有多个属性,每个属性都有它的子集的名称和取值
例如: <input name="text">
2.属性值一定要用双引号或单引号引起来,就是定界符
3.定义属性必须循环与元素一样的命名规范

//描述一个家庭 编号,地址,邮编


当一个事物必须与该对象绑定在一起,没有该对象,该事物就没有意义,此时该事物就应成为对象的属性,不可变化的

4.注释
<!-- 注释 -->
注意:注释之间不存在嵌套


5.CDATA(character data(字符数据区/段))
作用时:不让该字符数据区/段不让xml解析器解析

<![CDATA[
//代码区/段
]]>

CDATA不允许嵌套

xml内置5中转义字符:
< &lt;
> &gt;
& &amp;
" &quot;
' &apos;
其他字符可以查看编码表:
例如 ¥&#x00A5;  注意&#x是必须的 且x必须小写

6.处理指令
<?xml-stylesheet type="text/css" href="#">
//使用css控制xml的样式  css叠层样式表
作用:
1.可以使用css装饰xml文件文件中的内容
2.css目前版本只能支持英文标签

@CHARSET "UTF-8";
root
{	
	color:#060;
	font-size: 50px;
}
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml-stylesheet type="text/css" href="main.css" ?>
<root>
	<family id="0001">
		<address>广东</address>
		<show><</show>
		<show>></show>
		<show>&</show>
		<show>"</show>
		<show>'</show>
		<!-- 查看编码转换 ¥ 字符编码 &#x 引用 -->
		<show>¥</show>
		<zipcode/> 
		  <!-- 注释: 标签允许若干次嵌套 -->
		  <city name = "湛江">
		  		<ju>霞山</ju>
		  		
		  		
		  </city>
	</family>
	<!-- 被CDATA注释的数据区/段 不参与编译  -->
	<![CDATA[
	<family id="0002">
		<address>广西</address>
	</family>
	]]>
</root>




约束
什么是xml约束?
在xml技术里,可以编写一个文档来约束一个xml文档的书写规范,这称为xml约束
为什么需要约束?
为了解析器唯一对待一种xml文件

DTD(Document Type Definetion)文档类型定义

<!DOCTYPE 根标签 SYSTEM "dtd文件">

//xml 人 姓名 年龄     DTD约束

#PCDATA (paraser character data)文本字符数据

正确的xml文件是指xml语法正确
有效的xml文件是指xml语法和约束都正确

编写DTD有两种方式:
1.外部约束  定义在外部 在用<!DOCTYPE>进行引用就可以
2.内部约束 通常定义在第二行
<!DOCTYPE 跟标签 [

]>

SYSTEM 是个人或者组织,小范围内使用的. 本地
PUBLIC 是大范围内使用的,例如structs框架  公共的

DTD约束语法细节:
1.元素定义
<!ELEMENT 元素名称 元素内容(元素类型)> 
元素内容或类型则使用()括起来,用空格与元素名称隔开
如果是空标签,直接使用EMPTY
例如:<!ELMENT name EMPTY>  那么这时name元素内容就必须为空,可以</name>使用

ANY代表任意类型的元素,可以放字标签,#PCDATA,与空元素  


在实际开发中,尽量使用EMPTY,少用ANY
在DTD中,必须将所有的标签全部声明完,少一个都不允许
可以使用|分隔,表示任选其一

可以用+(出现一次或多次), ?(出现0次或一次) , *(出现一次或多次)等符号表示元素出现的次数

批量处理
例如<!ELEMENT MYFILE ((TITLE*,AUTHOR?,EMAIL)* | COMMENT)>

2.属性定义
1.xml中为元素通过ATTLIST进行属性设置

语法
<!ATTLIST 元素名  
属性名 属性值类型 值约束
>
//车  生产日期  品牌 轮胎数   

#REQUIRED  属性必须出现
#IMPLIED  属性可有可无
#FIXED    属性设置必须为固定值
还可以设置默认值,属性不设置也是具备默认的.如果创建属性那么可以重新赋值,例如
width CDATA "10";

属性的类型:
1.CDATA 普通文本字符串
2.ENUMERATE 枚举 例如(5 | 6 | 7)
3.ID   唯一类型   值不能以字母,下划线开始,不能出现空格,而且是唯一的,约束为@REQUIRED
4.ENTITY 替代了频繁出现的字符串
  实体用于一段内容创建一个别名,以后再xml文档中就可以使用别名引用这段内容了.

实体分: 引用实体 和 参数实体

引用实体:
语法:
<!ENTITY 实体名称  "内容">
引用方式:
&实体名称; 
参数实体:
<!ENTITY % 实体名称  "元素名">
使用方式:
<!ELMENT 元素名 (%实体名) >

注意:参数实体,是要定义外部DTD的

参数实体: 当定义DTD时,出现相同的子元素,此时可以使用参数实体来解决,在DTD中定义,在在DTD中使用
引用实体: 当定义xml时,很多子元素有相同的内容,这时可以使用实体,在DTD声明,在xml中使用

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT students (student+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA) | EMPTY>

<!--<!ELEMENT age EMPTY>-->
<!--<!ELEMENT age ANY> -->
<!ATTLIST student sid CDATA #REQUIRED> <!-- 必须实现-->
<!ATTLIST name alias CDATA  #IMPLIED> <!-- 可有可无-->
<!ATTLIST name alias   FIXED "九卿"> <!-- 固定值-->
<!ATTLIST name alias   CDATA "九卿"> <!-- 默认值-->



<!ATTLIST name alias ID #REQUIRED>   <!-- ID属性类型-->
<!ATTLIST name alias (纸|那只) "纸">  <!-- 枚举类型-->
<!ATTLIST name alias CDATA "123">  <!-- CDATA基本文本数据类型-->
<!ENTITY entity "helloworld"> <!-- 内容实体    引用&entity;-->
<!ENTITY % tcp "name">
<!ATTLIST student (%tcp;) >

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM "stu.dtd">
<students>
	<student sid = "20">
		<name></name>
		<age>18</age>
	</student>
	<student>
		<name></name>
		<age>18</age>
	</student>
</students>


//课后作业:  dtd.chm的实例  根据该dtd 写个xml

//电视频道  第一练习

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)> 
<!ELEMENT DESCRIPTION (#PCDATA)>

<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TVSCHEDULE SYSTEM "dianshi.dtd">
<TVSCHEDULE NAME="坑爹">
	<CHANNEL CHAN="第一">
		<BANNER></BANNER>
		<DAY>
			<DATE></DATE>
			<HOLIDAY></HOLIDAY>
			<HOLIDAY></HOLIDAY>
			<PROGRAMSLOT >
					<TIME ></TIME>
					<TITLE ></TITLE>
				</PROGRAMSLOT>
		</DAY>
	</CHANNEL>
	<CHANNEL CHAN="第二">
		<BANNER></BANNER>
			<DAY>
				<DATE></DATE>
				<HOLIDAY></HOLIDAY>
				<PROGRAMSLOT VTR="可有可无">
					<TIME ></TIME>
					<TITLE RATING ="可有可无" LANGUAGE="可有可无"></TITLE>
					<DESCRIPTION></DESCRIPTION>
				</PROGRAMSLOT>
			</DAY>
	</CHANNEL>
</TVSCHEDULE>


//产品  第二个练习


<?xml version="1.0" encoding="UTF-8"?>

<!ELEMENT CATALOG (PRODUCT+)>
<!ELEMENT PRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ELEMENT OPTIONS (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>

<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|Discontinued) "InStock">

<!ATTLIST SPECIFICATIONS
WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>

<!ATTLIST OPTIONS
FINISH (Metal|Polished|Matte) "Matte" 
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|NotApplicable) "HardShell">

<!ATTLIST PRICE
MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>

<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE CATALOG SYSTEM "chanpin.dtd">
<CATALOG>
	<PRODUCT NAME ="可有可无" CATEGORY ="Table" PARTNUM="可有可无" PLANT="Chicago" INVENTORY="Discontinued">
		<SPECIFICATIONS WEIGHT="可有可无" POWER="可有可无"></SPECIFICATIONS>
		<OPTIONS FINISH ="Polished" ADAPTER="Included" CASE= "NotApplicable"></OPTIONS>
		<PRICE MSRP="可有可无" WHOLESALE ="可有可无" STREET = "可有可无" SHIPPING ="可有可无"></PRICE>
		<NOTES>&AUTHOR;&COMPANY;&EMAIL;</NOTES>
	</PRODUCT>
	<PRODUCT >
		<SPECIFICATIONS ></SPECIFICATIONS>
		<OPTIONS ></OPTIONS>
		<PRICE ></PRICE>
		<NOTES>&AUTHOR;&COMPANY;&EMAIL;</NOTES>
	</PRODUCT>
</CATALOG>

//第三个练习  报纸 


<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)> 

<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>

<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE NEWSPAPER  SYSTEM  "baozhi.dtd">
<NEWSPAPER >
	<ARTICLE AUTHOR="作者" EDITOR="可有可无" DATE ="可有可无" EDITION ="可有可无">
		<HEADLINE>&NEWSPAPER;</HEADLINE>
		<BYLINE></BYLINE>
		<LEAD></LEAD>
		<BODY>&PUBLISHER;</BODY>
		<NOTES>©RIGHT;</NOTES>
	</ARTICLE>
	<ARTICLE AUTHOR="作者">
		<HEADLINE>&NEWSPAPER;</HEADLINE>
		<BYLINE></BYLINE>
		<LEAD></LEAD>
		<BODY>&PUBLISHER;</BODY>
		<NOTES>©RIGHT;</NOTES>
	</ARTICLE>
</NEWSPAPER>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值