高级java实验指导书(1)

更新时间:2023-12-30 00:18:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

高级java程序设计实验指导书

指导老师:王森

重庆理工大学计算机科学与工程学院

目录

第一部分 上机实验的目的及要求。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3

1.1 上机实验的目的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3 1.2 上机实验基本要求。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3

第二部分 实验内容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 实验1 java集合框架。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4

实验 2 类型信息与反射。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。7 实验 3 泛型。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。10 实验 4 注解。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。13 实验 5 网络。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。16 实验 6 多线程。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。20 实验 7 序列化。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。24 实验 8 WEB服务器开发。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。28

第一部分 上机实验的目的及要求

2

1.1 上机实验的目的

《高级java程序设计》是软件工程专业的一门专业基础课,课程开设的目的就是帮助学生建立面向对象编程的基本思想。通过本课程的学习,使学生在短时间内理解java面向对象编程的基本原则,以及对Java Web编程、java数据库编程、WEB服务器编程有一个基本的了解,并为后继课程打下坚实的理论基础和编程基础。

实验课是本门课程的重要环节。实验内容以验证性实验和设计性实验相结合为主,以综合性实验为辅。实验过程中要求使用JAVA语言独立进行编程和调试。通过实验主要要达到下述目的:

1、加深对面向对象编程思想的理解。 2、熟悉JAVA语言的语言要素,通过大量的验证性实验,巩固学生在理论课上所学的知识点。

3、通过大量的实验编写来提高学生对程序的编写、调试、连接、运行全过程,积累程序调试经验。

4、学习如何系统的设计程序、使学生逐渐建立程序设计的系统观,养成良好的编程习惯和编程风格。

1.2 上机实验基本要求

学生在实验前必须做好上机的各项准备,按教师的要求进行上机实验。具体要求如下:

1、根据实验指导书提前做好上机预习。必须携带相关的源程序上机。程序可以是由教师布置安排的或是自编的。

自编程序应书写整齐,并经人工检查无误,以提高上机效率。对程序中自己有疑问的地方,应作出记号,以便在上机时给予注意。

2、必须携带教材和相关参考资料上机。 3、调试程序的过程应独立完成。

独立上机是学生独立思维能力独自动手能力的一个重要途径,上机过程中出现的问题,一般应由学生独立处理,不要轻易举手问老师或周围同学。对常见的“出错信息”应尽快熟悉其含义,并在总结经验的基础上迅速排出常见的错误。

4、在程序调试通过运行成功后,应及时做好程序清单和运行结果的记录,实验结束后及时填写实验报告。实验报告应包括如下内容: (1)实验时间 (2)实验内容 (3)源程序清单

(4)运行结果及分析结论

5、上机过程中严格遵守实验室纪律,养成良好的上机习惯。

第二部分 实验内容

3

实验1 java集合框架

一、实验目的

1、掌握java集合框架的层次体系结构

2、掌握规则集、线性表、队列等集合的相关知识。 3、了解java集合里面各种方法的相关算法,为数据结构后面的章节打好基础。

二、实验内容 1、程序验证题。

(1)输入如下程序,观察输出结果。 class TestLinkedHashSet { public public static void main(String [] args){ Set set = new LinkedHashSet(); set.add(\); set.add(\); set.add(\); set.add(\); set.add(\); set.add(\); for(Object element:set){ System.out.println(element.toString().toLowerCase()); } } }

(2)输入如下程序,观察输出结果。 public class TestHashSet { public static void main(String[] args){ Set set = new HashSet(); set.add(\); set.add(\); set.add(\); set.add(\); set.add(\); System.out.println(set); Iterator interatorIterator = set.iterator(); while(interatorIterator.hasNext()){ System.out.print(interatorIterator.next().toUpperCase(); } } } 2、程序填空题。 4

(1)输出下面程序的运行结果。 public class TestTreeSet { public static void main(String []args){ Set set = new HashSet(); set.add(\); set.add(\); set.add(\); set.add(\); set.add(\); set.add(\); TreeSet set2 = new TreeSet(set); System.out.println(\+set2); System.out.println(\+set2.first()); System.out.println(\+set2.last()); \+set2.headSet(\ System.out.println(\york\)); \+set2.tailSet(\ System.out.println(\york\)); System.out.println(\+set2.lower(\)); System.out.println(\+set2.higher(\)); System.out.println(\+set2.floor(\)); System.out.println(\+set2.ceiling(\)); System.out.println(\+set2.pollFirst()); System.out.println(\+set2.pollLast()); System.out.println(\+set2); } }

(1)————————

(2)输出下面程序的运行结果。

5

public class Person {

protected T t;

public Person(T t){

this.t = t;

}

public String toString(){

return \参数的类型是:\

}

}

public class GenericTest {

public static void main(String[] args){

————————————

————————————

}

(2)如下代码,怎么填才能使其正确 ArrayList dates___=new ArrayList___(); dates.add(new Date);

Date date = dates.get(0) ; 三、根据下面的要求编写程序

(1)设计一个泛型堆栈类GenericStack,并编写一个测试程序。 (2)使用泛型二分查找法实现下面的方法。

Public static >int binarySearch(E[] list,E key)

(3)实现下面的方法,返回数组中的最大元素

Public static >E max(E[]list)

四、实验结果

写实验报告。内容包括:

1、习题的运行结果,源程序。 2、程序调试中出现的错误提示。(英文、中文对照) 3、若有没通过的程序,分析原因。

五、选做题目

11

(1)使用泛型选择排序法实现下面的方法

Public static >void selectionSort(E[] list) (2)使用泛型插入排序法实现下面的方法

Public static >void insertionSort(E[] list)

(3)编写一个泛型方法返回二维数组的最大元素

Public static >E max(E[][] list) (4) 请思考Java为什么在编译时要擦除泛型信息,如果不擦除泛型信息,有什么样的优点和缺点?

一、实验目的

实验4 注解

12

1、了解注解的基本概念和为什么使用注解 2、掌握常见的注解使用方法以及如何自定义注解 3、了解注解实体映射与如何解析注解实体 4、学会如何利用注解解决实际编程中的问题

二、实验内容 1、程序验证题

(1)输入如下程序,看编译器报什么警告。

public class Person {

private String name;

public void speak(String message){

List list = new ArrayList();

System.out.println(\\

}

}

(2)输入如下程序,看程序结果是什么? class A { private String id; A(String id){ this.id = id; } @Deprecated public void execute(){ System.out.println(id); } public static void main(String[] args) { A a = new A(\

a.execute();

}

}

2、程序填空题

(1)要定义一个作用在属性上、信息保留到程序运行时的注解ID。请按要求填完程序。

——————————

——————————

public @interface ID { public String value() default \} 13

(2)如下程序,要为注解ID赋一个值“personID”,请根据题目要求填完程序。 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ID { public String value(); public String description() default \ }

public class Person {

————————

}

三、根据下面要求编写程序

(1)创建Person类,Person的属性有:

Strng name 姓名 String sex 性别 Integer age 年龄, String idNo 身份证号

Boolean isMerried 是否已婚

请生成相应的getter、setter方法。请编写注解@Label,表示所注解对象的中文名称,请把@Label注解标注在Person类和Person的每个属性上面。请编写PersonInput类,负责提示录入人员的相关属性,提示必须是注解@Label所标注的中文名称。请编写PersonDisplay,负责显示人员信息,显示时的属性名称必须为注解@Label所标注的中文名称,PersonInput类与PersonDisplay类实现了共同的接口PersonAction,接口PersonAction有方法process,方法process的签名为:public Person process(Person person);

(2) 在第一题目的基础上,编写注解@Column,属性有Label 表示类的属性的显示名称,

Nullable 表示是否允许属性值为空,MaxLength 表示文本属性的最大长度,MinLength表示文本属性的最小长度,MaxValue表示最大值,MinValue表示最小值,把注解@Column加在Person类的每个属性上,在输入Person时根据注解@Column的配置进行校验。第一题的@Label只标注在类上。请实现Person的增、删、改、查功能。

四、实验结果

写实验报告。内容包括:

1、习题的运行结果,源程序。 2、程序调试中出现的错误提示。(英文、中文对照)

14

3、若有没通过的程序,分析原因。

五、选做题目

(1)请思考:注解还可以应用到哪些场景?

(2) 请设计一个注解,用于标注类的方法可以调用的权限(即标注方法只有在用户登录后,有指定权限的人员才可以调用),结合第三章的动态代理,在方法调用时进行安全检查。

一、实验目的

实验5 15

网络

1、了解网络协议的基本概念和区分OSI模型和TCP/IP模型的不同点。

2、熟悉输入输出流、以及常见的流处理工具。

3、掌握基于TCP编程和UDP编程的基本步骤和对相关核心类的了解。 4、掌握简单的应用服务器工作原理,为后面Web服务器开发打好基础。

二、实验内容

1.验证实验。

(1)输入如下程序,观察输出结果。 public static void main(String[] args) throws Exception { InetAddress address = InetAddress.getByName(\ System.out.println(\获取新浪的IP地址========\ System.out.println(address.toString()); InetAddress[] addresses = InetAddress.getAllByName(\ System.out.println(\获取新浪的IP地址列表=======\ for(InetAddress add : addresses){ System.out.println(add.toString()); } } (2)输入如下程序,观察输出结果。

public class NetTest { public static void main(String[] args) throws Exception{ InetAddress address = InetAddress.getLocalHost(); if(address instanceof Inet4Address){ System.out.println(\ address = (Inet4Address)address; } System.out.println(address.toString()); } } public class NetTest {

2.程序填空题。

1、 如下程序,是基于TCP/IP编程的客户端和服务端的程序。请填完空缺代码

public class Client { public static void main(String[] args) throws Exception{

Socket socket = new Socket(\InputStreamReader reader = new InputStreamReader(socket.getInputStream()); 16 ———————————— PrintWriter writer = new PrintWriter(socket.getOutputStream());

public class Server { public static void main(String[] args) throws Exception{ ServerSocket server = new ServerSocket(888); ———————————— InputStreamReader reader = new InputStreamReader(socket.getInputStream()); BufferedReader buffer_reader=new BufferedReader(reader); PrintWriter writer=new PrintWriter(socket.getOutputStream()); String request = buffer_reader.readLine(); System.out.println(\ String line=\ writer.println(line); writer.flush(); writer.close(); buffer_reader.close(); 服务端 ———————— server.close(); } } 三、根据下面要求编写程序

1. 请分别采用TCP、UDP协议编程实现一对一的文件上传。

2. 编写一对多的聊天程序,程序由服务器和客户端两部分构成,两部分的

交互方式如下:

17

a. 客户端发送命令: 给服务器端注册用户,服务器端如果允许注册,则返回消息:,否则返回消息:

b. 客户端发送命令: 给服务器端进行登录, 服务器端如果允许登录,则返回消息:,否则返回消息:

c. 客户端发送命令: 给服务器端,服务器端收到命令后返回消息:

d. 服务器向指定客户端发送命令:,如果客户端收到消息,则返回:,如果message命令中的 from属性为空,则表示由服务器发送的消息。

e. 客户端发送命令: 给服务器端进行注销登录, 服务器端如果允许注销登录,则返回消息:,否则返回消息:

程序可以采用GUI,也可采用命令行的方式。

四、实验结果

写实验报告。内容包括:

1、习题的运行结果,源程序。 2、程序调试中出现的错误提示。(英文、中文对照) 3、若有没通过的程序,分析原因。

五、选做习题

(1)请分别采用TCP、UDP协议编程实现一对多的文件上传。

(2)请编写程序把页面:http://www.w3.org/Consortium/Member/List中的 “Current Members”的名称抽取出来,存入文本文件中。(也可以下载任意指定页面,并抽取相关的内容)

18

(3)模仿QQ,设计实现一个聊天工具。

一、实验目的

1、理解线程概念和定义。

实验6 多线程

19

2、掌握创建、管理和控制Java线程对象的方法,包括创建Java 线程对象、 改 变线程状态、设置线程优先级以控制线程调度等方法。

3、了解并执行的多线程间存在的各种不同关系,掌握实现线程互斥和线程同步的方法。

二、实验内容

1、程序验证

(1)输入以下程序,观察输出结果。

class MyThread extends Thread{ public int x = 0; public void run(){ System.out.println(++x); } } class R implements Runnable{ private int x = 0; public void run(){ System.out.println(++x); } } public class Test { public static void main(String[] args) throws Exception{ for(int i=0;i<10;i++){ Thread t = new MyThread(); t.start(); } Thread.sleep(10000); R r = new R(); for(int i=0;i<10;i++){ Thread t = new Thread(r); t.start(); } } }

(2)输入如下程序,观察输出结果。

ublic class ThreadDemo { (3) public static void main(String[] args) { Thread t = new TestThread(); // t.setDaemon(true); t.start(); 20 int i=0; while(true) { System.out.println(\

2、程序填空题。 class C6 implements Runnable{ public void run() { for(int a=3;a<=10;a++){ if(isPrime(a)) System.out.print(a+\); } } public boolean isPrime(int n){ boolean b=true; for(int i=2;i

(1)输出上面程序的运行结果 ————————————

(2) 在下列程序的横线处填入正确的语句。

public class Test {

public static void main(String args[]) { Thread t1 = new subTread(\); Thread t2 = new subTread(\); t1.start(); t2.start(); } }

class subTread extends Thread { public subTread(String s) {

}

public void run() { System.out.println(\ + getName()); try { sleep((int) (Math.random() * 1000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(\结束!\ + getName()); } }

三、按照要求编写程序

1、编写基于多线程的素数(是除了自身和1以外,没有其它素数因子的自然数)判定程序。待判定的整数经过键盘录入后存放在一个列表中,创建10个线程从列表中取出整数进行判定,判定的结果存入到另一个列表中,用户可以通过键盘查询判定的结果。

2、编写基于多线程的素数(是除了自身和1以外,没有其它素数因子的自然

22

数)判定程序。待判定的整数经过键盘录入后存放在一个列表中,创建10个线程从列表中取出整数进行判定,判定的结果存入到另一个列表中,用户可以通过键盘查询判定的结果。

3、应用继承类Thread的方法实现多线程类,该线程3次休眠若干(随机)毫秒后显示线程名和第几次执行。 4、请通过实现Runnable接口和继承Thread类分别创建线程,要求:除了main线程之外,还要创建一个新的线程。Main线程重复100次“main“,新线程重复100次输出“new”。

四、实验结果

写实验报告。内容包括:

1、习题的运行结果,源程序。 2、程序调试中出现的错误提示。(英文、中文对照) 3、若有没通过的程序,分析原因。

五、选做题目

1、编写一个多线程类,该类的构造方法调用Thread类带字符串参数的构造方法。建立自己的线程名,然后随机生成一个休眠时间,再将自己的线程名和休眠多长时间显示出来。该线程运行后,休眠一段时间,该时间就是在构造方法中生成的时间。最后编写一个测试类,创建多个不同名字的线程,并测试其运行情况。 2、编写一个程序,测试异常。该类提供一个输入整数的方法,使用这个方法先输入两个整数,再用第一个整数除以第二个整数,当第二个整数为0时,抛出异常,此时程序要捕获异常。

3、.编写一个用线程实现一个数字时钟的应用程序。该线程类要采用休眠的方式,把绝对大部分时间让系统使用。 4、编写一个使用继承Thread类的方法实现多线程的程序。该类有两个属性,一个字符串代表线程名,一个整数代表该线程要休眠的时间。线程执行时,显示线程名和休眠时间。

实验7 序列化

一、实验目的

1、了解什么是序列化以及序列化的相关概念。 2、掌握序列化流程和如何对程序进行序列化、

23

3、学习如何自定义序列化。

4、掌握XML和Jason的相关概念。

二、实验内容

1、程序验证

(1)输入如下程序,观察输出结果。 Public class Person implements Serializable{ Private static final long serialVersionUID = 1L; Private String name =\ Private Integer age = 15; Public string getName(){ return this.name; } } Public class SerializeTool{ Public static void serialize(Object obj,String fileName)throws Exception{ File file = new File(\ FileOutputStream output = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream (output); oos.writeObject(obj); oos.flush; oos.close(); output.close(); } } (2)输出如下程序,观察输出结果

Public class Person implements Serializable{ Private static final long serialVrsionUID = 1L; Private String name =\ Private Integer age = 15; Public string getName(){ return this.name; } } Public class SerializeTool{ 24

三、根据下面要求编写程序

(1)请编写程序把任意对象序列化成XML文件,如果属性不是基本数据类型,则需要序列化相关联的属性,XML的格式如下例所示:

ddd 23

chonqqing

Hong Guang Street

提示:采用反射

(2)请把第一题序列化的XML反序列化为Java对象。

25

(3)编写一对多的聊天程序,程序由服务器和客户端两部分构成,服务器和客户端通过对象传送实现消息传递,两部分的交互方式如下:

a. 客户端发送命令: 给服务器端注册用户,服务器端如果允许注册,则返回消息:,否则返回消息:

b. 客户端发送命令: 给服务器端进行登录, 服务器端如果允许登录,则返回消息:,否则返回消息:

c. 客户端发送命令: 给服务器端,服务器端收到命令后返回消息:

d. 服务器向指定客户端发送命令:,如果客户端收到消息,则返回:,如果message命令中的 from属性为空,则表示由服务器发送的消息。

e. 客户端发送命令: 给服务器端进行注销登录, 服务器端如果允许注销登录,则返回消息:,否则返回消息:

以上命令所对应的对象如下图所示。

Command-sendDateRegister-name : stringResult-command : Command-state : stringLogin-name : stringMessage-from : string-to : string-message : stringLogout-name : string

26

a. 请采用Java本身的序列化方法序列化命令对象; b. 请采用XML序列化命令对象; c.请采用Json序列化命令对象。

程序可以采用GUI,也可采用命令行的方式。

四、实验结果

写实验报告。内容包括:

1、习题的运行结果,源程序。 2、程序调试中出现的错误提示。(英文、中文对照) 3、若有没通过的程序,分析原因。

五、选做题目

1. 请编写远程方法调用程序,程序分为客户端和服务器端,客户端负责接

受用户输入的命令,服务器端负责接收命令、并执行命令。例如:用户通过客户端输入:

ddd.lis.StudentManager.saveStudent({name:”xu”,age:20}) (ddd.lis是包名,StudentManager是服务器端的一个类名,saveStudent是其方法,{name:”xu”,age:20}是JSON格式)。

服务器端接收到命令,通过反射创建StudentManager对象,并检索到方法 saveStudent,根据方法saveStudent的参数类型把 {name:”xu”,age:20}转换成对应的类型,然后通过反射执行方法saveStudent,把执行的结果返回给客户端,客户端显示返回的结果。

实验8 WEB 服务器开发

一、实验目的

1、了解tomcat整体架构以及基本工作原理。

2、了解tomcat连接器的代码架构。 3、学习编写一个简易的tomcat。

二、实验内容

27

1、程序验证题。

(1)输入以下程序,在浏览器输入http://localhost:8010/观察输出结果。

public class Server { public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket(8010); Socket socket = server.accept(); InputStream in = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); PrintWriter pw = new PrintWriter(socket.getOutputStream()); char[] buffer = new char[1024]; int len = br.read(buffer); StringBuffer reqStr = new StringBuffer(); for(int i=0; i

注意:要先运行 Server类,后运行Client。

2、程序填空题。

(1)要为服务器8010端口注册一个侦听器。请根据下面给出的程序补全程序。

public class Server{ public static void main(String[] args) throws Exception{ —————————— —————————— BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println(br.readLine()); socket.close(); } } (2)要为IP为127.0.1的客户端Client的8010端口创建一个Socket。请跟据下面给出的部分程序,补全程序。

public class Client { public static void main(String[] args) throws Exception{ —————————————— PrintWriter pw = new PrintWriter(socket.getOutputStream(),true); pw.write(\ pw.flush(); socket.close(); } } 三、根据下面要求,编写程序。

1、仔细阅读下面程序,画出程序的UML图。 public class Server { public static String WEBROOT = System.getProperty(\ public static String SHUTDOWN = \ private boolean live = true; /** 29 * 服务启动方法 * @throws Exception */

public class Request { private String title; //请求头 private String header; //请求体 private String body;//请求方法 private String method;//请求目的地址 private String uri;//请求使用的协议名称和版本 private String protocol;//请求消息的参数集合 private Map params = new HashMap();//请求消息的输入流 private InputStream in;//请求消息字符串 30 private String requestStr; public Request(){ }

protected void parse(){ if(this.requestStr.length() > 0){ int index = this.requestStr.indexOf(\ this.title = this.requestStr.substring(0,index); String context = this.requestStr.substring(index + 1); String[] elements = context.split(\ if(elements.length==1){ this.header = elements[0]; }else if(elements.length == 2){ this.header = elements[0]; 31 this.body = elements[1]; } this.parseTitle();//解析请求头

String[] param = element.split(\ if(param.length > 1){ //将请求数据放入请求参数集合中 this.addParam(param[0], param[1]); } } } } 32 public void addParam(String name, String value){ this.params.put(name, value); }

public class Response { private OutputStream out; private Request request; public Response(Request request, OutputStream out){ this.request = request; this.out = out; } /** * 响应请求时执行的方法。该方法以请求的URI指定的文件内容作为响应 * @throws Exception */ public void invoke() throws Exception { String path = request.getUri(); if(path != null && path.length() > 0){ String url = Server.WEBROOT + path; System.out.println(url); File file = new File(url); if(!file.exists()){ file = new File(Server.WEBROOT + \33 } this.report(file); } }

public class BootStrap { public static void main(String[] args) throws Exception{ Server server = new Server(); server.start(); } }

(2)仔细阅读老师给的简化版Tomcat,画出其项目构架图。

四、实验结果

写实验报告。内容包括:

1、习题的运行结果,源程序。 2、程序调试中出现的错误提示。(英文、中文对照) 3、若有没通过的程序,分析原因。

34

五、选做题目

(1)编写运行一个简化的Tomcat服务器。

35

本文来源:https://www.bwwdw.com/article/6y4x.html

Top