2023年11月28日发(作者:)

安徽农业大学《Web开发技术》JSP版课程配套教材

Web开发技术》实验指导书

JSP版)

编写

安徽农业大学信息与计算机学院

通信工程

20082

实验一 搭建JSP运行的实验环境 .................................................................. 1

实验二 JSP页面 ............................................................................................... 3

实验三 显示不同大小的“你好JSP” .............................................................. 7

实验四 JSP指令和动作 ................................................................................. 10

实验五 Tag文件的代码复用 ......................................................................... 12

实验六 中文显示服务器端日期 .................................................................... 14

实验七 JSP内置对象 ..................................................................................... 19

实验八 session对象 ........................................................................................ 23

实验九 简易留言板 ........................................................................................ 28

实验十 JSP中使用Java Bean ........................................................................ 31

实验十一 JSP中的文件操作 ......................................................................... 41

实验十二 JSP中使用数据库 ......................................................................... 48

实验十三 Java Servlet ..................................................................................... 66

实验十四 网上书店 ........................................................................................ 71

实验报告………………………………………………………………………..76

2

实验一 搭建JSP运行的实验环境

一、实验目的

1)掌握JSP运行环境的安装与配置

2)理解JSPServlet的关系

3)运行简单的JSP页面,理解JSP的运行原理

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具-记事本

3Tomcat服务器,也可以从网上免费下载

三、实验步骤

1)按教材中演示安装JDK

2)按教材中演示安装Tomcat

3)启动Tomcat服务器,在浏览器中输入:localhost:8080,观察主页内容

4)观察Tomcat安装目录下的各个子目录的内容

5)打开记事本,输入下列源代码并保存为。将此文件复制到Tomcat安装目

录下的webappsROOT目录下,运行该页面,观察其对应的Servlet源代码。

的代码:

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="" %>

<%! Date date; // 数据声明

int sum;

public int add(int m,int n) // 方法声明

{ return m+n;

}

%>

html标记 -->

程序片创建Date对象:

<% Date date=new Date(); //java程序片

n("
"+date);

sum=add(12,34);

%>


在下一行输出和:

<%= sum+100 %>

1

6)将文件复制到Tomcat安装目录下的webappsexamples目录下,运行该页

面,观察其对应的Servlet源代码。

7)将文件复制到Tomcat安装目录下的webappswebdav目录下,运行该页

面,观察其对应的Servlet源代码。

四、实验思考题

1JDK安装完毕后,需要添加哪些环境变量?

2)在Tomcat安装目录下的webapps文件夹中,新建一文件夹myapp,将

Tomcatwebappsmyapp

localhost:8080/myapp/

若在d:盘根目录建立一个文件夹myweb,将文件复制到d:myweb目录下,

行该页面(localhost:8080/myweb/ ,结果如何?

2

若要正确显示该页面,还应做如何处理?提示:修改conf目录下的文件。

3Tomcat默认端口号为8080,如何更改端口号?

4)编写一个JSP页面,用于显示1100的整数和。

五、实验报告要求

1)分析JSP的工作原理,说明JSP文件和Servlet的关系

2)根据实验运行情况,对实验步骤和运行结果进行阐述

3)完成实验思考题的解答

实验二 JSP页面

一、实验目的

1)熟悉典型JSP页面的组成元素,掌握HTML标记和JSP标记的不同

2)掌握在HTML页面中插入JSP脚本(java代码)的方法

2)编写简单的JSP页面,初步掌握JSP网页的设计原理

3

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

三、实验步骤

1)打开记事本,输入以下代码,保存为exer2_,观察其运行结果

exer2_

<%@ page contentType="text/html;Charset=GB2312" %>

<%! int count=0; //被客户共享的count

synchronized void setCount() //synchronized

{ count++;

}

%>

<% setCount();

n("您是第"+count+"个访问本站的客户");

%>

2JSP声明类(比较教材P15P16页的声明变量和声明方法)JSP页面对应的

Servlet类的内部类,页面上所有脚本元素都可以创建该类的对象。下面的实例定义一个

square类,当客户访问该页面时,服务器创建该类的对象,只要客户给出正方形的边长,

就可以求出该正方形的周长和面积,创建并运行exer2_,观察运行结果

exer2_

<%@ page contentType="text/html; charset=gb2312" %>

请输入正方形边长

<%! public class square

{ double r;

square(double r) {this.r=r;}

double getarea() {return r*r;}

double getlength() {return r*4;}

4

}

%>

<%

String s=ameter("cat");

double r;

if (s!=null)

{r=f(s).doubleValue();}

else

{r=1;}

%>

方的面积是:<%=a() %>

方的周长是:<%=gth() %>

square cc=new square(r);//创建对象

3)编写exer2_,熟悉在“<%=”和“%>”之间插入表达式,用于输出表达式计

算结果的方法

exer2_

<%@ page contentType="text/html;charset=GB2312" %>

bgcolor=cyan>

Sin(0.9)除以3等于

<%=(0.90)/3%>

3的平方是:

<%=(3,2)%>

1234567972等于

<%=12345679*72%>

5的平方根等于

<%=(5)%>

99大于100吗?回答:

<%=99>100%>

4)在DreamweaverFrontPage中利用可视化方法,编写

<%@ page contentType="text/html;Charset=GB2312" %>

请输入下列信息:


输入您的姓名:


选择性别:

5



选择您喜欢的歌手:

张歌手

李歌手

刘歌手

王歌手


<%@ page contentType="text/html;Charset=GB2312" %>

<% String yourName=ameter("name"); // 获取text提交的值

String yourSex=ameter("R"); //获取radio提交的值

String secretMess=ameter("secret"); //获取hidden提交的值

String personName[]=ameterValues("superstar"); //获取checkbox提交的值

n("

您的姓名:"+yourName+"

");

n("

您的性别:"+yourSex+"

");

n("

您喜欢的歌手:");

if(personName==null)

{ ("一个都不喜欢");

}

else

{ for(int k=0;k<;k++)

{ n(" "+personName[k]);

}

}

n("

hidden提交的值:"+secretMess);

%>

四、设计性实验环节

1)编写一个jiecheng类,当客户在浏览器中给出指定的正整数N,能计算N的阶乘。

创建能实现此功能的jsp文件,观察运行结果(参考exer2_

2)编写程序,学会在声明中定义类student,初始化该类(学号、姓名、

成绩),用表格形式输出“班号(学号的前4位)、学号、姓名、成绩”(选做)

6

五、实验报告要求

1)分析JSP的脚本元素,说明JSP标记和html标记的不同

2)根据实验运行情况,对实验步骤和运行结果进行阐述

3)完成实验设计题的解答

实验三 显示不同大小的“你好JSP选做

一、实验目的

1)掌握控制字体显示大小的方法

2)掌握For语句,显示变量值

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

三、实验原理和内容

本程序运行后,在浏览器页面上显示不同字体大小的“你好Jsp,如图31所示,

程序的流程图如图32所示。

1 程序知识点

显示变量值

JSP中,获取变量值可使用“<%=valname%>”来实现,valname可以是一个整型

字符型的变量。

31 浏览器显示不同字体大小

For语句

For语句的格式如下

for (initialization Statement; conditional Expression; increment Statement)

7

{ loopBody

}

为了执行For语句,首先执行初始化语句,然后再对条件表达式求值,如果值为

TRUE,则执行循环体,随后执行递增语句。表达式的求值和循环体与递增语句的执行

不断重复,直到条件表达式的值变为false。多个初始化和增量语句可以用逗号隔开。

For循环的初始化部分可以声明局部循环变量,循环变量的范围在循环体内部。这

些循环变量遵循在块内有效的一般规则,即用大括号作为程序块,变量在块内声明,不

能与范围外边的变量同名,也不能在循环外引用。

32 程序流程图

控制字体大小

HTML语言中,控制文字大小可使用“n16,因此,可以使用循

环语句来控制n的变化。然后,使用>,来显示字体大小渐变的“你好JSP

2、程序代码(

<%@ page contentType="text/html; charset=gb2312" language="java" %>

</span><span style='font-size:13.5px;color:#000000;font-family:宋体;'>显示不同大小字体</span><span style='font-size:13.5px;color:#000000;font-family:Times New Roman;'>

8

<%

//利用For循环控制字体由大到小

for(int i=1;i<6;i++)

{

%>

>你好 JSP>

<%

}

//利用For循环控制字体由小到大

for( ; ; ) //完成空格中的内容

{

%>

>你好 JSP>

<%

}

%>

3、观察运行结果

四、综合设计实验环节

综合思考:结合实验二和实验三,编写,根据变量和for循环

生成表格的行和列,结果如下图33和图34所示:

33 执行结果 34执行“确定”后结果

五、实验报告要求

1)根据实验运行情况,对实验步骤和运行结果进行阐述

2)完成综合设计环节的解答

9

实验四 JSP指令和动作

一、实验目的

1)综合掌握在JSP中使用指令标记

2)综合掌握在JSP中使用动作标记

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

三、实验步骤

1Page指令的使用

1)打开记事本,输入以下文档,并保存为

<%@ page contentType="text/html; charset=gb2312" language="java" import=".*,.*"

session="true" buffer="12kb" autoFlush="true" info="my page directory jsp" errorPage="false"

isThreadSafe="false" %>

Done

This program example how to use page Directive

2)将复制到Tomcate安装目录下的webappsROOT

3)在IE地址栏输入localhost:8080/

2page指令import属性的使用

1)打开记事本,输入以下文档,并保存为

<%-- get Year --%>

<%@ page import=".*" %>

CurrentYear=<%=tance().get() %>

2)将复制到Tomcate安装目录下的webappsROOT

3)在IE地址栏输入localhost:8080/

10

3include指令的使用

1)打开记事本,输入以下文档,并保存为

<%!String companyName="SSI Consulting"; %>

©2002 <%=companyName%>

Any unauthorized use of these materials will be prosecuted to the fullest extent of the law

2)打开记事本,输入以下文档,并保存为

<%@ page contentType="text/html; charset=gb2312" language="java" %>

This page is unde contruction

<%@ include file="" %>

Last updated:March 2008

>

3)将复制到Tomcate安装目录下的webappsROOT

4)在IE地址栏输入localhost:8080/

四、设计性实验环节

1编写JSP页面,*显示一个7×7方阵的边框和对角线,结果如图41所示。

* * * * * * *

* * * *

* * * *

* * *

* * * *

* * * *

* * * * * * *

41 练习1运行结果

2编写JSP页面,判断字符串是否为回文,并用表格显示出来,结果如图42所示。

提示:使用StringBuffer类的reverse()颠倒某字符串的顺序,若字符串与颠倒后的字符串

相等,则该串为回文。(选做)

11

42 练习2的运行结果

3张三手头分别有800美元和1860美元,编写一个JSP页面,把他的美元换成人民

币,并用表格显示出来。假设当前美元兑换人民币的汇率是7.82(选做)

4、编写JSP页面分别显示110之间的各数字的阶乘。

实验五 Tag文件的代码复用

一、实验目的

1Tag文件的编写、保存以及Tag标记的使用

2)编写JSP页面,使用Tag标记实现代码的复用

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

三、实验步骤

1Tag文件是扩展名为.tag的文本文件,其结构几乎和JSP文件相同,只是扩展名不

同而已。也就是说,一个Tag文件中可以有普通的HTML标记符、某些特殊的指令标记、

成员变量和方法、Java程序片和Java表达式等。在记事本中编写如下一个Tag文件

这是一个Tag文件,负责计算三角形的面积:

<%@ attribute name="sideA" required="true" %>

<%@ attribute name="sideB" required="true" %>

<%@ attribute name="sideC" required="true" %>

<%! public String getArea(double a,double b,double c)

{ if(a+b>c&&a+c>b&&c+b>a)

{ double p=(a+b+c)/2.0;

double area=(p*(p-a)*(p-b)*(p-c)) ;

return "
三角形的面积:"+area;

12

}

else

{ return("
"+a+","+b+","+c+"
不能构成一个三角形,无法计算面积");

}

}

%>

<% n("
jsp
页面传递过来的三边:"+sideA+","+sideB+","+sideC);

double a=ouble(sideA);

double b=ouble(sideB);

double c=ouble(sideC);

n(getArea(a,b,c));

%>

2)将保存在..ROOTWEB-INF目录下

3)在ROOT目录下编写exer5_文件,代码如下:

<%@ page contentType="text/html;Charset=GB2312" %>

<%@ taglib tagdir="/WEB-INF/tags" prefix="computer"%>

请选择三角形的三条边

SIDE A:

SIDE B:

13

<% String sideaa=ameter("select1");

String sidebb=ameter("select2");

String sidecc=ameter("select3");

%>

<%if (sideaa==null){sideaa="3";}

if (sidebb==null){sidebb="4";}

if (sidecc==null){sidecc="5";}

%>

以下是调用Tag文件的效果:

4)在IE地址栏输入localhost:8080/exer5_

四、综合设计实验环节

编写两个Tag文件负责计算矩形的面积,

负责计算圆的面积。编写一个JSP页面,该JSP页面使用Tag标记调用

。调用时,向其传递矩形的两个边的长度;调用时,向其传

递圆的半径。

实验六 中文显示服务器端日期(选做

一、实验目的

1)掌握在JSPSwitch语句的使用

2)掌握Date类使用。

3)熟悉intString的区别

4)通过实例编程,综合掌握实用网页编程技巧

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

三、实验原理和内容

本实例运行后.将在浏览器上用中文显示当前服务端的日期,如图61所示。

14

61 服务器端的日期

1、程序知识点

Date类及其引用

Date是在jdkjavautil这个包下的一个类,它支持日历和时间,并且包含了

getYear()getMonth()getDate()getDay()几个方法,分别为获取系统年份、系统月份、

系统日期、系统星期,并且返回的都是整型。其标准用法为:

dt=new ();

int year=r();

当然也可先用import语句使包中定义的类和接口,可以只用类名而不用全名来引用

用法为(import语句一定要放在程序开头)

import .*;

Date dt=new Date();

int year=r();

以上例句Date dt=new Date()中用new语句生成一个新对象dtDate类进行引用,

Date()是类Date的构造函数。然后可以对Date类中的getYear()方法进行调用。但得

到的返回值要加1900才是现在年份。同样用getMonth()得到的返回值也要加1才是现在

的月份。

intString的区别

Java中它们是两个完全不同的概念。int是一个类型,而String是一个类。所以

在转换上是不能进行简单的强制型转换(int num=(int)string)在此需要采用String类中的

一个方法,一般用法如下:

String str_year=f(year)

Switch语句

switch语句能够根据表达式的值决定执行多个操作中的一个或者几个。switch的一

般格式为:

switch (expression)

{

case value1statement1break

……

case valueNstatemendNbreak

[defaultdefault_Statement]

}

15

expression可以返回任一简单类型的值,case子句中的值valueI必须是常量,而且所

case子句中的值应是不同的。多分支语句把表达式返回的值与每个case 子句中的值

相比,如果匹配成功,则执行该case子句后的语句序列,否则执行default中的语句;

果没有default,则不进行任何操作。而case字句中的break用于跳出switch,如果没有

breakswitch会顺序执行下个case中的语句,直至遇到break语句或者执行完所有的

case或者default语句。

switch语句中使用的表达式必须为整型表达式或不丢失便可显式地转换为整型的表

达式。不丢失便可显式地转换为整型的数据类型包括字节、字符和短型数。对于长型数、

浮点数和双精度数等数据类型,需明确地转换。case值必须能够求值或编译时能隐含地

转换为整型的常量表达式。

62 程序流程图

程序实现过程

可以先获取系统的日期,然后将月份和日期统一成二位整型的格式,再将获取的系

统时间拼成字符串,最后利用For循环和swtich语句获取中文时间信息并显示。62

显示程序流程图

2、部分程序关键源码(

<%@ page contentType="text/html; charset=gb2312" import=".*" %>

<% Date dtt=new Date();

int year=r();

year+=1900;

//获取月份

int month=th();

month+=1;

//获取日期

int date=e();

//获取星期

16

int day=();

//int型转换为String

String str_year=f(year);

String str_month=f(month);

String str_date=f(date);

String str_day=f(day);

//将月份和日期统一成二位整型

if(str_()==1)

{

str_month="0"+str_month;

}

if(str_()==1)

{

str_date="0"+str_date;

}

//将获取的系统时间拼成字符串

String str_i=str_year+str_month+str_date+str_day;

String chi_num="";

String chi_num_total="";

char cha_i=' ';

String chi_year=null;

String chi_month=null;

String chi_date=null;

String chi_day=null;

//for循环和switch语句获取中文时间信息

for(int j=0;j

{

cha_i=str_(j);

switch(cha_i)

{

chi_month=chi_num_total;

chi_num_total="";

}

if(j==7)

{

chi_date=chi_num_total;

chi_num_total="";

}

if(j==8)

{

if(cha_i=='0')

{chi_num_total="";}

chi_day=chi_num_total;

}

}

//得到最终结果

String chi_dt="今天是"+chi_year+""+chi_month+""+chi_date+" "+"星期"+chi_day;

%>

<%=chi_dt%>

四、实验思考

上述中,for循环体中有这样一段语句:

if(j==4||j==6)

{

if((cha_i=='1')||(cha_i=='0'))

{chi_num_total="";}

if(cha_i!='0')

{chi_num_total+="";}

}

试问:如果将语句改成:

if(j==4||j==6)

{

if(cha_i=='0')

{chi_num_total="";}

else

{chi_num_total+="";}

}

这样修改能不能正确显示,为什么?

五、综合实验

判断服务端时间并显示中文问候

编写JSP程序,运行后,程序将根据服务端的不同时间段,在浏览器上显示“早上好”

“中午好”“下午好”和“晚上好”,如图63所示。

18

63 显示结果

提示:利用Date类的getHours()函数可得到24小时制的服务器端时间,并根据当前时间

来判断是何段时间:

511点:早上;1114点:中午

1418点:下午;18点~5点:晚上

实验七 JSP内置对象(4课时

一、实验目的

1)掌握JSP中内置request对象的使用

2)掌握response对象的使用,并熟悉setContentType方法

3)掌握out对象的使用

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

三、实验内容与步骤

1request对象的使用(获取表单中提交的信息)

jsp中,当用户通过浏览器请求一个页面时,浏览器将请求发送给服务器。按照

HTTP协议,浏览器发送的请求具有一定的结构,请求包括一个请求行、头域和表单提

交的信息体。使用request对象,可以获取用户浏览器提交的请求信息。request对象常

用的方法是getParameterString s,该方法获取表单提交的信息。

1)在ROOT目录下编写如下源码:exer7_

<%@ page contentType="text/html;Charset=GB2312" %>

<%@ taglib tagdir="/WEB-INF/tags" prefix="com"%>

action="" method=post name=form>

19

<% String textContent=ameter("number");

if(textContent==null)

{ n("请在文本框中输入数字,按提交按钮");

}

else

{

%>

调用文件负责计算平方根

<% }

%>

2)在ROOTtags目录下编写如下源码:

<%@ attribute name="number" %>

<% try{ double n=ouble(number);

if(n>=0)

{ double r=(n) ;

("
"+n+"
的平方根:");

("
"+r);

}

else

{ ("
"+"
请输入一个正数");

}

}

catch(NumberFormatException e)

{ ("
"+"
请输入数字字符");

}

%>

3)在浏览器输入:localhost:8080/exer7_,观察其运行结果

4)将Form提交请求的方法改成get,观察其运行结果,体会get方法和post方法的不

同。

2response对象的使用

1)利用response对象的setContentType方法,改变显示方式。将下列源码保存为

exer7_,运行后观察其结果:

<%@ page contentType="text/html;Charset=GB2312" %>

在学习response对象的setContentType方法

20

将当前页面用MS-Word显示吗?

将当前页面用MS-Powerpoint显示吗?

<% String str=ameter("submit");

if(str==null)

{ str="";

}

if(("MS-Word显示"))

{ tentType("application/msword");

}

else if(("MS-Powerpoint显示"))

{ tentType("application/-powerpoint");

}

%>

2)利用response对象实现页面重定向。将下列源码保存为exer7_,运

exer7_后观察其结果:

exer7_

<%@ page contentType="text/html;charset=GB2312" %>

填写姓名:

<%@ page contentType="text/html;Charset=GB2312" %>

<% String str=null;

str=ameter("boy");

if(()==0)

{ direct("exer7_");

}

else

{ ("欢迎您来到本网页!");

21

(str);

}

%>

3out对象的使用

out对象是一个输出流,该对象调用相应的方法可以将数据发送到客户端浏览器的

缓存中。其中println()print()是常用的两个方法,其区别是:println()会向缓存区写入

一个换行,print()不写入换行。但是浏览器的显示区域目前不识别println()写入的换行,

如果希望浏览器显示换行,应当向浏览器写入
实现换行。

下面的实例exer7_4使用out对象向客户输出包括表格等内容的信息,运行该实例并

观察结果。

Exer7_

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import=".*" %>

<% int a=2200;long b=3456;boolean c=true;

n(a);

n(b);

("
");

n(c);

%>

以下是一个表格

<% ("隶书 size=2 >");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

22

n("

"+"姓名"+""+"性别"+""+"出生日期"+"
"+"张三"+""+""+""+"19885"+"
"+"李四"+""+""+""+"198710"+"
");

("") ;

%>

四、设计性实验环节

1编写两个页面用户可以使用

提供的表单输入一个数字,并提交给页面。该页面通过内置对象

获取页面提交的数字,计算并显示该数的平方和立方,并用out对象输

出结果。若页面提交的不是数字,页面应能重定

向到页面。

(必做)

2、编写程序,做一个用户注册的界面,要求对用户填写的部

分进行合法性检验,然后提交到进行注册检验,若用户名为user开头的,就

提示“该用户名已被注册”,若用户名为admin,就提示“欢迎您,管理员”,否则,就

显示“注册成功”

(必做)

实验八 session对象(4课时

一、实验目的

掌握JSP中内置session对象的使用

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

三、实验原理与内容

1、利用session对象存储数据。本实例利用session对象模拟购物车,存储客户的姓名和

购买的商品,三个JSP页面分别是:。代码如下,分析下列

代码,完成实验练习(1

<%@ page contentType="text/html;Charset=GB2312" %>

欢迎来到本页面,请输入您的姓名

23

<% String name=ameter("name");

if(name==null)

{ name="";

}

else

{ ribute("customerName",name);

}

%>

<% if(()>0)

{

%>

点击超链接,连接到的页面,去采购食品。

欢迎去食品柜台!

<% }

%>

<%@ page contentType="text/html;charset=GB2312" %>

点击超链接,连接到的页面,去修改姓名。

欢迎去

这里是食品柜台,请选择您要购买的食品:

香肠

苹果

酱油

饮料


<% String foodName[]=ameterValues("choice");

if(foodName!=null)

{ for(int k=0;k<;k++)

{ ribute(foodName[k],foodName[k]);

}

}

%>

点击超链接,连接到的页面,去查看购物车中的商品。

24

欢迎去

<%@ page contentType="text/html;Charset=GB2312" %>

<%@ page import=".*" %>

这里是结帐处,您的姓名以及选择的商品:

<% String personName=(String)ribute("customerName");

n("
您的姓名:"+personName);

Enumeration enumGoods=ributeNames();

n("
购物车中的商品:
");

while(eElements())

{ String key=(String)ement();

String goods=(String)ribute(key);

if(!((personName)))

n(goods+"
");

}

%>

点击超链接,连接到的页面,购买食品。

欢迎去

点击超链接,连接到的页面,去修改姓名。

欢迎去

2)下例是利用session完成的一个猜数字的游戏,当客户端访问exer8_时,页面

产生一个1100的随机数,并将其存入session对象,然后让客户猜这个数字。客户输

入数后提交,该页面将客户猜的数和产生的随机数进行比较,若猜对了,连接

。该页面显示客户猜数所用的时间等信息。若猜的数字大于随机数,连接

;否则连接到。这两个页面都要求客户重新猜数。五个jsp页面的代

码如下:

exer8_

<%@ page contentType="text/html; charset=gb2312" import=".*" %>

</span><span style='font-size:13.5px;color:#000000;font-family:宋体;'>猜数字</span><span style='font-size:13.5px;color:#000000;font-family:Times New Roman;'>

随机分给了逆一个1100之间的数字,请猜猜这个数

<%

int number=(int)(()*100)+1;

ribute("count",new Integer(0));

ribute("save",new Integer(number));

25

%>

输入你猜的数

的关键代码:

<%

String str=ameter("boy");

int guessNumber=nt(str);

Integer integer=(Integer)ribute("save");

int realnumber=ue();

if(guessNumber==realnumber)

{

int n=((Integer)ribute("count")).intValue();

<%

Integer integer=(Integer)ribute("count");

int ccc=ue();

%>

你已经猜了<%=ccc%>次了

请再输入你猜的数

的关键代码:

<%@ page contentType="text/html; charset=gb2312" %>

small

所猜的数比实际的数小,请再猜:

<%

Integer integer=(Integer)ribute("count");

int ccc=ue();

%>

你已经猜了<%=ccc%>次了

请再输入你猜的数

这个数字就是<%=num%>

你必须关掉浏览器才能得到新的数字

四、实验练习

改进实验内容1页面中,用户可以输入年龄和性别,并用session保存。

五、综合实验

利用session完成的一个猜双数字的游戏,当客户端访问exer8_时,页面产生

两个1100的随机数,并将其存入session对象,然后让客户猜这两个个数字,如图8

1所示。客户输入数后提交,该页面将客户猜的数和产生的随机数进行比较:

1)若两个猜对了,连接到

2)若猜的两个数字均大于随机数,连接到

3)若猜的两个数字均小于随机数,连接到

5)若猜的第一个数字大,第二个数字小,连接到

6)若猜的第一个数字小,第二个数字大,连接到

7)若猜的两个数字中,有一个数猜测成功,继续另一个数的猜测:若大于随机数,连接

;若小于随机数,连接到

81 实验练习2运行效果

实验九 简易留言板(选做

一、实验目的

综合掌握各种JSP指令和标记,重点掌握JSP中内置application对象的使用

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

28

3Tomcat服务器,也可以从网上免费下载

三、实验原理与内容

1、不同用户的session对象互相不同,而所有用户的application对象是共享的,因此

application对象负责提供应用程序在服务器中运行时的一些全局信息。服务器启动时就

创建一个application对象,当一个客户访问服务器上的一个JSP页面时,JSP引擎就为

该客户分配这个application对象,所有客户共用一个application对象。

2在下面的实例中,客户通过页面提交姓名、留言标题和

留言内容,页面获取这些信息之后,用同步方法将这些内容添加到一个

量中,然后将这个向量再添加到application象中。当用户查留言板时,

负责显示所有客户的留言内容,即从application对象中取出向量,然后

遍历向量中存储的信息。

Java包中的Vector类负责创建一个向量对象:Vector a=new Vector()a

可以使用add(Object o)把任何对象添加到向量的末尾,向量的大小会自动的增加。可以

使用add(int index, Object o)把任何对象添加到向量的指定位置。可以使用elementAt(int

index)获取指定索引处的向量的元素(索引初始位置是0a可以使用方法size()获取向

量所有的元素的个数。

3

<%@ page contentType="text/html;charset=GB2312" %>

输入您的名字:

type="text" name="peopleName">


输入您的留言标题:

type="text" name="Title">


输入您的留言:



4

<%@ page contentType="text/html;Charset=GB2312" %>

<%@ page import=".*" %>

29

<%! Vector v=new Vector();

ServletContext application;

synchronized void sendMessage(String s)

{ application=getServletContext();;

(s);

ribute("Mess",v);

}

%>

<% String name=ameter("peopleName");

String title=ameter("Title");

String messages=ameter("messages");

if(name==null)

{ name="guest"+(int)(()*10000);

}

if(title==null)

{ title="无标题";

}

if(messages==null)

{ messages="无信息";

}

String time=new Date().toString();

String s="#"+name+"#"+title+"#"+time+"#"+messages+"#";

sendMessage(s);

("您的信息已经提交!");

%>

返回

查看留言版

5

<%@ page contentType="text/html;Charset=GB2312" %>

<%@ page import=".*" %>

<% Vector v=(Vector)ribute("Mess");

("

");

("

");

("

");

("

");

30

("

");

("

");

("

");

for(int i=0;i<();i++)

{ ("

");

String message=(String)tAt(i);

StringTokenizer fenxi=new StringTokenizer(message,"#");

("

");

int number=okens();

for(int k=0;k

{ String str=ken();

if(k

{ ("

");

}

else

{("

"); }

}

("

");

}

("

"+"留言者姓名"+""+"留言标题"+""+"留言时间"+""+"留言内容"+"
"+str+"

");

%>

四、设计性实验环节

1中,sendMessage()方法为什么需要用同步修饰符synchronized

2、将留言板的留言时间用yyyy-mm-dd hh:mm:ss的形式显示。

3、在留言板中添加留言人的email和电话,并显示。

实验十 JSP中使用Java Bean4课时)

一、实验目的

1、掌握编写和使用JavaBean的方法

2、理解怎样使用JavaBean分离JSP页面的数据显示和数据处理

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

31

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

4Netbeans 4.1Jcreator

三、实验原理与内容

1、为了使JSP页面使用beanTomcat服务器必须使用相应的字节码创建一个对象,即

创建一个bean。为了让Tomcat服务器能找到字节码,字节码必须存放在特定的目录中。

在当前Web服务目录下建立如下目录结构:

Web服务目录WEB-INFclasses

然后根据类的包名,在目录classes下建立相应的子目录,如类的包名为

那么在classes下建立子目录tomjiafei。为了让Tomcat服务器启用上述目录,必须重新

启动Tomcat服务器。Tomcat服务器重新启动后,就可以将创建的bean的字节码文件,

,复制到“Web服务目录WEB-INFclassestomjiafei”中。以下通过几个实

例来进一步掌握bean的使用

2、四则运算bean

创建bean的源文件:

package ;

public class ComputerBean

{ double numberOne,numberTwo,result;

String operator="+";

public void setNumberOne(double n)

{ numberOne=n;

}

public double getNumberOne()

{ return numberOne;

}

public void setNumberTwo(double n)

{ numberTwo=n;

}

public double getNumberTwo()

{ return numberTwo;

}

public void setOperator(String s)

{ operator=();;

}

public String getOperator()

{ return operator;

}

32

public double getResult()

{ if(("+"))

{ result=numberOne+numberTwo;

}

else if(("-"))

{ result=numberOne-numberTwo;

}

else if(("*"))

{ result=numberOne*numberTwo;

}

else if(("/"))

{ result=numberOne/numberTwo;

}

return result;

}

}

JSP页面:

<%@ page contentType="text/html;Charset=GB2312" %>

<%@ page import="arBean" %>

输入两个数:

选择运算符号:


name="computer" property="*"/>

=

33

3、时间bean

创建bean的源文件:

package ;

import .*;

public class ShowCalendar

{ Calendar calendar = null;

int year,dayOfMonth,dayOfYear,weekOfYear,

weekOfMonth,dayOfWeek,hour,minute,second;

String day,date,time;

public ShowCalendar()

{ calendar = tance();

Date time = new Date();

e(time);

}

public int getYear()

{ return ();

}

public String getMonth()

{ int m=1+();

String months[]={ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" };

if (m>12)

return "0";

return months[m-1];

}

public String getDay()

{ int n =getDayOfWeek();

String days[]={"","", "", "","", "", ""};

if(n>7)

return "星期?";

return days[n];

}

public String getDate()

{ return getYear()+ "/" + getMonth()+"/"+getDayOfMonth();

}

public String getTime() //获取:时:分:秒

{ return getHour() + ":" + getMinute() + ":" + getSecond();

34

}

public int getDayOfMonth()

{

return (_OF_MONTH);

}

public int getDayOfYear()

{

return (_OF_YEAR);

}

public int getWeekOfYear()

{ return (_OF_YEAR);

}

public int getWeekOfMonth()

{ return (_OF_MONTH);

}

public int getDayOfWeek()

{ return (_OF_WEEK)-1;

}

public int getHour()

{ return (_OF_DAY);

}

public int getMinute()

{ return ();

}

public int getSecond()

{ return ();

}

}

JSP页面:

<%@ page contentType="text/html;Charset=GB2312" %>

<%@ page import="lendar" %>

align="center">color="blue">name="clock" property="year"/>

35

星期

当前时间为
今天是今年的第
本周是今年的第
本周是本月的第

4、日历bean

创建bean的源文件:

package ;

import .*;

public class CalendarBean

{ String calendar=null;

int year=-1,month=-1;

public void setYear(int year)

{ =year;

}

public int getYear()

{ return year;

}

public void setMonth(int month)

{ =month;

36

}

public int getMonth()

{ return month;

}

public String getCalendar()

{ StringBuffer buffer=new StringBuffer();

Calendar rili=tance();

(year,month-1,1); //将日历翻到yearmonth1,注意0表示一月,

//依次类推,11表示12月。

//获取1日是星期几(get方法返回的值是1表示星期日,返回的值是7表示星期六):

int 星期几=(_OF_WEEK)-1;

int day=0;

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)

{ day=31;

}

if(month==4||month==6||month==9||month==11)

{ day=30;

}

if(month==2)

{ if(((year%4==0)&&(year%100!=0))||(year%400==0))

{ day=29;

}

else

{ day=28;

}

}

String a[]=new String[42]; //存放号码的一维数组

for(int i=0;i<星期几;i++)

{ a[i]="**";

}

for(int i=星期几,n=1;i<星期几+day;i++)

{ a[i]=f(n) ;

n++;

}

for(int i=星期几+day,n=1;i<42;i++)

{ a[i]="**" ;

}

//用表格显示数组:

("

");

("

") ;

37

String weekday[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

for(int k=0;k<7;k++)

{ ("

");

}

("

") ;

for(int k=0;k<42;k=k+7)

{ ("

") ;

for(int j=k;j<(7+k,42);j++)

{ ("

");

}

("

") ;

}

("

calendar=new String(buffer);

if(year!=-1)

{ return calendar;

}

else

{ return "选择一个年份和月份单击提交键";

}

}

}

JSP页面:

<%@ page contentType="text/html;Charset=GB2312" %>

<%@ page import="arBean" %>

选择日历的年份:

38

选择日历的月份:



name="rili" property="*"/>

月的日历:

name= "rili" property="calendar" />

四、实验练习

使用bean实现实验八的猜数游戏。创建bean的源文件是,能实

现的对用户猜数的判断(正确、大或是小?),记录猜测的次数,并计算猜数时间。

是起始猜数页面,而页面显示每次猜数的结果。若猜数正确,应

显示如下图101的效果。

101 练习1运行效果

39

五、综合实验

编写一个JSP文件计数器。文件用于在浏览器中运行,是后台的

一个JavaBean程序,用来读计数器的值和写入计数器值, 保存计数器。

(以下是的参考)

import .*;

public class counter extends Object {

private String currentRecord = null;//保存文本的变量

private BufferedReader file; //BufferedReader对象,用于读取文件数据

private String path;//文件完整路径名

public counter() {}

//ReadFile方法用来读取文件filePath中的数据,并返回这个数据

public String ReadFile(String filePath) throws FileNotFoundException

{

path = filePath;

//创建新的BufferedReader对象

file = new BufferedReader(new FileReader(path));

String returnStr =null;

try

{

//读取一行数据并保存到currentRecord变量中

currentRecord = ne();

}

catch (IOException e)

{//错误处理

n("读取数据错误.");

}

if (currentRecord == null)

//如果文件为空

returnStr = "没有任何记录";

else

{//文件不为空

returnStr =currentRecord;

}

//返回读取文件的数据

return returnStr;

}

//WriteFile方法用来将数据counter+1后写入到文本文件filePath

//以实现计数增长的功能

public void WriteFile(String filePath,String counter) throws FileNotFoundException

40

{

path = filePath;

//counter转换为int类型并加一

int Writestr = nt(counter)+1;

try {

//创建PrintWriter对象,用于写入数据到文件中

PrintWriter pw = new PrintWriter(new FileOutputStream(filePath));

//用文本格式打印整数Writestr

n(Writestr);

//清除PrintWriter对象

();

} catch(IOException e) {

//错误处理

n("写入文件错误"+sage());

}

}

}

实验十一 JSP中的文件操作

一、实验目的

1、掌握在JSP中怎样使用Java的输入流、输出流实现有关的文件操作

2、编写JSP页面,实现文件上传和下载。

3进一步学习使用JSPJavaBeans的设计模式,将有关文件的读写指派给JavaBean

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

4Netbeans 4.1Jcreator

三、实验原理与内容

1)文件上传

RandomAccessFile类所创建的流既可以作为源,也可以作为目的地,所以在文件的

上传和下载的时候,通常使用RandomAccessFile类。

对于文件上传而言,创建bean的源文件如下:

package ;

import .*;

41

import .*;

public class UpFile

{ HttpServletRequest request;

HttpSession session;

String upFileMessage="";

public void setRequest(HttpServletRequest request)

{ t=request;

}

public void setSession(HttpSession session)

{ n=session;

}

public String getUpFileMessage()

{ String fileName=null;

try{ String tempFileName=(String)();//客户的sessionid

File f1=new File("D:/apache-tomcat-5.5.20/webapps/chaper6",tempFileName);

FileOutputStream o=new FileOutputStream(f1);

InputStream in=utStream();

byte b[]=new byte[10000];

int n;

while( (n=(b))!=-1)

{ (b,0,n);

}

();

();

RandomAccessFile random=new RandomAccessFile(f1,"r");

int second=1; //读出f1的第2行,析取出上传文件的名字:

String secondLine=null;

while(second<=2)

{ secondLine=ne();

second++;

}

//获取第2行中目录符号''最后出现的位置

int position=dexOf('');

//客户上传的文件的名字是:

fileName=ing(position+1,()-1);

byte cc[]=es("ISO-8859-1");

fileName=new String(cc);

ribute("Name",fileName);//页面使用

(0); //再定位到文件f1的开头。

//获取第4行回车符号的位置:

42

long forthEndPosition=0;

int forth=1;

while((n=te())!=-1&&(forth<=4))

{ if(n=='n')

{ forthEndPosition=ePointer();

forth++;

}

}

//根据客户上传文件的名字,将该文件存入磁盘:

File f2= new File("D:/apache-tomcat-5.5.20/webapps/chaper6",fileName);

RandomAccessFile random2=new RandomAccessFile(f2,"rw");

//确定出文件f1中包含客户上传的文件的内容的最后位置,即倒数第6行。

(());

long endPosition=ePointer();

long mark=endPosition;

int j=1;

while((mark>=0)&&(j<=6))

{ mark--;

(mark);

n=te();

if(n=='n')

{ endPosition=ePointer();

j++;

}

}

//random流指向文件f1的第4行结束的位置:

(forthEndPosition);

long startPoint=ePointer();

//f1读出客户上传的文件存入f2(读取从第4行结束位置和倒数第6行之间的内容)

while(startPoint

{ n=te();

(n);

startPoint=ePointer();

}

();

();

(); //删除临时文件

upFileMessage=fileName+" Successfully UpLoad";

return upFileMessage;

}

43

catch(Exception exp)

{ if(fileName!=null)

{ upFileMessage=fileName+" Fail to UpLoad";

return upFileMessage;

}

else

{ upFileMessage="";

return upFileMessage;

}

}

}

}

JSP页面代码如下:

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="" %>

选择要上传的文件:


<% uest(request);

sion(session);

%>

name="upFile" property="upFileMessage"/>

如果上传的是图像文件,可单击超链接查看图像:


查看图像

<%@ page contentType="text/html;Charset=GB2312" %>

<% String pic=(String)ribute("Name");

(pic);

("");

%>

44

2)文件下载

创建bean的源文件如下:

package ;

import .*;

import .*;

public class DownLoadFile

{ HttpServletResponse response;

String fileName;

public void setResponse(HttpServletResponse response)

{ se=response;

}

public String getFileName()

{ return fileName;

}

public void setFileName(String s)

{ fileName=s;

File fileLoad=new File("f:/2000",fileName);

//客户使用下载文件的对话框:

der("Content-disposition","attachment;filename="+fileName);

}

}

JSP页面:

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="adFile" %>

<%@ page import=".*" %>

选择要下载的文件:

<% ponse(response);

45

%>

name="downFile" property="fileName" param="fileName"/>

四、综合设计实验环节:

利用JavaBean模式和FileRead类实现读取文件的内容:

的参考关键代码:

package fff;

import .*;

public class ReadFile

{ String fileDir="c:/",fileName="";

String listFile,readContent;

public void setFileDir(String s)

{ fileDir=s;

}

public String getFileDir()

{ return fileDir;

}

public void setFileName(String s)

{ fileName=s;

}

public String getFileName()

{ return fileName;

}

public String getListFile()

{ File dir=new File(fileDir);

File file_name[]=les();

StringBuffer list=new StringBuffer();

for(int i=0;i

{ if ((file_name[i]!=null)&&(file_name[i].isFile()))

{ String temp=file_name[i].toString();

int n=dexOf("");

temp=ing(n+1);

(" "+temp);

}

}

listFile=new String(list);

return listFile;

}

public String getReadContent()

46

{ try{ File file=new File(fileDir,fileName);

FileReader in=new FileReader(file) ;

BufferedReader inTwo=new BufferedReader(in);

StringBuffer stringbuffer=new StringBuffer();

String s=null;

while ((s=ne())!=null)

{ ("n"+s);

}

String temp=new String(stringbuffer);

readContent="";

}

catch(IOException e)

{ readContent="";

}

return readContent;

}

}

选择目录的页面通过表单让用户选择目录,并将选择提交给

页面,效果如图111所示。

111 112

选择文件页面使用Bean(相应的二进制文件是)显示

指定目录包含的所有子目录和文件,并让用户选择需要读的文件,效果如图112所示

当用户在上面页面中输入文件名后,提交给。它使用Bean(相应的二进

制文件是)读取文件内容。页面效果如图113所示

47

113

试编程完成此三个jsp页面实现相应功能。

实验十二 JSP中使用数据库

一、实验目的

1、掌握在JSP中使用JDBC实现数据库的连接、查询、修改。

2、掌握在JSP中实现数据库表的分页查询。

3、进一步学习使用JSPJavaBeans的设计模式,将有关数据库操作的方法指派给

JavaBean来实现。

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

4Netbeans 4.1Jcreator

三、实验原理与内容

1、建立实验所用的数据库,打开Microsoft Access,出现建立数据库的对话框,选“空

Access数据库”,如图121所示,点击【确定】后,出现保存数据库的对话框,将数

据库以“”名字保存在“D”根目录下。

48

121 新建数据库 122 选择数据库名并保存

123 124 新建表student的各个字段

在出现的对话框中双击【使用设计器创建表】,即可在此数据库中添加表格,如图

123所示。若建立一个student表,该表有ID、学号、姓名、操作系统、微机原理、数

据结构六个字段,则在图124所示的对话框中以此输入六个字段的名称(用中文缩写

的形式),注意各个字段的数据类型。选择id字段为主键(工具栏的小钥匙)

关闭“表设计器窗口”,提示保存表的名字,如图125所示,输入“student”并按

【确定】,此时已经向数据库中添加了一个空的student表格。在主界面双击“student

即可为该表添加数据,如图126所示

125

49

126 student的数据

2、不采用bean实现数据库的连接、查询和修改。

1)创建与指定数据库的连接

JSP中连接数据库有两种方式:JDBC-ODBC桥接方式和纯Java驱动程序方式。若

使用JDBC-ODBC桥接方式与数据库建立连接,需要3个步骤:

创建ODBC数据源(以Access数据库为例)

127 添加或删除ODBC数据源 128 ODBC数据源选择驱动

①在windows中添加ODBC数据源

选择【控制面板】【管理工具】ODBC数据源】,出现如图127所以界面,选择

“系统DSN,点【添加…】,出现如图128所示的界面,伪数据源选择驱动。

②为数据源选择驱动

如果待连接的数据库是SQL Server数据库,则选择“SQL Server”选项,点击

【完成】即可。若待连接的数据库是Access数据库,则选择“Driver do Microsoft

Access”选项,点击【完成】

③指定数据源的名称和所在位置

在图129对话框中,填写数据源的名称为mydata,点击【选择…】可以为这

50

个数据源指定数据库,如图1210所示。点选驱动器,找到D:盘,左侧备选框中

即可出现,点击,即可指向刚刚建立的数据库mydata。数据

库选择完毕,一直按【确定】退出ODBC数据源的创建对话框,到此,一个ODBC

的数据源成功建立。

129 1210

建立JDBC-ODBC桥接器

现在,我们已经有了ODBC数据源:mydata,这个数据源就是一个数据库:

(建立数据源时,数据源的名字和数据库的名字可以不同)里面有个表

student。为了连接这个数据库,首先要建立一个JDBCODBC的桥接器:

try {e(bcDriver);}

catch(ClassNotFoundException e){}

ODBC数据源指定的数据库建立连接

try {Connection con=nection(jdbc:odbc:mydata,””,””);}

catch(SQLException e){}

建立查询结果集ResultSet

和数据库连接之后,就可以进行执行查询、修改等操作,而对数据库的操作都

SQL语言为基础的,所以,在执行特定的“查询/修改”操作前,必须使用Statement

声明一个SQL语句对象

try {Statement sql=Statement();}

catch(SQLException e){}

【注意】:若想查询结果分页显示,必须要求查询生成的结果集是可滚动的结果集,所以在

try {Statement sql=Statement(_SCROLL_SENSITIVE,

_READ_ONLY);}

catch(SQLException e){}

Statement sql=……声明的这个语句中,要改成

有了SQL语句对象后,这个对象就可以调用相应的方法,实现对数据库表的查询和

修改,并将结果存放在一个ResultSet类声明的对象中。

ResultSet rs=eQuery(SELECT * FROM student)

ResultSet rs=eQuery(SELECT xh,xm,wjyl FROM student)

若要其他不同功能的查询,只需要改变executeQuery方法中的SQL语句就可以。

ResultSet对象的主要方法有:

boolean ()//将游标点移动到结果集的下一行

51

void ()//关闭结果集

Xxx (String columnName)//得到结果集某一列的值

Xxx (int columnIndex)//得到结果集某一列的值

滚动结果集ResultSet对象的主要方法还有:

public boolean us()//将游标点移动到结果集的上一行

public boolean ()//检测游标是否在结果集最后一行

public void ()//将游标点移动到结果集的最后一行

public boolean t()//检测游标是否在结果集第一行

public int ()//得到游标当前行号,从1开始

public boolean te(int rows)// 将游标点移动到结果集的指定行

public boolean reFirst ()//检测游标是否在结果集第一行之前

public boolean rLast()//检测游标是否在结果集最后一行之后

public void First()//将游标点移动到结果集的第一行之前

public void ast()//将游标点移动到结果集的最后一行之后

若使用纯Java驱动程序方式与数据库建立连接,需要2个步骤:

加载纯Java驱动程序(无需创建ODBC数据源)

和指定的数据库建立连接

2)参数查询

exa4_输入查询条件,可以按姓名查询成绩,也可以按分数段查询成绩。若按

照姓名查询,提交给;若按照分数段查询,请求提交给,以下是

此三个jsp页面的关键代码,运行并观察结果

exa4_

<%@ page contentType="text/html;charset=GB2312" %>

成绩查询

输入姓名:

根据分数查询名单:
微机原理分数在

之间


操作系统分数在

52

之间


value="提交">

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import=".*" %>

<% //获取提交的姓名:

String name=ameter("name");

if(name==null)

{name="";

}

byte b[]=es("ISO-8859-1");

name=new String(b);

Connection con=null;

Statement sql=null;

ResultSet rs=null;

try{e("bcDriver");

}

catch(ClassNotFoundException e){}

try { con=nection("jdbc:odbc:mydata","","");

sql=Statement();

String condition="SELECT * FROM student WHERE xm = "+"'"+name+"'";

rs=eQuery(condition);

("

"+weekday[k]+"
"+a[j]+"
");

("

");

("

");

while(())

{ ("

");

("

");

53

("

");

("

");

("

");

("

");

("

") ;

}

("

"+"学号");

("

"+"姓名");

("

"+"操作系统");

("

"+"微机原理");

("

"+"数据结构");

("

"+ing(2)+""+ing(3)+""+(4)+""+(5)+""+(6)+"
");

();

}

catch(SQLException e)

{ }

%>

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import=".*" %>

<% //获取提交的分数的最大值和最小值:

String wjylmax=ameter("wjylmax");

if(wjylmax==null)

{wjylmax="100";

}

String wjylmin=ameter("wjylmin");

if(wjylmin==null)

{wjylmin="0";

}

String czxtmax=ameter("czxtmax");

if(czxtmax==null)

{czxtmax="100";

}

String czxtmin=ameter("czxtmin");

if(czxtmin==null)

{czxtmin="0";

}

Connection con=null;

Statement sql=null;

ResultSet rs=null;

try{e("bcDriver");

}

54

catch(ClassNotFoundException e){}

try

{ con=nection("jdbc:odbc:mydata","","");

sql=Statement();

String eCondition="wjyl <= "+wjylmax+" AND "+"wjyl >= "+wjylmin;

String mCondition="czxt <= "+czxtmax+" AND "+"czxt >= "+czxtmin;

String condition="SELECT * FROM student WHERE "+mCondition+" and "+eCondition;

rs=eQuery(condition);

("

");

("

");

("

");

while(())

{ ("

");

("

");

("

");

("

");

("

");

("

");

("

") ;

}

("

"+"学号");

("

"+"姓名");

("

"+"操作系统");

("

"+"微机原理");

("

"+"数据结构");

("

"+ing(2)+""+ing(3)+""+(4)+""+(5)+""+(6)+"
");

();

}

catch(SQLException e) {}

%>

3)更新记录

下例使用executeUpdate()方法更新记录中的字段值。exa4_输入学生姓名和各科

成绩,并将请求提交给,该页面实现更新记录,运行下列程序,观察结果。

exa4_

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import=".*" %>

55

输入要修改成绩的同学的姓名:


输入新的操作系统成绩:


输入新的微机原理成绩:


输入新的数据结构成绩:


数据库更新前的数据记录是:

<% String name,number;

int czxt,wjyl,sjjg;

Connection con;

Statement sql;

ResultSet rs;

try{e("bcDriver");

}

catch(ClassNotFoundException e){("abb"+e+"bb");}

try{ con=nection("jdbc:odbc:mydata","","");

sql=Statement();

rs=eQuery("SELECT * FROM student");

("

");

("

");

("

");

while(())

{ ("

");

number=ing("xh");

("

");

name=ing("xm");

("

");

czxt=("czxt");

("

");

wjyl=("wjyl");

("

");

sjjg=("sjjg");

("

");

("

") ;

}

("

"+"学号");

("

"+"姓名");

("

"+"操作系统");

("

"+"微机原理");

("

"+"数据结构");

("

"+number+""+name+""+czxt+""+wjyl+""+sjjg+"
");

();

}

catch(SQLException e1) {("aaaa"+e1+"aaaa"); }

%>

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import=".*" %>

<% //获取提交的姓名:

String newxm=ameter("new_xm");

if(newxm==null) {newxm=""; }

byte b[]=es("ISO-8859-1");

newxm=new String(b);

String newczxt=ameter("new_czxt");

if(newczxt==null) {newczxt="-100"; }

String newwjyl=ameter("new_wjyl");

if(newwjyl==null) {newwjyl="-100"; }

String newsjjg=ameter("new_sjjg");

if(newsjjg==null) {newsjjg="-100"; }

Connection con=null;

Statement sql=null;

ResultSet rs=null;

String xh,xm;

int czxt,wjyl,sjjg;

try{e("bcDriver");

}

catch(ClassNotFoundException e){("mmm"+e);}

try {con=nection("jdbc:odbc:mydata","" ,"");

sql=Statement();

String condition1=

57

"UPDATE student SET czxt = "+newczxt+" WHERE xm="+"'"+newxm+"'" ,

condition2=

"UPDATE student SET wjyl = "+newwjyl+" WHERE xm="+"'"+newxm+"'" ,

condition3=

"UPDATE student SET sjjg= "+newsjjg+" WHERE xm="+"'"+newxm+"'" ;

//执行更新操作:

eUpdate(condition1);

eUpdate(condition2);

eUpdate(condition3);

//显示更新后的表中的记录:

%>

更新后的表的记录:

<%

rs=eQuery("SELECT * FROM student");

("

");

("

");

("

");

while(())

{

("

");

xh=ing(2);

("

");

xm=ing(3);

("

");

czxt=(4);

("

");

wjyl=(5);

("

");

sjjg=(6);

("

");

("

") ;

}

("

"+"学号");

("

"+"姓名");

("

"+"操作系统");

("

"+"微机原理");

("

"+"数据结构");

("

"+xh+""+xm+""+czxt+""+wjyl+""+sjjg+"
");

();

}

58

catch(SQLException e)

{(e) ; }

%>

4)分页显示

下例中访问student表,分页显示表中内容,观察运行结果。

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import=".*" %>

<%! int pageSize=3; //每页显示的记录数。

int pageCount=0; //分页后的总页数。

%>

<%-- 客户通过表单提交欲要显示的页码数--%>

输入页码数

提交>

<% Connection con;

Statement sql;

ResultSet rs;

try{e("bcDriver");

}

catch(ClassNotFoundException e){}

try { con=nection("jdbc:odbc:mydata","","");

sql=

Statement(_SCROLL_SENSITIVE,_READ_ONLY);

//返回可滚动的结果集:

rs=eQuery("SELECT * FROM student");

//将游标移动到最后一行:

();

//获取最后一行的行号:

int lastRow=();

//计算分页后的总页数:

pageCount=(lastRow%pageSize==0)?(lastRow/pageSize):(lastRow/pageSize+1);

//当前显示的初始页数:

int showPage=1;

//告知客户总页数:

59

%>

共有<%=pageCount%>


每页显示<%=pageSize%>条记录.

<% //获取客户想要显示的页数:

String integer=ameter("showPage");

if(integer==null)

{ integer="1";

}

try {showPage=nt(integer);

}

catch(NumberFormatException e)

{showPage=1;

}

if(showPage<=1)

{showPage=1;

}

if(showPage>=pageCount)

{showPage=pageCount;

}

%>


目前显示第<%=showPage%>

<% //如果要显示第showPage页,那么游标应移到posion的值是:

int posion=(showPage-1)*pageSize+1;

te(posion); // 设置游标的位置

("

");

("

");

("

");

for (int i=1;i<=pageSize;i++)

{ ("

");

("

");

("

");

("

");

("

");

("

");

("

") ;

60

();

}

("

"+"学号");

("

"+"姓名");

("

"+"操作系统");

("

"+"微机原理");

("

"+"数据结构");

("

"+ing(2)+""+ing(3)+""+(4)+""+(5)+""+(6)+"
");

();

}

catch(SQLException e1) {}

%>

3、采用bean实现数据库的基本操作,具体方法参加教材第7章。下列实例基于

CachedRowSet对象实现分页查询的方法,适用于结果集记录非常多的场合

package ;

import .*;

import .*;

public class ShowRecordByPage

{ int pageSize=10; //每页显示的记录数

int pageAllCount=0; //分页后的总页数

int showPage=1 ; //当前显示页

StringBuffer presentPageResult; //显示当前页内容

CachedRowSetImpl rowSet; //用于存储ResultSet对象

String databaseName=""; //数据库名称

String tableName=""; //表的名字

String user="" ; //用户

String password="" ; //密码

String 字段[]=new String[100] ;

int 字段个数=0;

public ShowRecordByPage()

{ presentPageResult=new StringBuffer();

try{ e("bcDriver ").newInstance();

}

catch(Exception e){}

}

public void setPageSize(int size)

{ pageSize=size;

字段个数=0;

String uri=" jdbc:odbc:"+databaseName;

try{ Connection con=nection(uri,user,password);

DatabaseMetaData metadata=aData();

ResultSet rs1=umns(null,null,tableName,null);

61

int k=0;

while(())

{ 字段个数++;

字段[k]=ing(4); //获取字段的名字

k++;

}

Statement sql=Statement(_SCROLL_SENSITIVE,

_READ_ONLY);

ResultSet rs=eQuery("SELECT * FROM "+tableName);

rowSet=new CachedRowSetImpl(); //创建行集对象

te(rs);

(); //关闭连接

();

int m=(); //总行数

int n=pageSize;

pageAllCount=((m%n)==0)?(m/n):(m/n+1);

}

catch(Exception exp){}

}

public int getPageSize()

{ return pageSize;

}

public int getPageAllCount()

{ return pageAllCount;

}

public void setShowPage(int n)

{ showPage=n;

}

public int getShowPage()

{ return showPage;

}

public StringBuffer getPresentPageResult()

{ if(showPage>pageAllCount)

showPage=1;

if(showPage<=0)

showPage=pageAllCount;

presentPageResult=show(showPage);

return presentPageResult;

}

public StringBuffer show(int page)

62

{ StringBuffer str=new StringBuffer();

("

");

("

");

for(int i=0;i<字段个数;i++)

{ ("

");

}

("

");

try{ te((page-1)*pageSize+1);

for(int i=1;i<=pageSize;i++)

{ ("

");

for(int k=1;k<=字段个数;k++)

{ ("

");

}

("

");

();

}

}

catch(SQLException exp){}

("

"+字段[i]+"
"+ing(k)+"
");

return str;

}

public void setDatabaseName(String s)

{ databaseName=();

}

public String getDatabaseName()

{ return databaseName;

}

public void setTableName(String s)

{ tableName=();

}

public String getTableName()

{ return tableName;

}

public void setPassword(String s)

{ password=();;

}

public void setUser(String s)

{ user=();

}

public String getUser()

63

{ return user;

}

}

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="cordByPage" %>

name= "look" property="databaseName" value="mydata" />

name= "look" property="tableName" value="student" />

name= "look" property="user" value=" " />

name= "look" property="password" value=" " />

name= "look" property="pageSize" value="2" />


该数据库

name= "look" property="databaseName"/>

name= "look" property="tableName" />

的记录中将分页显示。


共有 name= "look" property="pageAllCount" /> .


每页最多显示 name= "look" property="pageSize" />条记录。


单击超链接分页查看


分页查看>

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="cordByPage" %>

显示数据库中的记录,每页显示

name= "look" property="pageSize" />

条记录

name= "look" property="showPage" />

name= "look" property="presentPageResult" />


color=blue> name= "look" property="showPage"

/>,

共有 name= "look" property="pageAllCount" />页。


单击“前一页”或“下一页”按纽查看记录

64

输入页码:

返回主页

四、实验思考题

1、修改实验内容(3,使得能按照指定的姓名删除该学生的记录。

2修改实验内容3的源代码,在分页显示

的基础上,加入“首页”“末页”的链接。

五、设计性实验环节

根据实验内容(4)的运行结果,在分页显示的基础上,加入“首页”“上一页”

“下一页”“末页”的链接,如图1211所示。设计出满足要求的JSP程序。

1211

65

实验十三 Java Servlet

一、实验目的

1、掌握怎样编写和使用Servlet

2、掌握编写和配置和Servlet有关的文件。

3、掌握在Servlet中使用session的方法;熟悉把用户对某JSP页面或Servlet的请求

转发给另一个JSP页面或Servlet的方法。

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

4Netbeans 4.1Jcreator

三、实验原理与内容

1、有些Web应用可能需要JSPJavaBeanServlet来完成,需要服务器再创建一些

Servlet对象,配合JSP页面来完成整个Web应用程序的工作。本小节实验将介绍怎样编

写创建Servlet对象的类,怎样在Tomcat服务器上保存编译后的字节码、编写部署文件,

怎样请求Tomcat服务器创建一个Servlet对象。

复制需要的jar文件:为了编译Servlet源文件,需要HttpServletHttpServletRequest

等类,JDK内置包中并不包含这些类文件,用户需要将Tomcat服务器中commonlib

录下的文件复制到JDK安装目录的jrelibext子目录中。

添加Servlet类的字节码文件: 使用JcreatorNetbeans中编写如下的Servlet类:

,保存在D:盘根目录下,编译该类,形成,将此

文件夹保存到Tomcat当前Web目录(如:ROOT目录)下的WEB-INFclasses子目录

中,重新启动Tomcat

package ;

import .*;

import t.*;

import .*;

public class Computer extends HttpServlet

{ public void init(ServletConfig config) throws ServletException

{ (config);

}

public void service(HttpServletRequest request,HttpServletResponse response)

throws IOException

{ tentType("text/html;charset=GB2312");

PrintWriter out=ter();

66

n("");

String number=ameter("number"); //获取客户提交的信息。

double n=0;

try{ n=ouble(number);

("
"+number+"
的平方根是:");

("
"+(n));

}

catch(NumberFormatException e)

{ ("

请输入数字字符!

");

}

n("");

}

}

③编写部署文件: Web当前目录WEB-INFclasses子目录中,用记事本打开

文件,在“”标记下,添加如下几行并保存:

computer

er

computer

/getResult

④运行Servlet编写文件,该文件通过表单向Servlet提交一个正实数,

Servlet负责计算这个数的平方根并返回给客户。

<%@ page contentType="text/html;Charset=GB2312" %>

输入一个数,servlet求这个数的平方根:

2当用户请求一个Servlet时,Sevlet会调用doPost()doGet()方法响应用户的请求。

doPost()doGet()方法的两个参数类型都是HttpServletRequestHttpServletResponse

而且由服务器负责实例化,因此在Servlet类中可以直接使用这两个参数。本小节实验学

Servlet使HttpServletResponsesendRedirect()

RequestDispatcher类的转发方法forward()

添加Servlet类的字节码文件: 使用JcreatorNetbeans中编写如下的两个Servlet类:

67

,保存在D:盘根目录下,编译该类,形成***.class的字

节码文件,将此文件夹保存到Tomcat当前Web目录(如:ROOT目录)下的

WEB-INFclasses子目录中。

V

package ;

import .*;

import t.*;

import .*;

public class Verify extends HttpServlet

{ public void init(ServletConfig config) throws ServletException

{(config);

}

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException

{ String name=ameter("name"); //获取客户提交的信息

String age=ameter("age"); //获取客户提交的信息

int numberAge=nt(age);

if(()==0||name==null)

{ direct(""); //重定向

}

else if(()==0||name==null)

{ direct(""); //重定向

}

else if(numberAge<=0||numberAge>=150)

{ direct("");

}

else

{ RequestDispatcher dispatcher=

uestDispatcher("forYouShowMessage");

d(request, response); //重定向

}

}

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException

{ doPost(request,response);

}

}

package ;

68

import .*;

import t.*;

import .*;

public class ShowMessage extends HttpServlet

{ public void init(ServletConfig config) throws ServletException

{(config);

}

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException

{ tentType("text/html;charset=GB2312");

PrintWriter out=ter();

String name=ameter("name"); //获取客户提交的信息

String age=ameter("age"); //获取客户提交的信息

try{ byte bb[]=es("ISO-8859-1");

name=new String(bb,"gb2312");

}

catch(Exception exp){}

("
您的姓名是:");

(name);

("
您的年龄是:");

(age);

}

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException

{ doPost(request,response);

}

}

②编写部署文件: Web当前目录WEB-INFclasses子目录中,用记事本打开

文件,在“”标记下,添加如下几行并保存:

verify

showMessage

ssage

verify

/verifyYourMessage

69

showMessage

/forYouShowMessage

③运行Servlet编写文件,运行该文件,观察实验结果。

<%@ page contentType="text/html;charset=GB2312" %>

输入姓名:


输入年龄:


四、实验思考题

1、假设创建Servlet的类是t,应当怎样配置文件?

2 HttpServletResponse类的sendRedirect()方法和RequestDispatcher类的forward()方法

有何不同?

五、综合实验

利用Servlet实验猜数字游戏,实验运行的效果如图131、图132和图133

131 132

70

133

实验十四 网上书店

一、实验目的

1、综合掌握JSP页面设计的方法。

2、综合掌握JSPJavaBean的设计模式。

3、掌握JSPJavaBeanServlet的设计方法。

二、实验工具

1JDK1.4JDK1.5JDK1.6,可以从SUN公司的网站免费下载

2)编辑工具:记事本或Dreamweaver MX 2004FrontPage 2003

3Tomcat服务器,也可以从网上免费下载

4Netbeans 4.1Jcreator

三、实验原理与内容

1、系统功能

本系统建立一个全面的网上图书购物系统。该系统包括用户注册、用户登录、书目

浏览、订购图书、查看订单、修改订单、修改密码和信息等功能,框架如图141所示。

实验两个人一组进行,对数据库的访问要求使用JavaBean实现。

网上书店

用户业务 网上业务

用户用户修改书目订购查看修改

注册 登录 密码 浏览 图书 订单 订单

71

141 系统功能框架

1)用户注册:新用户填写表单、包括用户名、E-mail地址等信息。如果输入的用户名

已经被其他用户注册使用,系统提示用户更改用户名。

2)用户登录:输入用户名、密码。如果用户输入的用户名或者密码有错误,系统将显

示错误信息;如果登录成功,将就一个成功登录的信息返回给用户,同时用户被连接到

“订购图书”页面。

3)书目浏览:用户可以分页浏览图书书目。

4订购图书:成功登录的用户可以在该页面订购所需要的图书。如果用户直接进入该

页面或没有成功登录就进入该页面,将被连接到“用户登录”页面。

5查看订单:成功登录的用户可以在该页面查看自己的订单。如果用户直接进入该页

面或者没有成功登录就进入该页面,将被连接到“用户登录”页面。

6修改订单:成功登录的用户可以在该页面删除自己的订单。如果用户直接进入该页

面或者没有成功登录就进入该页面,将被连接到“用户登录”页面。

7修改密码:成功登录的用户可以在该页面修改自己的密码。如果用户直接进入该页

面或者没有成功登录就进入该页面,将被连接到“用户登录”页面。

8)修改个人信息:可以修改密码和用户名以外的个人信息。

2、数据库设计

Access建立一个数据库(也可以用SQL Server2000,建有注册信息表

user、书目表(book、购物车表(preorder)和订单表(orderform

信息注册表(user)的字段有:

用户登录名称(logname,主键

用户的真实姓名(realname

口令(password

电子邮件地址(email

电话(phone

邮寄地址(address

书目表(book)的字段有:

图书IDid_book,主键,自增长

书名(book_name

作者(author

出版社(publisher

出版时间(time

单价(price

分类(category

72

购物车表(preorder)的字段有:

IDid,主键,自增长

拟订购者注册用户名(logname

拟订购的图书IDid_book

书名(book_name

作者(author

出版社(publisher

出版时间(time

单价(price

订单表(orderform)的字段有:

图书订购号(order_number,主键,自增长

已注册的用户名(logname

真实姓名(realname

订购的图书IDid_book

订购的图书名(bookname

订购的数量(mount

联系电话(phone

邮寄地址(address

在表userorderform之间建立一对多的关系。数据库建立之后,在window建立

ODBC源,指向此数据库。

3、页面设计

本系统所有的页面都将包含一个导航条,该导航条由用户注册、用户登录、书目浏

览、订购图书、修改密码、修改订单、查看订单组成。各页面通过使用JSP<%@

include %>标记将导航条文件嵌入自己的页面。

的关键代码如下:

<%@ page contentType="text/html;charset=GB2312" %>

73

href="<%=URL("/")%>">书目浏览 §

href="<%=URL("/")%>">用户注册 §

href="<%=URL("/")%>">用户登录 §

href="<%=URL("/")%>">定购商品 §

href="<%=URL("/")%>">修改定单 §

href="<%=URL("/")%>">查看定单 §

href="<%=URL("/")%>">修改密码 §

">修改个人信息 §

1)主页(

含有,显示欢迎光临网上书店,网站计数器,版权信息等……,效果如图142

所示。

2)用户注册()界面

用户的注册信息需要存入数据库user表中,并且用到名为

JavaBean文件。主要完成加载桥接器实现数据库的连接、设置属性值、获

取属性值、添加记录到数据库的user表。

142 首页运行效果

注册页面首先通过表单输入您的信息,然后将这些信息通过

动作标记设置为Bean 的属性,并调用BeanaddItem()

法将用户的注册信息存入到数据库中。效果如图143所示。

3)用户登录(

用户可在该页面输入自己的用户名和密码,系统将对用户名和密码进行验证,

如果身份正确将被连接到订购图书页面,否则在页面上端提示用户输入的密码或者用户

名不正确,其中用到Bean 主要完成加载桥接器实现与数据库的连

接、设置属性值、获取属性值、查询数据库的user表,将对用户名和密码进行验证。若

验证不正确,则提示不正确信息。登录页面首先给出表单让用户输入用户

名和密码,然后通过动作标记送给Bean的属性,之后调用Bean

getMessage()进行验证,效果如图144所示。

74

143 用户注册运行效果

144

4)订购图书(

成功登录的用户可以在该页面订购图书。用户将订购的图书存入订货单,如果用户

要修改该图书的订购情况,就必须到修改订单页面修改订单后才能再次订购该书,将用

两个bean文件。

订购页面使用的负责通过登录者的登录名logname查询数据库的

preoder表,查阅该用户准备订购的图书,将书的id、书名、作者、出版社、时间、价格

送给订购界面。

用户订购页面使用的负责填写订购单(最终订单),向数据库的

orderform订单表添加订购记录。

订购图书页面的首先通过检索到当前用户准备订购的图

书列表,如果用户准备订购该书,填写订单。效果如图145所示:

75

145

146

5)查看订单(

该页面查询数据库的订单表,将该用户的正式订单一一显示。

6)修改订单(

选择修改方式的页面根据书的订购号(order_number)来删除或修

改订单中的内容。首先查询数据库显示用户的所

有订单,然后提供两个表单,一个供修改,一个供删除。若用户单击“提交删除”按钮,

则连接到页,删除订单的相应内容;若用户单击“提交修改”按钮,则连

接到页,修改订单的相应内容。效果如图146所示。

删除订购单页面首先从页面获取订单号,然后根据订单号

删除数据库中相应的订单表项,运行效果如图147所示。

修改订单数量页面首先从页面获取订单号和新的订

购数量,然后根据订单号修改数据库中相应的订单表项,运行效果如图148所示。

76

147

148

7)书目浏览(

用户可以分页浏览所有的书籍,同时将准备订购的图书添加到购物车。浏览书目页

面所用的Bean ,主要完成分页的计算。浏览书目页面

首先查询数据库,以分页方式显示所有书目,并且显示一个表单。当用户选择订购时,

该表单将相关信息内容(包括当前订购者的登录名等多项信息)提交到

后者向preorder表格中添加一个购物车条目。效果如图149所示。

149

8)修改密码()略

9)修改个人信息()略

77

实验报告名称: JSP

搭建运行的实验环境

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

78

实验报告名称:JSP

页面

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

79

实验报告名称:JSP”

显示不同大小的“你好

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

80

实验报告名称:JSP

指令和动作

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

81

实验报告名称:Tag

文件的代码复用

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

82

实验报告名称:

中文显示服务器端日期

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

83

实验报告名称:JSP

内置对象

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

84

实验报告名称:session

对象

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

85

实验报告名称:

简易留言板

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

86

实验报告名称:JSPJava Bean

中使用

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

87

实验报告名称:JSP

中的文件操作

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

88

实验报告名称: JSP

中使用数据库

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

89

实验报告名称: Java Servlet

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

90

实验报告名称:

综合实验:网上书店

名: 学号: 专业班级:

指导教师: 日期: 绩:

实验目的:

实验报告

实验内容、实验步骤、实验运行结果分析、实验小结、实验思考题

91