软件开发基础(.Java)实验指导书V2
更新时间:2024-03-18 20:44:01 阅读量: 综合文库 文档下载
- java软件开发培训基础推荐度:
- 相关推荐
软件开发基础(.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
(2)输入如下程序,观察输出结果。
publicclass TestHashSet { publicstaticvoid main(String[] args){ Set
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
Public static
(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. 服务器向指定客户端发送命令:
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
(2)编写和运行一个简单的Servlet
【步骤1】在Tomcat安装目录的webapps下建立一个helloapp的目录,在其中hello.jsp的文件
【步骤2】用记事本编辑hello.jsp文件,输入:
<%@ page contentType=\ import=\
<%
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=\
<% 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=\
<% 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定义和初始化参数定义
【步骤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=\
请输入一个书号:
32
【步骤4】下面的JSP页面bookInsert.jsp实现向数据库中插入数据 <%@ page contentType=\
请输入图书信息:
<% 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
四、要求上交实验报告,明确实验名称综合性实验
35
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 指导书
- 软件开发
- 实验
- 基础
- Java
- 2019高三数学理北师大版一轮课时分层训练:40 简单几何体的结构
- 简单随机截距模型参数估计与响应预测的最优设计
- 高中语文粤教版必修二学案:第二单元 第7课 中国现代
- 人工智能作业
- 基于单片机的烟雾报警系统 - 图文
- 碳酸岩和碎屑岩差异
- 家政服务公司门户网站的设计与实现毕业论文
- 对外汉语教师资格证基础理论复习大纲
- MIMO雷达 word电子版 - 图文
- 设计工作质量管理办法
- 云南省鲜花物流系统改进意见
- 浅谈中国传统文化对中医理论体系的影响
- 如何让学生在课堂学习中获得成功的快乐
- 湖南工大11级C语言网上作业之《文件》
- 声乐教案5《共和国之恋》
- (缩印)质量管理体系复习题
- 学习《中华人民共和国义务教育法》心得体会
- 广播、电视和移动通信
- 开展“干干净净迎春节”大宣传大治理行动的情况报告
- 腰围换算公式