软件开发基础(.Java)实验指导书V2

更新时间:2024-03-18 20:44:01 阅读量: 综合文库 文档下载

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

软件开发基础(.Java)

实验指导书

1

目录

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

1.1 上机实验的目的 ................................................................................................................ 1 1.2 上机实验基本要求 ............................................................................................................ 1 第二部分实验内容 ........................................................................................................................... 3

实验1 java集合框架与反射 ................................................................................................ 3 实验2 泛型与注解 .................................................................................................................. 7 实验3 Java网络编程 ............................................................................................................. 10 实验4 Java多线程编程 ......................................................................................................... 12 实验5 HTML编程 ............................................................................................................. 15 实验6 JSP编程 ...................................................................................................................... 18 实验7 Servlet编程 ................................................................................................................ 26 实验8 JSP+Servlet+JDBC编程 ......................................................................................... 30

2

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

1.1 上机实验的目的

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

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

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

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

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

1.2 上机实验基本要求

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

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

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

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

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

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

1

(3)源程序清单

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

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

2

第二部分实验内容

实验1 java集合框架与反射

一、实验目的

1、掌握java集合框架的层次体系结构、掌握规则集、线性表、队列及数据结构有关的算法。

2、了解类型信息的基本概念、类型信息的存储、类型信息的加载以及类型信息的表示,了解什么是反射、为什么需要反射以及深入反射机制。

3、深入了解Class类,通过Class对象实现反射机制。

二、实验内容

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

publicclass TestLinkedHashSet { publicstaticvoid 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()); } } } 3

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

publicclass TestHashSet { publicstaticvoid 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(); } } } (3)输入如下程序,编译看在bin目录下有无一个与此类同名的.class文件。

Public class Person{

}

(4)输入如下程序,编译后看在bin目录下会产生多少个.class文件,这些文件名的命名方式是怎样的?

Public class Person{ class Tool{ } interface Communication{ } } 4

(5)输入如下程序,编译并运行写出输出结果。

public class Bootstrap {

static{

System.out.println(\

}

public static void main(String[] args) {

ClassLoader loader = Bootstrap.class.getClassLoader();

System.out.println(loader);

System.out.println(loader.getParent());

System.out.println(loader.getParent().getParent());

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

1、编写一个程序,读取一个java源代码文件,然后报告该文件中关键字的个数。从命令行传递这个java源文件。 2、创建Person类,Person的属性有:

Strng name 姓名 String sex 性别 Integer age 年龄

String idNo 身份证号

Boolean isMerried 是否已婚 请生成相应的getter、setter方法,并创建两个构造方法:Person(),Person(String idNo),把Person编译成.class文件。请通过反射技术,为Person生成相应的.java代码,java代码中的方法的方法体为空,即方法内部代码不用生成。请注意生成的java代码的格式。

3、请为第1题目中Person类创建实例(对象),并为每个属性赋值,然后采用反射技术,把创建的Person实例的属性值存入文本文件中,文本文件的格式为: idNo = 5122245566 name = 张小平 age = 23 sex = Male

isMerried = true

四、实验结果

写实验报告。内容包括:

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

五、选做题目

1、写出Comparable和Comparator 两个接口的不同之处,以及各自的方法。

5

2、编写一条语句,找出由可以比较的对象构成的数组中的最大元素。 3、请采用反射技术为一个的类的所有私有属性生成相应的getter、setter方法。 4、思考Java的动态代理是怎么实现的?请试图设计动态代理功能,并实现核心的代码。(提示:如果在运行时能够把.java的文件编译成.class文件,是不是问题就可以解决)

5、编写一个实现IOC功能的简单Spring框架并编写测试程序。

6、创建代理类 PersonProxy,PersonProxy的在代理Person类的所有setter方法时,把方法的调用时间、方法名称写入到文本文件中,每一行日志的格式为: 时间:2012-09-01 23:34:24;方法名称:setName;参数:张小平

6

实验2 泛型与注解

一、实验目的

1、了解泛型的基本概念以及为什么要使用泛型,了解泛型类、泛型方法、泛型接口、泛型数组以及泛型的继承。

2、了解注解的基本概念和为什么使用注解/掌握常见的注解使用方法以及如何自定义注解。

3、学会如何利用注解解决实际编程中的问题

二、实验内容

(1)输入如下程序,编译看在bin目录下有无一个与此类同名的.class文件。

Public class Person{

}

(2)输入如下程序,编译后看在bin目录下会产生多少个.class文件,这些文件名的命名方式是怎样的?

Public class Person{ class Tool{ } interface Communication{ } } (3)输入如下程序,编译并运行写出输出结果。

public class Bootstrap {

static{

System.out.println(\

}

public static void main(String[] args) {

ClassLoader loader = Bootstrap.class.getClassLoader();

System.out.println(loader);

System.out.println(loader.getParent());

System.out.println(loader.getParent().getParent());

7

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

public class Person {

private String name;

public void speak(String message){

List list = new ArrayList();

System.out.println(\\

}

}

(5)输入如下程序,看程序结果是什么?

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

}

}

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

(1)设计一个泛型堆栈类GenericStack,并编写一个测试程序。 (2)创建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,方法

8

process的签名为:public Person process(Person person);

四、实验结果

写实验报告。内容包括:

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

五、选做题目

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

Public static >void selectionSort(E[] list)(2)使用泛型插入排序法实现下面的方法 Public static >void insertionSort(E[] list) (3)编写一个泛型方法返回二维数组的最大元素

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

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

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

9

实验3 Java网络编程

一、实验目的

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

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

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

二、实验内容

(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 { 三、根据下面要求编写程序

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

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

交互方式如下:

10

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

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

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

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

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

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

四、实验结果

写实验报告。内容包括:

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

五、选做习题

(1)请分别采用TCP、UDP协议编程实现一对多的文件上传。 (2)模仿QQ,设计实现一个聊天工具。

11

实验4 Java多线程编程

一、实验目的

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

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

二、实验内容

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

12

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

ublic class ThreadDemo { (3) public static void main(String[] args) { Thread t = new TestThread(); // t.setDaemon(true); t.start(); int i=0; while(true) { System.out.println(\if(i++ ==10000) { try { t.join(10000); }catch(InterruptedExceptione){ e.printStackTrace(); } } } } } class TestThread extends Thread { public void run() { while(true) { System.out.println(\ } } }

三、按照要求编写程序

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

(2)应用继承类Thread的方法实现多线程类,该线程3次休眠若干(随机)毫秒后显示线程名和第几次执行。

(3)请通过实现Runnable接口和继承Thread类分别创建线程,要求:除了main线程之外,还要创建一个新的线程。Main线程重复100次“main“,新线程重

13

复100次输出“new”。

四、实验结果

写实验报告。内容包括:

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

五、选做题目

1、编写一个多线程类,该类的构造方法调用Thread类带字符串参数的构造方法。建立自己的线程名,然后随机生成一个休眠时间,再将自己的线程名和休眠多长时间显示出来。该线程运行后,休眠一段时间,该时间就是在构造方法中生成的时间。最后编写一个测试类,创建多个不同名字的线程,并测试其运行情况。 2、编写一个用线程实现一个数字时钟的应用程序。该线程类要采用休眠的方式,把绝对大部分时间让系统使用。

3、编写一个使用继承Thread类的方法实现多线程的程序。该类有两个属性,一个字符串代表线程名,一个整数代表该线程要休眠的时间。线程执行时,显示线程名和休眠时间。

14

实验5 HTML与Web应用程序

一、实验目的

(1)熟悉HTML语法,JavaScript应用

(2)通过实验,熟练掌握MyEclipse 10的日常应用。 (3)理解Web应用程序。

二、实验内容

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

Head.html

学生信息管理系统

Left.html

学生成绩查询

学生信息显示

返回开始页面

right.html

这里是首页。

15

frame.html

在框架中显示页面

</p><p><body> </p><p>此网页使用了框架,但你的浏览器不支持。 </body> </p><p><frame src=”left.html” name=”left”> <frame src=”right.html” name=”right”> </p><p></frameset> </p><p>

(2)编写和运行一个简单的Servlet

【步骤1】在Tomcat安装目录的webapps下建立一个helloapp的目录,在其中hello.jsp的文件

【步骤2】用记事本编辑hello.jsp文件,输入:

<%@ page contentType=\ import=\

第一个使用JSP实现HelloWorld的例子

<%

out.print(\ %>

【步骤3】在浏览器的地址栏中输入下列地址访问该Servlet。

http://localhost:8080/helloapp/hello.jsp

在浏览器的窗口中应该显示Hello, World!内容。

16

三、编程题

1. 根据所提供的界面,编写register.html文件(表单form)。

2. 要求输入的数据中:用户名、密码、确认密码为必填项。即单击提交时如果这3项没有填写,界面给出提示必须填写。提示:使用HTML5或JavaScript实现。

3.要求2次填写的密码相同,如果不同,单击提交时给出提示。提示:用JavaScript实现。

四、实验结果

写实验报告。内容包括:

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

五、思考题

1. 如何安装配置JDK和Tomcat? 2. 如何在Tomcat中运行JSP页面?

17

实验6 JSP编程

一、实验目的

1. 熟练掌握JSP的声明、表达式、小脚本和注释的使用; 2. 理解JSP页面(page)指令和动作的语法格式; 3. 理解JSP页面的生命周期。

4. 熟练掌握page指令的下面的属性:import、session、errorPage、isErrorPage、contentType、pageEncoding。理解page指令的下面的属性:language、extends、buffer、autoFlush、info。

6. 掌握全部9个隐含对象的使用;理解4种作用域对象。

二、实验内容

(一)输入并执行下面JSP页面,文件名为counter.jsp

<%@ page language=\<%! int count = 0; %> <% count++; %>

Welcome! You are visitor number <%= count %> 【步骤1】该JSP页面包含哪些JSP语法元素。在浏览器中访问该页面,输出结果如何?多次刷新页面,结果如何?

【步骤2】打开counter.jsp转换后的源文件counter_jsp.java,对应的类文件在哪里?文件名是什么?

【步骤3】查看count变量是在哪里声明的?

【步骤4】将上面JSP页面中的<%! int count = 0; %>一行改为<% int count = 0; %>,页面能否正常执行,它与上面页面有什么区别? (二)有下面expression.jsp页面:

<%@ page language=\<%!

int anInt = 3;

boolean aBool = true;

Integer anIntObj = new Integer(3); Float aFloatObj = new Float(8.6); String str = \

StringBuffer sBuff = new StringBuffer(); char getChar(){ return 'A'; } %>

<%= 500 %>

<%= anInt*3.5/100-500 %> <%= aBool %> <%= false %> <%= !false %> <%= getChar() %>

<%= Math.random() %> <%= aVector %> <%= aFloatObj %>

<%= aFloatObj.floatValue() %> <%= aFloatObj.toString() %> <%= aBool; %>

18

<%= int i = 20 %>

<%= sBuff.setLength(12); %>

你能找出其中的错误吗?你可试着执行该页面,看会出现什么结果?将其中错误修改过来,最后输出下面结果:

图6.1 expression.jsp的运行结果

(三)运行下面persistent_counter.jsp页面,体会如何实现持久的计数器的? <%@ page language=\<%!

int count = 0; String dbPath;

public void jspInit(){ try{

dbPath = getServletContext().getRealPath(\FileInputStream fis = new FileInputStream(dbPath); DataInputStream dis = new DataInputStream(fis); count = dis.readInt(); dis.close(); }

catch(Exception e){

log(\} } %>

<%--下面是向浏览器输出的主要内容,

它将成为产生的_jspService()方法的一部分 --%>

<% count++; %>

Welcome! You are <%= count %>th visitor(s). <%!

public void jspDestroy(){ try{

FileOutputStream fos = new FileOutputStream(dbPath); DataOutputStream dos = new DataOutputStream(fos); dos.writeInt(count); dos.close(); }

catch(Exception e){

log(\} } %>

19

(四)输入并运行下面的import_test.jsp页面:

<%@ page import=\

page指令示例

<% Date date = new Date();

String s = DateFormat.getDateInstance().format(date);

String s2 = DateFormat.getDateInstance(DateFormat.FULL).format(date); %>

访问上述JSP页面,输出结果如下图所示:

图6.2 import_test.jsp页面的运行结果

可以看到页面中最后一行的中文显示为乱码,将下面代码加到JSP页面中: <%@ page contentType=\

重新访问页面,中文显示正常。这说明可以使用page指令的contentType属性指定页面输出使用的字符编码。默认情况下,JSP页面使用的字符集是iso-8859-1编码,如使用汉字编码应指定为gb2312或gbk。

(五) errorPage属性和isErrorPage属性的使用。

【步骤1】下面的hello.jsp页面执行时将抛出一个异常,它指定了错误处理页面为errorHandler.jsp。

<%@ page contentType=\

<%@ page errorPage=\ <%

String name = request.getParameter(\if (name==null){

throw new RuntimeException(\没有指定name 属性。\} %>

Hello, <%=name%>

【步骤2】下面的errorHandler.jsp是错误处理页面。

<%@ page contentType=\<%@ page isErrorPage=\

20

请求不能被处理:<%=exception.getMessage()%>
请重试!

用下面的URL访问hello.jsp页面,就会产生下面结果: http://localhost:8080/bookstore/hello.jsp

图6.3 errorHandler.jsp页面的运行结果

这说明没有提供name参数,hello.jsp页面中抛出RuntimeException异常,所以调用错误页面。

如果使用下面URL访问 hello.jsp页面,将产生下面正常的页面: http://localhost:8080/bookstore/hello.jsp?name=Mary

图6.4 hello.jsp页面的运行结果

注意:如果请求参数值使用汉字,仍然产生乱码,例如: http://localhost:8080/bookstore/hello.jsp?name=欧阳清风

这是因为请求参数默认使用iso-8859-1编码传递,如果要正确显示中文,应将请求参数编码转换为gb2312编码。

按下面方法修改hello.jsp页面,将请求参数值编码转换为汉字编码。 <%@ page contentType=\<%@ page errorPage=\ <%

String name = request.getParameter(\if (name==null){

throw new RuntimeException(\没有指定name 属性。\} else{

// 将字符串name的字符编码转换为汉字编码

name = new String(name.getBytes(\} %>

Hello, <%=name %>

21

(六)输入并执行下面JSP页面,文件名为counter.jsp

<%@ page language=\<%! int count = 0; %> <% count++; %>

Welcome! You are visitor number <%= count %> 【步骤1】该JSP页面包含哪些JSP语法元素。在浏览器中访问该页面,输出结果如何?多次刷新页面,结果如何?

【步骤2】打开counter.jsp转换后的源文件counter_jsp.java,对应的类文件在哪里?文件名是什么?

【步骤3】查看count变量是在哪里声明的?

【步骤4】将上面JSP页面中的<%! int count = 0; %>一行改为<% int count = 0; %>,页面能否正常执行,它与上面页面有什么区别?

(七)运行下面persistent_counter.jsp页面,体会如何实现持久的计数器的? <%@ page language=\<%!

int count = 0; String dbPath;

public void jspInit(){ try{

dbPath = getServletContext().getRealPath(\FileInputStream fis = new FileInputStream(dbPath); DataInputStream dis = new DataInputStream(fis); count = dis.readInt(); dis.close(); }

catch(Exception e){

log(\} } %>

<%--下面是向浏览器输出的主要内容,

它将成为产生的_jspService()方法的一部分 --%>

<% count++; %>

Welcome! You are <%= count %>th visitor(s). <%!

public void jspDestroy(){ try{

FileOutputStream fos = new FileOutputStream(dbPath); DataOutputStream dos = new DataOutputStream(fos); dos.writeInt(count); dos.close(); }

catch(Exception e){

log(\} } %>

22

(八)输入并运行下面的import_test.jsp页面:

<%@ page import=\

page指令示例

<% Date date = new Date();

String s = DateFormat.getDateInstance().format(date);

String s2 = DateFormat.getDateInstance(DateFormat.FULL).format(date); %>

访问上述JSP页面,输出结果如下图所示:

图6.2 import_test.jsp页面的运行结果

可以看到页面中最后一行的中文显示为乱码,将下面代码加到JSP页面中: <%@ page contentType=\

重新访问页面,中文显示正常。这说明可以使用page指令的contentType属性指定页面输出使用的字符编码。默认情况下,JSP页面使用的字符集是iso-8859-1编码,如使用汉字编码应指定为gb2312或gbk。

(九) errorPage属性和isErrorPage属性的使用。

【步骤1】下面的hello.jsp页面执行时将抛出一个异常,它指定了错误处理页面为errorHandler.jsp。

<%@ page contentType=\

<%@ page errorPage=\ <%

String name = request.getParameter(\if (name==null){

throw new RuntimeException(\没有指定name 属性。\} %>

Hello, <%=name%>

【步骤2】下面的errorHandler.jsp是错误处理页面。

<%@ page contentType=\<%@ page isErrorPage=\

23

请求不能被处理:<%=exception.getMessage()%>
请重试!

用下面的URL访问hello.jsp页面,就会产生下面结果: http://localhost:8080/bookstore/hello.jsp

图6.3 errorHandler.jsp页面的运行结果

这说明没有提供name参数,hello.jsp页面中抛出RuntimeException异常,所以调用错误页面。

如果使用下面URL访问 hello.jsp页面,将产生下面正常的页面: http://localhost:8080/bookstore/hello.jsp?name=Mary

图6.4 hello.jsp页面的运行结果

注意:如果请求参数值使用汉字,仍然产生乱码,例如: http://localhost:8080/bookstore/hello.jsp?name=欧阳清风

这是因为请求参数默认使用iso-8859-1编码传递,如果要正确显示中文,应将请求参数编码转换为gb2312编码。

按下面方法修改hello.jsp页面,将请求参数值编码转换为汉字编码。 <%@ page contentType=\<%@ page errorPage=\ <%

String name = request.getParameter(\if (name==null){

throw new RuntimeException(\没有指定name 属性。\} else{

// 将字符串name的字符编码转换为汉字编码

name = new String(name.getBytes(\} %>

Hello, <%=name %>

24

三、编程题

编写JSP程序,完成以下功能:

1. 编写login.jsp,登录时只输入一个昵称。但要检查昵称是否已经被其他用户使用。 2. 编写game.jsp, 每次游戏程序随机产生一个0-9之间的整数,要求玩家输入自己猜的数字,并对用户输入数字进行检查,进行如下提示:

(1)如果用户猜对了,则提示:恭喜你,猜对了。结束本次游戏。

(2)如果用户猜错了,则提示:你猜的数字太(大或小)了。要求用户继续猜。 如果连续3次没有猜对,则提示:游戏失败。

一次游戏结束时,将用户本次猜数字情况记入“排行榜”。

然后询问用户是否继续新的游戏,果用户选择继续,则开始新一次游戏, 3. 排行榜页面,显示所有参加游戏的用户的游戏情况。

昵称游戏次数成功次数

ABC 10 8 XYX 11 7

.......

4. 必须登录后才能进入游戏页面,而进入登录页面和排行榜页面,无须登录。 5. 提示,排行榜数据结构应该放在application中,用户登录状态放在session中。

四、实验结果

写实验报告。内容包括:

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

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

五、选做题目

1. JSP语法元素有哪些?使用时应注意什么问题? 2. JSP页面的生命周期有哪几个阶段? 3. 如何理解JSP页面本质上是Servlet?

4. page指令有哪些常用的属性,各自的功能是什么?

5在JSP页面中可以使用的隐含对象有哪几个?

6. 在JSP页面中可以使用的作用域对象有哪几个?它们都属于什么作用域?

25

实验7 Servlet编程

一、实验目的

1. 掌握Web应用程序的DD文件web.xml的配置方法和作用; 2. 掌握如何通过ServletConfig获取Servlet的初始化参数; 3. 掌握ServletContext的概念,如何获得ServletContext对象; 4. 掌握如何通过RequestDispatcher转发请求。

二、实验内容

(一)建立一个名为bookstore的Web应用程序

在Tomcat的webapps目录下,建立一个如下所示的目录结构:

|- bookstore

|- html (包含所有的HTML文件) |- jsp (包含所有的JSP文件)

|- images (包含所有的GIF、JPEG和BMP图象文件) |- index.html (默认的HTML文件) |- WEB-INF |-classes ├ lib

├ web.xml

图4.1 bookstore应用程序的目录结构

这样就建立了一个名为bookstore的Web应用程序,本实验后面的题目都在该应用程序下面完成。

(二)使用ServletConfig检索Servlet的初始化参数 【步骤1】编写ConfigDemoServlet程序,内容如下: package com.demo; import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*;

public class ConfigDemoServlet extends HttpServlet{ String servletName=null; ServletConfig config=null; String email=null; String telephone=null;

public void init() {

config = getServletConfig();

servletName = config.getServletName(); email = config.getInitParameter(\

telephone = config.getInitParameter(\ }

public void service(HttpServletRequest request, HttpServletResponse response)

26

throws ServletException,IOException{ response.setContentType(\ PrintWriter out = response.getWriter(); out.println(\

out.println(\名称:\out.println(\地址:\ out.println(\电话:\out.println(\} }

【步骤2】修改web.xml文件,在其中添加下面Servlet定义和初始化参数定义

configDemoServlet

com.demo.ConfigDemoServlet

email

hacker@163.com

telephone 8899123

1

configDemoServlet /configDemo.do

【步骤3】在浏览器的地址栏中输入下面URL访问该Servlet: http://localhost:8080/bookstore/configDemo.do 程序运行结果如下图所示:

图4.1 ConfigDemoServlet程序的运行结果

(三)ServletContext的使用

修改上面程序,将email地址和电话使用ServletContext初始化参数传递给ConfigDemoServlet。使用ServletContext对象将email地址和电话信息写入日志文件中,并查看日志文件。

(五)下面是一个Servlet,它可以获得有关服务器的信息。 package com.demo; import java.io.*; import java.util.*; import javax.servlet.*;

public class ServerInfo extends GenericServlet {

27

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { response.setContentType(\ PrintWriter out = response.getWriter(); ServletContext sc = getServletContext(); out.println(\ out.println(\ out.println(\ out.println(\获取服务器端信息\ out.println(\ out.println(\ out.println(\服务器端信息:

\ out.println(\ out.println(\ out.println(\站点名\ out.println(\ out.println(\ out.println(\ out.println(\端口号\ out.println(\ out.println(\ out.println(\ out.println(\服务器类型\ out.println(\ out.println(\ out.println(\ out.println(\支持Servlet版本\ out.println(\ out.println(\ out.println(\ out.println(\服务器属性\ out.println(\ // 获得服务器属性集合 Enumeration attributes = sc.getAttributeNames(); while (attributes.hasMoreElements()) { String name = (String)attributes.nextElement(); out.println(name); } out.println(\ out.println(\ out.println(\ out.println(\ out.println(\ } }

28

三、编程题

【步骤1】创建一个名为input.html的HTML页面,其中包括一个表单,表单中包含两个文本域,分别供用户输入学号和姓名,该页面也包含提交和重置按钮。

【步骤2】定义一个名为com.demo.Student类,其中包括学号sno和姓名name两个private的成员变量,定义访问和修改sno和name的方法。

【步骤3】编写名为FirstServlet的Servlet,要求当用户在input.html中输入信息后点击“提交”按钮,请求FirstServlet对其处理。在FirstServlet中使用表单传递的参数(学号和姓名)创建一个Student对象并将其作为属性存储在ServletContext对象中,然后获得通过ServletContext的getRequestDispatcher()方法获得RequestDispatcher()对象,将请求转发到SecondServlet。

【步骤4】在SecondServlet中取出ServletContext上存储的Student对象,并显示输出该学生的学号和姓名。在SecondServlet的输出中应该包含一个超链接,点击该连接可以返回input.html页面。

图4.2 input.html页面显示结果图4.3 SecondServlet显示结果

四、实验结果

写实验报告。内容包括:

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

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

五、思考题

1. 如何通过ServletConfig获得Servlet参数?

2. 如何获得ServletContext对象,如何通过该对象获得上下文参数? 3. 如何使用ServletContext共享数据?

29

实验8 综合性实验

一、实验目的

1、掌握基于MVC的三层架构。 二、实验题目

通过数据源和DAO对象访问数据库。其中JavaBeans实现模型,访问数据库,Servlet实现控制器,JSP页面实现视图。

模型包括2个JavaBean:BookBean用于存放图书信息,BookDAO用于访问数据库。 ? 控制器包括2个Servlet:BookQueryServlet根据请求参数查询图书信息、

BookInsertServlet用来向数据库中插入数据。 ? 视图包括4个JSP页面:bookQuery.jsp显示查询页面、bookInsert.jsp显示插入页面、

display.jsp显示查询结果页面和errorPage.jsp显示错误页面。

?

三、参考实现

实验采用MVC设计模式,

【步骤1】存放图书信息的JavaBeans代码BookBean.java,它也是一个传输对象。 package com.beans; import java.io.*;

public class BookBean implements Serializable{ private String bookid = null; private String title = null; private String author = null; private String publisher = null; private float price = 0.0F;

public BookBean(){}

public BookBean(String bookId, String author,

String title, String publisher,float price) { this.bookid = bookId; this.title = title; this.author = author;

this.publisher = publisher;

this.price = price;

}

public String getBookid() { return this.bookid; } public String getTitle() { return title; }

public String getAuthor() { return this.author; } public float getPrice() { return price; }

public String getPublisher () { return publisher; }

public void setBookid(String bookid){ this.bookid=bookid; } public void setTitle(String title){this.title=title; }

public void setAuthor(String author){ this. author = author; } public void setPrice(float price){this.price=price; }

30

public void setPublisher (String publisher){ this.publisher = publisher;} }

【步骤2】下面的BookDAO是一个简单的JavaBeans,它实现数据库的访问。 package com.beans; import java.sql.*; import javax.sql.*; import javax.naming.*; import java.util.ArrayList; import com.beans.BookBean;

public class BookDAO{

private static InitialContext context= null; private DataSource dataSource = null;

public BookDAO(){ try{ if(context == null){ context = new InitialContext(); } dataSource = (DataSource)context.lookup(\ }catch(NamingException e2){ } }

// 根据书号查询图书信息

public BookBean searchBook(String bookid){ Connection conn = null;

PreparedStatement pstmt = null; ResultSet rst = null;

BookBean book = new BookBean(); try{

conn = dataSource.getConnection(); pstmt = conn.prepareStatement(\ pstmt.setString(1,bookid); rst = pstmt.executeQuery(); if(rst.next()){ book.setBookid(rst.getString(\ book.setTitle(rst.getString(\ book.setAuthor(rst.getString(\

book.setPublisher(rst.getString(\ book.setPrice(rst.getFloat(\ return book; }else{

return null; }

31

}catch(SQLException se){ return null; }finally{ try{ conn.close(); }catch(SQLException se){ } } }

// 插入一本图书记录

public boolean insertBook(BookBean book){ Connection conn = null; PreparedStatement pstmt = null; try{ conn = dataSource.getConnection(); pstmt = conn.prepareStatement( \ pstmt.setString(1,book.getBookid()); pstmt.setString(2,book.getTitle()); pstmt.setString(3,book.getAuthor()); pstmt.setString(4,book.getPublisher()); pstmt.setFloat(3,book.getPrice()); pstmt.executeUpdate(); pstmt.close(); return true; }catch(SQLException se){ return false; }finally{ try{ conn.close(); }catch(SQLException se){ } } } }

【步骤3】下面的JSP页面bookQuery.jsp实现根据书号查询图书信息 <%@ page contentType=\Book Query

请输入一个书号:

32

【步骤4】下面的JSP页面bookInsert.jsp实现向数据库中插入数据 <%@ page contentType=\Book Insert

请输入图书信息:

<% if(request.getAttribute(\ out.print(request.getAttribute(\%>

【步骤5】显示查询结果的JSP页面display.jsp:

<%@ page contentType=\

书号:

出版社:

【步骤6】错误页面errorPage.jsp代码如下:

<%@ page contentType=\

对不起,您查的图书不存在!

【步骤7】下面的Servlet实现从请求参数获得书号,然后从数据库中查找该书,最后根据查询结果将请求转发到显示页面(display.jsp)或错误页面(errorPage.jsp)。

package com.control;

import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; import com.beans.BookBean; import com.beans.BookDAO;

public class BookQueryServlet extends HttpServlet{

public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ String bookid = request.getParameter(\ BookDAO bookdao = new BookDAO();

33

BookBean book = bookdao.searchBook(bookid);

if(book!=null){

request.getSession().setAttribute(\

RequestDispatcher view = request.getRequestDispatcher(\ view.forward(request, response); }else{

RequestDispatcher view = request.getRequestDispatcher(\ view.forward(request, response); } } }

【步骤8】下面的Servlet实现向数据库插入数据,并将控制请求的转发到bookInsert.jsp页面。

package com.control;

import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; import com.beans.BookBean; import com.beans.BookDAO;

public class BookInsertServlet extends HttpServlet{

public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{

request.setCharacterEncoding(\ String message = null;

BookBean book = new BookBean(

request.getParameter(\ request.getParameter(\ Float.parseFloat(request.getParameter(\ );

BookDAO bookdao = new BookDAO();

boolean success = bookdao.insertBook(book); if(success){

message = \成功插入一条记录!\ }else{

message = \插入记录错误!\ }

request.setAttribute(\

RequestDispatcher view = request.getRequestDispatcher(\ view.forward(request, response); } }

【步骤9】在DD文件中部署Servlet,将下列代码添加到DD文件的适当位置:

34

bookQuery

com.control.BookQueryServlet

bookInsert

com.control.BookInsertServlet

bookQuery /bookquery.do

bookInsert /bookinsert.do

四、要求上交实验报告,明确实验名称综合性实验

35

本文来源:https://www.bwwdw.com/article/7cv8.html

Top