您的当前位置:首页正文

Web开发技术实验指导书模板

来源:华佗健康网
WORD完美格式

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

..整理分享..

Web开发技术》实验指导书(JSP版)

刘 波 编写

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

通信工程

2008年2月

WORD完美格式

目 录

实验一 搭建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

..整理分享..

WORD完美格式

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

一、实验目的

(1)掌握JSP运行环境的安装与配置 (2)理解JSP与Servlet的关系

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

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具-记事本

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

三、实验步骤

(1)按教材中演示安装JDK (2)按教材中演示安装Tomcat

(3)启动Tomcat服务器,在浏览器中输入:http://localhost:8080,观察主页内容 (4)观察Tomcat安装目录下的各个子目录的内容

(5)打开记事本,输入下列源代码并保存为exer1.jsp。将此文件复制到Tomcat安装目录下的webapps\\ROOT目录下,运行该页面,观察其对应的Servlet源代码。

exer1.jsp的代码:

<%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"java.util.Date\" %> <%! Date date; // 数据声明 int sum;

public int add(int m,int n) // 方法声明 { return m+n; } %>

程序片创建Date对象:

<% Date date=new Date(); //java程序片 out.println(\"
\"+date); sum=add(12,34); %>


在下一行输出和:

<%= sum+100 %>

..整理分享..

WORD完美格式

(6)将exer1.jsp文件复制到Tomcat安装目录下的webapps\\examples目录下,运行该页面,观察其对应的Servlet源代码。 (7)将exer1.jsp文件复制到Tomcat安装目录下的webapps\\webdav目录下,运行该页面,观察其对应的Servlet源代码。

四、实验思考题

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

(2)在Tomcat安装目录下的webapps文件夹中,新建一文件夹myapp,将exer1.jsp文件复制到Tomcat安装目录下的webapps\\myapp目录下,运行该页面(http://localhost:8080/myapp/exer1.jsp ),结果如何?

若在d:盘根目录建立一个文件夹myweb,将exer1.jsp文件复制到d:\\myweb\\目录下, 运行该页面(http://localhost:8080/myweb/exer1.jsp ),结果如何?

..整理分享..

WORD完美格式

若要正确显示该页面,还应做如何处理?提示:修改conf目录下的server.xml文件。 (3)Tomcat默认端口号为8080,如何更改端口号? (4)编写一个JSP页面,用于显示1~100的整数和。

五、实验报告要求

(1)分析JSP的工作原理,说明JSP文件和Servlet的关系 (2)根据实验运行情况,对实验步骤和运行结果进行阐述 (3)完成实验思考题的解答

实验二 JSP页面

一、实验目的

(1)熟悉典型JSP页面的组成元素,掌握HTML标记和JSP标记的不同 (2)掌握在HTML页面中插入JSP脚本(java代码)的方法 (2)编写简单的JSP页面,初步掌握JSP网页的设计原理

..整理分享..

WORD完美格式

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载

三、实验步骤

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

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

<%! int count=0; //被客户共享的count synchronized void setCount() //synchronized修饰的方法 { count++; } %>

<% setCount();

out.println(\"您是第\"+count+\"个访问本站的客户\"); %>

(2)JSP中声明类(比较教材P15-P16页的声明变量和声明方法)是JSP页面对应的Servlet类的内部类,页面上所有脚本元素都可以创建该类的对象。下面的实例定义一个square类,当客户访问该页面时,服务器创建该类的对象,只要客户给出正方形的边长,就可以求出该正方形的周长和面积,创建并运行exer2_2.jsp,观察运行结果 exer2_2.jsp:

<%@ 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;}

..整理分享..

WORD完美格式

%> <%

String s=request.getParameter(\"cat\"); double r; if (s!=null) %>

方的面积是:<%=cc.getarea() %>

方的周长是:<%=cc.getlength() %>

{r=Double.valueOf(s).doubleValue();} {r=1;} else

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

}

(3)编写exer2_3.jsp,熟悉在“<%=”和“%>”之间插入表达式,用于输出表达式计算结果的方法 exer2_3.jsp:

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

Sin(0.9)除以3等于 <%=Math.sin(0.90)/3%>

3的平方是: <%=Math.pow(3,2)%>

12345679乘72等于 <%=12345679*72%>

5的平方根等于 <%=Math.sqrt(5)%>

99大于100吗?回答: <%=99>100%>

(4)在Dreamweaver或FrontPage中利用可视化方法,编写input.jsp和receive.jsp。

input.jsp: <%@ page contentType=\"text/html;Charset=GB2312\" %>

请输入下列信息:


输入您的姓名:

选择性别:男 ..整理分享..

WORD完美格式



选择您喜欢的歌手:

张歌手 李歌手 刘歌手 王歌手

receive.jsp: <%@ page contentType=\"text/html;Charset=GB2312\" %>

<% String yourName=request.getParameter(\"name\"); // 获取text提交的值 String yourSex=request.getParameter(\"R\"); //获取radio提交的值 String secretMess=request.getParameter(\"secret\"); //获取hidden提交的值 String personName[]=request.getParameterValues(\"superstar\"); //获取checkbox提交的值

out.println(\"

您的姓名:\"+yourName+\"

\"); out.println(\"

您的性别:\"+yourSex+\"

\"); out.println(\"

您喜欢的歌手:\"); if(personName==null)

{ out.print(\"一个都不喜欢\"); } else

{ for(int k=0;kout.println(\"

hidden提交的值:\"+secretMess); %>

四、设计性实验环节

(1)编写一个jiecheng类,当客户在浏览器中给出指定的正整数N,能计算N的阶乘。创建能实现此功能的jsp文件res1.jsp,观察运行结果(参考exer2_2.jsp)

(2)编写程序newclass2.jsp,学会在声明中定义类student,初始化该类(学号、姓名、成绩),用表格形式输出“班号(学号的前4位)、学号、姓名、成绩”。(选做)

..整理分享..

WORD完美格式

五、实验报告要求

(1)分析JSP的脚本元素,说明JSP标记和html标记的不同 (2)根据实验运行情况,对实验步骤和运行结果进行阐述 (3)完成实验设计题的解答

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

一、实验目的

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

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

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载

三、实验原理和内容

本程序运行后,在浏览器页面上显示不同字体大小的“你好Jsp”,如图3-1所示,程序的流程图如图3-2所示。

1、 程序知识点  显示变量值

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

图3-1 浏览器显示不同字体大小

 For语句

For语句的格式如下

..整理分享..

WORD完美格式

for (initialization Statement; conditional Expression; increment Statement) { loopBody }

为了执行For语句,首先执行初始化语句,然后再对条件表达式求值,如果值为TRUE,则执行循环体,随后执行递增语句。表达式的求值和循环体与递增语句的执行不断重复,直到条件表达式的值变为false。多个初始化和增量语句可以用逗号隔开。

For循环的初始化部分可以声明局部循环变量,循环变量的范围在循环体内部。这些循环变量遵循在块内有效的一般规则,即用大括号作为程序块,变量在块内声明,不能与范围外边的变量同名,也不能在循环外引用。

图3-2 程序流程图

 控制字体大小

在HTML语言中,控制文字大小可使用“”(n从1-6),因此,可以使用循环语句来控制n的变化。然后,使用>,来显示字体大小渐变的“你好JSP”

2、程序代码(exer3.jsp)

<%@ page contentType=\"text/html; charset=gb2312\" language=\"java\" %> ..整理分享..

WORD完美格式

显示不同大小字体

<%

//利用For循环控制字体由大到小 for(int i=1;i<6;i++) { %>

>你好 JSP> <% }

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

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

>你好 JSP> <% } %>

3、观察运行结果

四、综合设计实验环节

综合思考:结合实验二和实验三,编写input2.jsp和receieve2.jsp,根据变量和for循环生成表格的行和列,结果如下图3-3和图3-4所示:

图3-3 input2.jsp执行结果 图3-4执行“确定”后结果

五、实验报告要求

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

..整理分享..

WORD完美格式

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

实验四 JSP指令和动作

一、实验目的

(1)综合掌握在JSP中使用指令标记 (2)综合掌握在JSP中使用动作标记

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载

三、实验步骤

1、Page指令的使用

(1)打开记事本,输入以下文档,并保存为pagederictive.jsp。

<%@

page

contentType=\"text/html;

charset=gb2312\"

language=\"java\"

import=\"java.util.*,java.rmi.*\" 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)将pagederictive.jsp复制到Tomcate安装目录下的webapps\\ROOT\\。 (3)在IE地址栏输入http://localhost:8080/pagederictive.jsp

2、page指令import属性的使用

(1)打开记事本,输入以下文档,并保存为pageimport.jsp。

<%-- get Year --%>

<%@ page import=\"java.util.*\" %>

CurrentYear=<%=Calendar.getInstance().get(Calendar.YEAR) %>

..整理分享..

WORD完美格式

(2)将pageimport.jsp复制到Tomcate安装目录下的webapps\\ROOT\\。 (3)在IE地址栏输入http://localhost:8080/pageimport.jsp

3、include指令的使用

(1)打开记事本,输入以下文档,并保存为copyright.jsp。

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

©2002 <%=companyName%>

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

(2)打开记事本,输入以下文档,并保存为inc1.jsp。

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

This page is unde contruction

<%@ include file=\"copyright.jsp\" %>

Last updated:March 2008

(3)将copyright.jsp和inc1.jsp复制到Tomcate安装目录下的webapps\\ROOT\\ (4)在IE地址栏输入http://localhost:8080/inc1.jsp

四、设计性实验环节

(1)、编写JSP页面,用“*”显示一个7×7方阵的边框和对角线,结果如图4-1所示。

* * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * *

图4-1 练习1运行结果

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

..整理分享..

WORD完美格式

提示:使用StringBuffer类的reverse()颠倒某字符串的顺序,若字符串与颠倒后的字符串相等,则该串为回文。(选做)

图4-2 练习2的运行结果

(3)、张三手头分别有800美元和1860美元,编写一个JSP页面,把他的美元换成人民币,并用表格显示出来。假设当前美元兑换人民币的汇率是7.82。(选做) (4)、编写JSP页面分别显示1~10之间的各数字的阶乘。

实验五 Tag文件的代码复用

一、实验目的

(1)Tag文件的编写、保存以及Tag标记的使用 (2)编写JSP页面,使用Tag标记实现代码的复用

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载

三、实验步骤

(1)Tag文件是扩展名为.tag的文本文件,其结构几乎和JSP文件相同,只是扩展名不同而已。也就是说,一个Tag文件中可以有普通的HTML标记符、某些特殊的指令标记、成员变量和方法、Java程序片和Java表达式等。在记事本中编写如下一个Tag文件 Trangle.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; ..整理分享..

WORD完美格式

double area=Math.sqrt(p*(p-a)*(p-b)*(p-c)) ; return \"
三角形的面积:\"+area; } else

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

<% out.println(\"
jsp页面传递过来的三边:\"+sideA+\ double a=Double.parseDouble(sideA); double b=Double.parseDouble(sideB); double c=Double.parseDouble(sideC); out.println(getArea(a,b,c)); %>

(2)将Trangle.tag保存在..\\ROOT\\WEB-INF目录下 (3)在ROOT目录下编写exer5_1.jsp文件,代码如下:

<%@ page contentType=\"text/html;Charset=GB2312\" %> <%@ taglib tagdir=\"/WEB-INF/tags\" prefix=\"computer\"%>

请选择三角形的三条边

SIDE A:

SIDE B:

%>

<%if (sideaa==null){sideaa=\"3\";} if (sidebb==null){sidebb=\"4\";} if (sidecc==null){sidecc=\"5\";} %>

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

<% String sideaa=request.getParameter(\"select1\"); String sidebb=request.getParameter(\"select2\"); String sidecc=request.getParameter(\"select3\");

\" sideB=\"<%=sidebb%>\" sideC=\"<%=sidecc%>\" />

(4)在IE地址栏输入http://localhost:8080/exer5_1.jsp

四、综合设计实验环节

编写两个Tag文件Rect.tag和Circle.tag。Rect.tag负责计算矩形的面积,Circle.tag负责计算圆的面积。编写一个JSP页面,该JSP页面使用Tag标记调用Rect.tag和Circle.tag。调用Rect.tag时,向其传递矩形的两个边的长度;调用Circle.tag时,向其传递圆的半径。

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

一、实验目的

(1)掌握在JSP中Switch语句的使用 (2)掌握Date类使用。

(3)熟悉int和String的区别

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

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载

..整理分享..

WORD完美格式

三、实验原理和内容

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

图6-1 服务器端的日期

1、程序知识点

 Date类及其引用

Date是在jdk中java。util这个包下的一个类,它支持日历和时间,并且包含了getYear()、getMonth()、getDate()、getDay()几个方法,分别为获取系统年份、系统月份、系统日期、系统星期,并且返回的都是整型。其标准用法为:

java.util.Date dt=new java.util.Date(); int year=dt.getYear();

当然也可先用import语句使包中定义的类和接口,可以只用类名而不用全名来引用用法为(import语句一定要放在程序开头):

import java.util.*; Date dt=new Date(); int year=dt.getYear(); 以上例句Date dt=new Date()中用new语句生成一个新对象dt对Date类进行引用,而Date()是类Date的构造函数。然后可以对Date类中的getYear()方法进行调用。但得到的返回值要加1900才是现在年份。同样用getMonth()得到的返回值也要加1才是现在的月份。

 int和String的区别

在Java中它们是两个完全不同的概念。int是一个类型,而String是一个类。所以在转换上是不能进行简单的强制型转换(int num=(int)string)。在此需要采用String类中的一个方法,一般用法如下:

String str_year=String.valueOf(year)

 Switch语句

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

switch (expression) {

case value1:statement1;break; ……

case valueN:statemendN;break;

..整理分享..

WORD完美格式

[default:default_Statement;] }

expression可以返回任一简单类型的值,case子句中的值valueI必须是常量,而且所有case子句中的值应是不同的。多分支语句把表达式返回的值与每个case 子句中的值相比,如果匹配成功,则执行该case子句后的语句序列,否则执行default中的语句;如果没有default,则不进行任何操作。而case字句中的break用于跳出switch,如果没有break,则switch会顺序执行下个case中的语句,直至遇到break语句或者执行完所有的case或者default语句。

switch语句中使用的表达式必须为整型表达式或不丢失便可显式地转换为整型的表达式。不丢失便可显式地转换为整型的数据类型包括字节、字符和短型数。对于长型数、浮点数和双精度数等数据类型,需明确地转换。case值必须能够求值或编译时能隐含地转换为整型的常量表达式。

图6-2 程序流程图

 程序实现过程

可以先获取系统的日期,然后将月份和日期统一成二位整型的格式,再将获取的系统时间拼成字符串,最后利用For循环和swtich语句获取中文时间信息并显示。图6-2显示程序流程图

2、部分程序关键源码(exer6.jsp)

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

<% Date dtt=new Date(); int year=dtt.getYear(); year+=1900; //获取月份

int month=dtt.getMonth(); month+=1; ..整理分享..

WORD完美格式

//获取日期

int date=dtt.getDate(); //获取星期

int day=dtt.getDay(); //将int型转换为String

String str_year=String.valueOf(year); String str_month=String.valueOf(month); String str_date=String.valueOf(date); String str_day=String.valueOf(day); //将月份和日期统一成二位整型 if(str_month.length()==1) { str_month=\"0\"+str_month; }

if(str_date.length()==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;jchi_year=chi_num_total; chi_num_total=\"\"; }

if(j==4||j==6) { if((cha_i=='1')||(cha_i=='0')) {chi_num_total=\"\";} if(cha_i!='0') {chi_num_total+=\"十\";} ..整理分享..

WORD完美格式

} if(j==5) { 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%>

四、实验思考

 上述exer6.jsp中,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程序,运行后,程序将根据服务端的不同时间段,在浏览器上显示“早上好”、“中午好”、“下午好”和“晚上好”,如图6-3所示。

..整理分享..

WORD完美格式

图6-3 显示结果

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

5~11点:早上;11~14点:中午 14~18点:下午;18点~5点:晚上

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

一、实验目的

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

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

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载

三、实验内容与步骤

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

在jsp中,当用户通过浏览器请求一个页面时,浏览器将请求发送给服务器。按照HTTP协议,浏览器发送的请求具有一定的结构,请求包括一个请求行、头域和表单提交的信息体。使用request对象,可以获取用户浏览器提交的请求信息。request对象常用的方法是getParameter(String s),该方法获取表单提交的信息。 1)在ROOT目录下编写如下源码:exer7_1.jsp

<%@ page contentType=\"text/html;Charset=GB2312\" %> <%@ taglib tagdir=\"/WEB-INF/tags\" prefix=\"com\"%>

..整理分享..

WORD完美格式

<% String textContent=request.getParameter(\"number\"); if(textContent==null)

{ out.println(\"请在文本框中输入数字,按提交按钮\"); } else {

%>

调用Computer.tag文件负责计算平方根 \" /> <% } %>

2)在ROOT\ags目录下编写如下源码:computer.tag

<%@ attribute name=\"number\" %>

<% try{ double n=Double.parseDouble(number); if(n>=0)

{ double r=Math.sqrt(n) ;

out.print(\"
\"+n+\"的平方根:\"); out.print(\"
\"+r); } else

{ out.print(\"
\"+\"请输入一个正数\"); } }

catch(NumberFormatException e)

{ out.print(\"
\"+\"请输入数字字符\"); } %>

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

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

2、response对象的使用

(1)利用response对象的setContentType方法,改变显示方式。将下列源码保存为exer7_2.jsp,运行后观察其结果:

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

在学习response对象的setContentType方法

..整理分享..

WORD完美格式

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

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

<% String str=request.getParameter(\"submit\"); if(str==null) { str=\"\"; }

if(str.equals(\"MS-Word显示\"))

{ response.setContentType(\"application/msword\"); }

else if(str.equals(\"MS-Powerpoint显示\"))

{ response.setContentType(\"application/vnd.ms-powerpoint\"); } %>

(2)利用response对象实现页面重定向。将下列源码保存为exer7_3.jsp和form.jsp,运行exer7_3.jsp后观察其结果: exer7_3.jsp:

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

填写姓名:

form.jsp:

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

<% String str=null;

str=request.getParameter(\"boy\"); if(str.length()==0)

{ response.sendRedirect(\"exer7_3.jsp\"); } else

{ out.print(\"欢迎您来到本网页!\"); ..整理分享..

WORD完美格式

out.print(str); } %>

3、out对象的使用

out对象是一个输出流,该对象调用相应的方法可以将数据发送到客户端浏览器的缓存中。其中println()和print()是常用的两个方法,其区别是:println()会向缓存区写入一个换行,而print()不写入换行。但是浏览器的显示区域目前不识别println()写入的换行,如果希望浏览器显示换行,应当向浏览器写入
实现换行。

下面的实例exer7_4使用out对象向客户输出包括表格等内容的信息,运行该实例并观察结果。 Exer7_4.jsp:

<%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"java.util.*\" %>

<% int a=2200;long b=3456;boolean c=true; out.println(a); out.println(b); out.print(\"
\"); out.println(c); %>

以下是一个表格 <% out.print(\"\"); 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(\"\"); ..整理分享..

WORD完美格式

out.println(\"

\"+\"姓名\"+\"\"+\"性别\"+\"\"+\"出生日期\"+\"
\"+\"张三\"+\"\"+\"男\"+\"\"+\"1988年5月\"+\"
\"+\"李四\"+\"\"+\"男\"+\"\"+\"1987年10月\"+\"
\"); out.print(\"\") ; %>

四、设计性实验环节

1、编写两个页面inputNumber.jsp和computerAndShow.jsp,用户可以使用inputNumber.jsp提供的表单输入一个数字,并提交给computerAndShow.jsp页面。该页面通过内置对象获取inputNumber.jsp页面提交的数字,计算并显示该数的平方和立方,并用out对象输出结果。若inputNumber.jsp页面提交的不是数字,computerAndShow.jsp页面应能重定向到inputNumber.jsp页面。(必做)

2、编写程序register.html和register.jsp,做一个用户注册的界面,要求对用户填写的部分进行合法性检验,然后提交到register.jsp进行注册检验,若用户名为user开头的,就提示“该用户名已被注册”,若用户名为admin,就提示“欢迎您,管理员”,否则,就显示“注册成功”。(必做)

实验八 session对象(4课时)

一、实验目的

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

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载

三、实验原理与内容

1、利用session对象存储数据。本实例利用session对象模拟购物车,存储客户的姓名和购买的商品,三个JSP页面分别是:main.jsp;food.jsp;count.jsp。代码如下,分析下列代码,完成实验练习(1) main.jsp

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

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

..整理分享..

WORD完美格式

<% String name=request.getParameter(\"name\"); if(name==null) { name=\"\"; } else

{ session.setAttribute(\"customerName\ } %>

<% if(name.length()>0) {

%>

点击超链接,连接到food.jsp的页面,去采购食品。 欢迎去食品柜台! <% } %>

food.jsp:

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

点击超链接,连接到main.jsp的页面,去修改姓名。 欢迎去main.jsp!

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

香肠 苹果 酱油 饮料

<% String foodName[]=request.getParameterValues(\"choice\"); if(foodName!=null)

{ for(int k=0;k{ session.setAttribute(foodName[k],foodName[k]); } } %>

点击超链接,连接到count.jsp的页面,去查看购物车中的商品。 ..整理分享..

WORD完美格式

欢迎去count.jsp!

count.jsp:

<%@ page contentType=\"text/html;Charset=GB2312\" %> <%@ page import=\"java.util.*\" %>

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

<% String personName=(String)session.getAttribute(\"customerName\"); out.println(\"
您的姓名:\"+personName);

Enumeration enumGoods=session.getAttributeNames(); out.println(\"
购物车中的商品:
\"); while(enumGoods.hasMoreElements())

{ String key=(String)enumGoods.nextElement(); String goods=(String)session.getAttribute(key); if(!(goods.equals(personName))) out.println(goods+\"
\"); } %>

点击超链接,连接到food.jsp的页面,购买食品。 欢迎去food.jsp!

点击超链接,连接到main.jsp的页面,去修改姓名。 欢迎去main.jsp!

(2)下例是利用session完成的一个猜数字的游戏,当客户端访问exer8_1.jsp时,页面产生一个1~100的随机数,并将其存入session对象,然后让客户猜这个数字。客户输入数后提交result.jsp,该页面将客户猜的数和产生的随机数进行比较,若猜对了,连接到success.jsp。该页面显示客户猜数所用的时间等信息。若猜的数字大于随机数,连接到large.jsp;否则连接到small.jsp。这两个页面都要求客户重新猜数。五个jsp页面的代码如下:

exer8_1.jsp: <%@ page contentType=\"text/html; charset=gb2312\" import=\"java.util.*\" %> 猜数字

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

<%

int number=(int)(Math.random()*100)+1; session.setAttribute(\"count\session.setAttribute(\"save\

..整理分享..

WORD完美格式

%>

输入你猜的数

result.jsp的关键代码:

<% %>

String str=request.getParameter(\"boy\"); int guessNumber=Integer.parseInt(str);

Integer integer=(Integer)session.getAttribute(\"save\"); int realnumber=integer.intValue(); if(guessNumber==realnumber) { }

else if(guessNumber>realnumber) { }

else if(guessNumberint n=((Integer)session.getAttribute(\"count\")).intValue(); n=n+1;

session.setAttribute(\"count\response.sendRedirect(\"small.jsp\");

int n=((Integer)session.getAttribute(\"count\")).intValue(); n=n+1;

session.setAttribute(\"count\response.sendRedirect(\"large.jsp\");

int n=((Integer)session.getAttribute(\"count\")).intValue(); n=n+1;

session.setAttribute(\"count\response.sendRedirect(\"success.jsp\");

large.jsp的关键代码: <%@ page contentType=\"text/html; charset=gb2312\" %> large

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

..整理分享..

WORD完美格式

<%

Integer integer=(Integer)session.getAttribute(\"count\"); int ccc=integer.intValue(); %>

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

请再输入你猜的数

small.jsp的关键代码: <%@ page contentType=\"text/html; charset=gb2312\" %> small

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

<%

Integer integer=(Integer)session.getAttribute(\"count\"); int ccc=integer.intValue(); %>

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

请再输入你猜的数

success.jsp的代码: <%@ page contentType=\"text/html; charset=gb2312\" %> success <%

int count=((Integer)session.getAttribute(\"count\")).intValue(); int num=((Integer)session.getAttribute(\"save\")).intValue(); long startTime=session.getCreationTime(); long endTime=session.getLastAccessedTime(); %>

恭喜你,猜对了

你共猜了<%=count%>次

用时<%=(endTime-startTime)/1000%>秒!

..整理分享..

WORD完美格式

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

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

四、实验练习

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

五、综合实验

利用session完成的一个猜双数字的游戏,当客户端访问exer8_2.jsp时,页面产生两个1~100的随机数,并将其存入session对象,然后让客户猜这两个个数字,如图8-1所示。客户输入数后提交result.jsp,该页面将客户猜的数和产生的随机数进行比较:

1)若两个猜对了,连接到success.jsp。

2)若猜的两个数字均大于随机数,连接到large2.jsp; 3)若猜的两个数字均小于随机数,连接到small2.jsp;

5)若猜的第一个数字大,第二个数字小,连接到largesmall.jsp 6)若猜的第一个数字小,第二个数字大,连接到smalllarge.jsp

7)若猜的两个数字中,有一个数猜测成功,继续另一个数的猜测:若大于随机数,连接到large1.jsp;若小于随机数,连接到small1.jsp。

图8-1 实验练习2运行效果

实验九 简易留言板(选做)

一、实验目的

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

二、实验工具

..整理分享..

WORD完美格式

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载

三、实验原理与内容

1、不同用户的session对象互相不同,而所有用户的application对象是共享的,因此application对象负责提供应用程序在服务器中运行时的一些全局信息。服务器启动时就创建一个application对象,当一个客户访问服务器上的一个JSP页面时,JSP引擎就为该客户分配这个application对象,所有客户共用一个application对象。

2、在下面的实例中,客户通过submit.jsp向messagePane.jsp页面提交姓名、留言标题和留言内容,messagePane.jsp页面获取这些信息之后,用同步方法将这些内容添加到一个向量中,然后将这个向量再添加到application对象中。当用户查看留言板时,showMessage.jsp负责显示所有客户的留言内容,即从application对象中取出向量,然后遍历向量中存储的信息。

Java的java.util包中的Vector类负责创建一个向量对象:Vector a=new Vector(),a可以使用add(Object o)把任何对象添加到向量的末尾,向量的大小会自动的增加。可以使用add(int index, Object o)把任何对象添加到向量的指定位置。可以使用elementAt(int index)获取指定索引处的向量的元素(索引初始位置是0);a可以使用方法size()获取向量所有的元素的个数。

3、submit.jsp:

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

输入您的名字:


输入您的留言标题:


输入您的留言:



4、messagePane.jsp:

<%@ page contentType=\"text/html;Charset=GB2312\" %> ..整理分享..

WORD完美格式

<%@ page import=\"java.util.*\" %>

<%! Vector v=new Vector(); ServletContext application;

synchronized void sendMessage(String s) { application=getServletContext();; v.add(s);

application.setAttribute(\"Mess\ } %>

<% String name=request.getParameter(\"peopleName\"); String title=request.getParameter(\"Title\"); String messages=request.getParameter(\"messages\"); if(name==null)

{ name=\"guest\"+(int)(Math.random()*10000); }

if(title==null) { title=\"无标题\"; }

if(messages==null) { messages=\"无信息\"; }

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

String s=\"#\"+name+\"#\"+title+\"#\"+time+\"#\"+messages+\"#\"; sendMessage(s);

out.print(\"您的信息已经提交!\"); %>

返回

查看留言版

5、showMessage.jsp:

<%@ page contentType=\"text/html;Charset=GB2312\" %> <%@ page import=\"java.util.*\" %>

<% Vector v=(Vector)application.getAttribute(\"Mess\"); out.print(\"

\"); out.print(\"\");

out.print(\"

\"); ..整理分享..

WORD完美格式

out.print(\"

\"); out.print(\"\"); out.print(\"\"); out.print(\"\"); for(int i=0;i\");

String message=(String)v.elementAt(i);

StringTokenizer fenxi=new StringTokenizer(message,\"#\"); out.print(\"

\");

int number=fenxi.countTokens(); for(int k=0;k{ out.print(\"

\"); } else

{out.print(\"

\"); }

}

out.print(\"

\"); }

out.print(\"

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

\"); %>

四、设计性实验环节

1、messagePane.jsp中,sendMessage()方法为什么需要用同步修饰符synchronized? 2、将留言板的留言时间用yyyy-mm-dd hh:mm:ss的形式显示。 3、在留言板中添加留言人的email和电话,并显示。

实验十 JSP中使用Java Bean(4课时)

一、实验目的

(1)、掌握编写和使用JavaBean的方法 (2)、理解怎样使用JavaBean分离JSP页面的数据显示和数据处理

二、实验工具

..整理分享..

WORD完美格式

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载 (4)Netbeans 4.1或Jcreator

三、实验原理与内容

1、为了使JSP页面使用bean,Tomcat服务器必须使用相应的字节码创建一个对象,即创建一个bean。为了让Tomcat服务器能找到字节码,字节码必须存放在特定的目录中。在当前Web服务目录下建立如下目录结构:

Web服务目录\\WEB-INF\\classes

然后根据类的包名,在目录classes下建立相应的子目录,如类的包名为tom.jiafei,那么在classes下建立子目录tom\\jiafei。为了让Tomcat服务器启用上述目录,必须重新启动Tomcat服务器。Tomcat服务器重新启动后,就可以将创建的bean的字节码文件,如Lader.class,复制到“Web服务目录\\WEB-INF\\classes\om\\jiafei”中。以下通过几个实例来进一步掌握bean的使用

2、四则运算bean 创建bean的源文件:

ComputerBean.java: package tom.jiafei; 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=s.trim();; }

public String getOperator() { return operator; ..整理分享..

WORD完美格式

}

public double getResult() { if(operator.equals(\"+\")) { result=numberOne+numberTwo; }

else if(operator.equals(\"-\")) { result=numberOne-numberTwo; }

else if(operator.equals(\"*\")) { result=numberOne*numberTwo; }

else if(operator.equals(\"/\")) { result=numberOne/numberTwo; }

return result; } }

JSP页面:

Computer.jsp: <%@ page contentType=\"text/html;Charset=GB2312\" %> <%@ page import=\"tom.jiafei.CalendarBean\" %>

输入两个数:

选择运算符号:


..整理分享..

WORD完美格式

=

3、时间bean

创建bean的源文件:

ShowCalendar.java package tom.jiafei; import java.util.*; public class ShowCalendar { Calendar calendar = null;

int year,dayOfMonth,dayOfYear,weekOfYear, weekOfMonth,dayOfWeek,hour,minute,second; String day,date,time; public ShowCalendar()

{ calendar = Calendar.getInstance(); Date time = new Date(); calendar.setTime(time); }

public int getYear()

{ return calendar.get(Calendar.YEAR); }

public String getMonth()

{ int m=1+calendar.get(Calendar.MONTH);

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() //获取:时:分:秒 ..整理分享..

WORD完美格式

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

public int getDayOfMonth() {

return calendar.get(Calendar.DAY_OF_MONTH);

}

public int getDayOfYear() {

return calendar.get(Calendar.DAY_OF_YEAR);

}

public int getWeekOfYear()

{ return calendar.get(Calendar.WEEK_OF_YEAR); }

public int getWeekOfMonth()

{ return calendar.get(Calendar.WEEK_OF_MONTH); }

public int getDayOfWeek() 天

{ return calendar.get(Calendar.DAY_OF_WEEK)-1; }

public int getHour()

{ return calendar.get(Calendar.HOUR_OF_DAY); }

public int getMinute()

{ return calendar.get(Calendar.MINUTE); }

public int getSecond()

{ return calendar.get(Calendar.SECOND); } }

JSP页面:

time.jsp <%@ page contentType=\"text/html;Charset=GB2312\" %> <%@ page import=\"tom.jiafei.ShowCalendar\" %>

WORD完美格式

align=\"center\">color=\"blue\">name=\"clock\"

property=\"year\"/>年

日 星期

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

4、日历bean

创建bean的源文件:

CalendarBean.java package tom.jiafei; import java.util.*; public class CalendarBean { String calendar=null; int year=-1,month=-1;

public void setYear(int year) { this.year=year; }

public int getYear() { return year; }

public void setMonth(int month) ..整理分享..

WORD完美格式

{ this.month=month; }

public int getMonth() { return month; }

public String getCalendar()

{ StringBuffer buffer=new StringBuffer(); Calendar rili=Calendar.getInstance();

rili.set(year,month-1,1); //将日历翻到year年month月1日,注意0表示一月, //依次类推,11表示12月。

//获取1日是星期几(get方法返回的值是1表示星期日,返回的值是7表示星期六): int 星期几=rili.get(Calendar.DAY_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]=String.valueOf(n) ; n++; }

for(int i=星期几+day,n=1;i<42;i++) { a[i]=\"**\" ; } //用表格显示数组:

buffer.append(\"

\"); ..整理分享..

WORD完美格式

buffer.append(\"

\") ;

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

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

{ buffer.append(\"

\"); }

buffer.append(\"

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

{ buffer.append(\"

\") ; for(int j=k;j\"+a[j]+\"\"); }

buffer.append(\"

\") ; }

buffer.append(\"{ return \"选择一个年份和月份单击提交键\"; } } }

JSP页面:

showcalendar.jsp <%@ page contentType=\"text/html;Charset=GB2312\" %> <%@ page import=\"tom.jiafei.CalendarBean\" %>

选择日历的年份: 选择日历的月份:



月的日历:

四、实验练习

使用bean实现实验八的猜数游戏。创建bean的源文件是GuessNumber.java,能实现的对用户猜数的判断(正确、大或是小?),记录猜测的次数,并计算猜数时间。getNumber.jsp是起始猜数页面,而guess.jsp页面显示每次猜数的结果。若猜数正确,应显示如下图10-1的效果。

..整理分享..

WORD完美格式

图10-1 练习1运行效果

五、综合实验

编写一个JSP文件计数器。Test.jsp文件用于在浏览器中运行,count.java是后台的一个JavaBean程序,用来读计数器的值和写入计数器值,Count.txt 保存计数器。 (以下是count.java的参考)

import java.io.*;

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 = file.readLine(); }

catch (IOException e) {//错误处理

System.out.println(\"读取数据错误.\"); }

if (currentRecord == null) //如果文件为空 ..整理分享..

WORD完美格式

returnStr = \"没有任何记录\"; else

{//文件不为空

returnStr =currentRecord; }

//返回读取文件的数据 return returnStr; }

//WriteFile方法用来将数据counter+1后写入到文本文件filePath中 //以实现计数增长的功能

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

path = filePath;

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

int Writestr = Integer.parseInt(counter)+1; try {

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

PrintWriter pw = new PrintWriter(new FileOutputStream(filePath)); //用文本格式打印整数Writestr pw.println(Writestr); //清除PrintWriter对象 pw.close();

} catch(IOException e) { //错误处理

System.out.println(\"写入文件错误\"+e.getMessage()); } } }

实验十一 JSP中的文件操作

一、实验目的

(1)、掌握在JSP中怎样使用Java的输入流、输出流实现有关的文件操作 (2)、编写JSP页面,实现文件上传和下载。 (3)、进一步学习使用JSP+JavaBeans的设计模式,将有关文件的读写指派给JavaBean

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003

..整理分享..

WORD完美格式

(3)Tomcat服务器,也可以从网上免费下载 (4)Netbeans 4.1或Jcreator

三、实验原理与内容

(1)文件上传

RandomAccessFile类所创建的流既可以作为源,也可以作为目的地,所以在文件的上传和下载的时候,通常使用RandomAccessFile类。

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

UpFile.java: package tom.jiafei; import java.io.*;

import javax.servlet.http.*; public class UpFile

{ HttpServletRequest request; HttpSession session; String upFileMessage=\"\";

public void setRequest(HttpServletRequest request) { this.request=request; }

public void setSession(HttpSession session) { this.session=session; }

public String getUpFileMessage() { String fileName=null;

try{ String tempFileName=(String)session.getId();//客户的session的id File f1=new File(\"D:/apache-tomcat-5.5.20/webapps/chaper6\ FileOutputStream o=new FileOutputStream(f1); InputStream in=request.getInputStream(); byte b[]=new byte[10000]; int n;

while( (n=in.read(b))!=-1) { o.write(b,0,n); } o.close(); in.close();

RandomAccessFile random=new RandomAccessFile(f1,\"r\"); int second=1; //读出f1的第2行,析取出上传文件的名字: String secondLine=null; while(second<=2)

{ secondLine=random.readLine(); ..整理分享..

WORD完美格式

second++; }

//获取第2行中目录符号'\\'最后出现的位置 int position=secondLine.lastIndexOf('\\\\'); //客户上传的文件的名字是:

fileName=secondLine.substring(position+1,secondLine.length()-1); byte cc[]=fileName.getBytes(\"ISO-8859-1\"); fileName=new String(cc);

session.setAttribute(\"Name\ random.seek(0); // // long forthEndPosition=0; int forth=1;

while((n=random.readByte())!=-1&&(forth<=4)) { if(n=='\\n')

{ forthEndPosition=random.getFilePointer(); forth++; } }

// File f2= new File(\"D:/apache-tomcat-5.5.20/webapps/chaper6\ RandomAccessFile random2=new RandomAccessFile(f2,\"rw\");

// random.seek(random.length());

long endPosition=random.getFilePointer(); long mark=endPosition; int j=1;

while((mark>=0)&&(j<=6)) { mark--;

random.seek(mark); n=random.readByte(); if(n=='\\n')

{ endPosition=random.getFilePointer(); j++; } }

// random.seek(forthEndPosition);

long startPoint=random.getFilePointer();

//..整理分享..

供show.jsp页面使用 再定位到文件f1的开头。 获取第4行回车符号的位置: 根据客户上传文件的名字,将该文件存入磁盘:

确定出文件f1中包含客户上传的文件的内容的最后位置,即倒数第6行。 将random流指向文件f1的第4行结束的位置: 从f1读出客户上传的文件存入f2(读取从第4行结束位置和倒数第6行之间的内容) WORD完美格式

while(startPointstartPoint=random.getFilePointer(); }

random2.close(); random.close();

f1.delete(); //删除临时文件

upFileMessage=fileName+\" Successfully UpLoad\"; return upFileMessage; }

catch(Exception exp) { if(fileName!=null)

{ upFileMessage=fileName+\" Fail to UpLoad\"; return upFileMessage; } else

{ upFileMessage=\"\"; return upFileMessage; } } } }

JSP页面代码如下:

upfile.jsp: <%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"tom.jiafei.UpFile\" %>

选择要上传的文件:


<% upFile.setRequest(request); upFile.setSession(session); %>

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

WORD完美格式

show.jsp: <%@ page contentType=\"text/html;Charset=GB2312\" %>

<% String pic=(String)session.getAttribute(\"Name\"); out.print(pic);

out.print(\"\"); %>

(2)文件下载

创建bean的源文件如下:

DownLoadFile.java: package tom.jiafei; import java.io.*;

import javax.servlet.http.*; public class DownLoadFile { HttpServletResponse response; String fileName;

public void setResponse(HttpServletResponse response) { this.response=response; }

public String getFileName() { return fileName; }

public void setFileName(String s) { fileName=s;

File fileLoad=new File(\"f:/2000\ //客户使用下载文件的对话框:

response.setHeader(\"Content-disposition\ } }

JSP页面:

downfile.jsp: <%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"tom.jiafei.DownLoadFile\" %> <%@ page import=\"java.io.*\" %> ..整理分享..

WORD完美格式

选择要下载的文件:

<% downFile.setResponse(response); %>

四、综合设计实验环节:

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

ReadFile.java的参考关键代码: package fff; import java.io.*; public class ReadFile

{ String fileDir=\"c:/\ 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[]=dir.listFiles(); StringBuffer list=new StringBuffer(); for(int i=0;iWORD完美格式

{ if ((file_name[i]!=null)&&(file_name[i].isFile())) { String temp=file_name[i].toString(); int n=temp.lastIndexOf(\"\\\\\"); temp=temp.substring(n+1); list.append(\" \"+temp); } }

listFile=new String(list); return listFile; }

public String getReadContent()

{ 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=inTwo.readLine())!=null) { stringbuffer.append(\"\\n\"+s); }

String temp=new String(stringbuffer);

readContent=\"\"; }

catch(IOException e)

{ readContent=\"\"; }

return readContent; } }

选择目录的页面filepathselect.jsp通过表单让用户选择目录,并将选择提交给listfilename.jsp页面,效果如图11-1所示。

..整理分享..

WORD完美格式

图11-1 图11-2

选择文件页面listfilename.jsp使用Bean(相应的二进制文件是ReadFile.class)显示指定目录包含的所有子目录和文件,并让用户选择需要读的文件,效果如图11-2所示

当用户在上面页面中输入文件名后,提交给readfile.jsp。它使用Bean(相应的二进制文件是ReadFile.class)读取文件内容。页面效果如图11-3所示

图11-3

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

实验十二 JSP中使用数据库

一、实验目的

(1)、掌握在JSP中使用JDBC实现数据库的连接、查询、修改。 (2)、掌握在JSP中实现数据库表的分页查询。 (3)、进一步学习使用JSP+JavaBeans的设计模式,将有关数据库操作的方法指派给JavaBean来实现。

..整理分享..

WORD完美格式

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载 (4)Netbeans 4.1或Jcreator

三、实验原理与内容

1、建立实验所用的数据库,打开Microsoft Access,出现建立数据库的对话框,选“空Access数据库”,如图12-1所示,点击【确定】后,出现保存数据库的对话框,将数据库以“mydata.mdb”名字保存在“D:\\”根目录下。

图12-1 新建数据库 图12-2 选择数据库名并保存

图12-3 图12-4 新建表student的各个字段

在出现的对话框中双击【使用设计器创建表】,即可在此数据库中添加表格,如图12-3所示。若建立一个student表,该表有ID、学号、姓名、操作系统、微机原理、数据结构六个字段,则在图12-4所示的对话框中以此输入六个字段的名称(用中文缩写的形式),注意各个字段的数据类型。选择id字段为主键(工具栏的小钥匙)。

关闭“表设计器窗口”,提示保存表的名字,如图12-5所示,输入“student”并按【确定】,此时已经向数据库中添加了一个空的student表格。在主界面双击“student”,即可为该表添加数据,如图12-6所示

..整理分享..

WORD完美格式

图12-5

图12-6 表student的数据

2、不采用bean实现数据库的连接、查询和修改。 (1)创建与指定数据库的连接

JSP中连接数据库有两种方式:JDBC-ODBC桥接方式和纯Java驱动程序方式。若使用JDBC-ODBC桥接方式与数据库建立连接,需要3个步骤:

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

图12-7 添加或删除ODBC数据源 图12-8 为ODBC数据源选择驱动

①在windows中添加ODBC数据源 选择【控制面板】【管理工具】【ODBC数据源】,出现如图12-7所以界面,选择“系统DSN”,点【添加…】,出现如图12-8所示的界面,伪数据源选择驱动。

②为数据源选择驱动

如果待连接的数据库是SQL Server数据库,则选择“SQL Server”选项,点击【完成】即可。若待连接的数据库是Access数据库,则选择“Driver do Microsoft

..整理分享..

WORD完美格式

Access”选项,点击【完成】。

③指定数据源的名称和所在位置 在图12-9对话框中,填写数据源的名称为mydata,点击【选择…】可以为这个数据源指定数据库,如图12-10所示。点选驱动器,找到D:盘,左侧备选框中即可出现mydata.mdb,点击mydata.mdb,即可指向刚刚建立的数据库mydata。数据库选择完毕,一直按【确定】退出ODBC数据源的创建对话框,到此,一个ODBC的数据源成功建立。

图12-9 图12-10

 建立JDBC-ODBC桥接器

现在,我们已经有了ODBC数据源:mydata,这个数据源就是一个数据库:mydata.mdb(建立数据源时,数据源的名字和数据库的名字可以不同),里面有个表格student。为了连接这个数据库,首先要建立一个JDBC-ODBC的桥接器:

try {Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);} catch(ClassNotFoundException e){}

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

try {Connection con=DriveManager.getConnection(“jdbc:odbc:mydata”,””,””);} catch(SQLException e){}

 建立查询结果集ResultSet

和数据库连接之后,就可以进行执行查询、修改等操作,而对数据库的操作都是SQL语言为基础的,所以,在执行特定的“查询/修改”操作前,必须使用Statement声明一个SQL语句对象

try {Statement sql=con.createStatement();} catch(SQLException e){}

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

try

{Statement

sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_READ_ONLY);}

catch(SQLException e){}

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

有了SQL语句对象后,这个对象就可以调用相应的方法,实现对数据库表的查询和修改,并将结果存放在一个ResultSet类声明的对象中。

ResultSet rs=sql.executeQuery(“SELECT * FROM student”)

..整理分享..

WORD完美格式

或 ResultSet rs=sql.executeQuery(“SELECT xh,xm,wjyl FROM student”)

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

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

void rs.close()//关闭结果集

Xxx rs.getXxx(String columnName)//得到结果集某一列的值 Xxx rs.getXxx(int columnIndex)//得到结果集某一列的值

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

public void rs.last()//将游标点移动到结果集的最后一行 public boolean rs.previous()//将游标点移动到结果集的上一行 public boolean rs.isLast()//检测游标是否在结果集最后一行 public boolean rs.isFirst()//检测游标是否在结果集第一行 public int rs.getRow()//得到游标当前行号,从1开始

public boolean rs.absolute(int rows)// 将游标点移动到结果集的指定行 public boolean rs.isBeforeFirst ()//检测游标是否在结果集第一行之前 public boolean rs.isAfterLast()//检测游标是否在结果集最后一行之后 public void rs.beforeFirst()//将游标点移动到结果集的第一行之前 public void rs.afterLast()//将游标点移动到结果集的最后一行之后

若使用纯Java驱动程序方式与数据库建立连接,需要2个步骤:  加载纯Java驱动程序(无需创建ODBC数据源)  和指定的数据库建立连接

(2)参数查询

exa4_5.jsp输入查询条件,可以按姓名查询成绩,也可以按分数段查询成绩。若按照姓名查询,提交给byname.jsp;若按照分数段查询,请求提交给byscore.jsp,以下是此三个jsp页面的关键代码,运行并观察结果 exa4_5.jsp:

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

成绩查询

输入姓名:

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

WORD完美格式

之间


操作系统分数在

之间


byname.jsp: <%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"java.sql.*\" %>

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

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

byte b[]=name.getBytes(\"ISO-8859-1\"); name=new String(b); Connection con=null; Statement sql=null; ResultSet rs=null;

try{Class.forName(\"sun.jdbc.odbc.JdbcOdbcDriver\"); }

catch(ClassNotFoundException e){}

try { con=DriverManager.getConnection(\"jdbc:odbc:mydata\ sql=con.createStatement();

String condition=\"SELECT * FROM student WHERE xm = \"+\"'\"+name+\"'\"; rs=sql.executeQuery(condition); out.print(\"

\"+weekday[k]+\"
\"); out.print(\"\");

out.print(\"

\"); while(rs.next())

{ out.print(\"

\");

out.print(\"

\"); out.print(\"\"); out.print(\"\"); out.print(\"\"); out.print(\"\"); out.print(\"\") ; }

out.print(\"

\"+\"学号\"); out.print(\"\"+\"姓名\"); out.print(\"\"+\"操作系统\"); out.print(\"\"+\"微机原理\"); out.print(\"\"+\"数据结构\"); ..整理分享..

WORD完美格式

out.print(\"

\"+rs.getString(2)+\"\"+rs.getString(3)+\"\"+rs.getInt(4)+\"\"+rs.getInt(5)+\"\"+rs.getInt(6)+\"
\"); con.close(); }

catch(SQLException e) { } %>

byscore.jsp: <%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"java.sql.*\" %>

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

String wjylmax=request.getParameter(\"wjylmax\"); if(wjylmax==null) {wjylmax=\"100\"; }

String wjylmin=request.getParameter(\"wjylmin\"); if(wjylmin==null) {wjylmin=\"0\"; }

String czxtmax=request.getParameter(\"czxtmax\"); if(czxtmax==null) {czxtmax=\"100\"; }

String czxtmin=request.getParameter(\"czxtmin\"); if(czxtmin==null) {czxtmin=\"0\"; }

Connection con=null; ..整理分享..

WORD完美格式

Statement sql=null; ResultSet rs=null;

try{Class.forName(\"sun.jdbc.odbc.JdbcOdbcDriver\"); }

catch(ClassNotFoundException e){} try

{ con=DriverManager.getConnection(\"jdbc:odbc:mydata\ sql=con.createStatement();

String eCondition=\"wjyl <= \"+wjylmax+\" AND \"+\"wjyl >= \"+wjylmin; String mCondition=\"czxt <= \"+czxtmax+\" AND \"+\"czxt >= \"+czxtmin;

String condition=\"SELECT * FROM student WHERE \"+mCondition+\" and \"+eCondition; rs=sql.executeQuery(condition); out.print(\"

\"); out.print(\"\");

out.print(\"

\"); while(rs.next()) { out.print(\"\");

out.print(\"

\"); out.print(\"\"); out.print(\"\"); out.print(\"\"); out.print(\"\"); out.print(\"\") ; }

out.print(\"

\"+\"学号\"); out.print(\"\"+\"姓名\"); out.print(\"\"+\"操作系统\"); out.print(\"\"+\"微机原理\"); out.print(\"\"+\"数据结构\"); out.print(\"
\"+rs.getString(2)+\"\"+rs.getString(3)+\"\"+rs.getInt(4)+\"\"+rs.getInt(5)+\"\"+rs.getInt(6)+\"
\"); con.close(); }

catch(SQLException e) {} %>

(3)更新记录

下例使用executeUpdate()方法更新记录中的字段值。exa4_8.jsp输入学生姓名和各科成绩,并将请求提交给newResult.jsp,该页面实现更新记录,运行下列程序,观

..整理分享..

WORD完美格式

察结果。

exa4_8.jsp: <%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"java.sql.*\" %>

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

输入新的操作系统成绩:


输入新的微机原理成绩:


输入新的数据结构成绩:


数据库更新前的数据记录是: <% String name,number; int czxt,wjyl,sjjg; Connection con; Statement sql; ResultSet rs;

try{Class.forName(\"sun.jdbc.odbc.JdbcOdbcDriver\"); }

catch(ClassNotFoundException e){out.print(\"abb\"+e+\"bb\");} try{ con=DriverManager.getConnection(\"jdbc:odbc:mydata\ sql=con.createStatement();

rs=sql.executeQuery(\"SELECT * FROM student\"); out.print(\"

\"); out.print(\"\");

out.print(\"

\"); while(rs.next()) { out.print(\"\");

number=rs.getString(\"xh\"); ..整理分享..

WORD完美格式

out.print(\"

\"); name=rs.getString(\"xm\"); out.print(\"\"); czxt=rs.getInt(\"czxt\");

out.print(\"

\"); wjyl=rs.getInt(\"wjyl\"); out.print(\"\"); sjjg=rs.getInt(\"sjjg\");

out.print(\"

\"); out.print(\"\") ; }

out.print(\"

\"+\"学号\"); out.print(\"\"+\"姓名\"); out.print(\"\"+\"操作系统\"); out.print(\"\"+\"微机原理\"); out.print(\"\"+\"数据结构\"); out.print(\"
\"+number+\"\"+name+\"\"+czxt+\"\"+wjyl+\"\"+sjjg+\"
\"); con.close(); }

catch(SQLException e1) {out.print(\"aaaa\"+e1+\"aaaa\"); } %>

newResult.jsp: <%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"java.sql.*\" %>

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

String newxm=request.getParameter(\"new_xm\"); if(newxm==null) {newxm=\"\"; } byte b[]=newxm.getBytes(\"ISO-8859-1\"); newxm=new String(b);

String newczxt=request.getParameter(\"new_czxt\"); if(newczxt==null) {newczxt=\"-100\"; } String newwjyl=request.getParameter(\"new_wjyl\"); if(newwjyl==null) {newwjyl=\"-100\"; } String newsjjg=request.getParameter(\"new_sjjg\"); if(newsjjg==null) {newsjjg=\"-100\"; } Connection con=null; Statement sql=null; ResultSet rs=null; String xh,xm; int czxt,wjyl,sjjg;

try{Class.forName(\"sun.jdbc.odbc.JdbcOdbcDriver\"); ..整理分享..

WORD完美格式

}

catch(ClassNotFoundException e){out.print(\"mmm\"+e);}

try {con=DriverManager.getConnection(\"jdbc:odbc:mydata\ sql=con.createStatement(); String condition1=

\"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+\"'\" ; //执行更新操作:

sql.executeUpdate(condition1); sql.executeUpdate(condition2); sql.executeUpdate(condition3); //显示更新后的表中的记录: %>

更新后的表的记录: <%

rs=sql.executeQuery(\"SELECT * FROM student\"); out.print(\"

\"); out.print(\"\");

out.print(\"

\"); while(rs.next()) {

out.print(\"

\"); xh=rs.getString(2);

out.print(\"

\"); xm=rs.getString(3);

out.print(\"

\"); czxt=rs.getInt(4);

out.print(\"

\"); wjyl=rs.getInt(5);

out.print(\"

\"); sjjg=rs.getInt(6);

out.print(\"

\"); ..整理分享..

WORD完美格式

out.print(\"

\") ; }

out.print(\"

\"+\"学号\"); out.print(\"\"+\"姓名\"); out.print(\"\"+\"操作系统\"); out.print(\"\"+\"微机原理\"); out.print(\"\"+\"数据结构\"); out.print(\"
\"+xh+\"\"+xm+\"\"+czxt+\"\"+wjyl+\"\"+sjjg+\"
\"); con.close(); }

catch(SQLException e) {out.print(e) ; } %>

(4)分页显示

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

showByPage.jsp: <%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"java.sql.*\" %>

<%! int pageSize=3; //每页显示的记录数。 int pageCount=0; //分页后的总页数。 %>

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

输入页码数

<% Connection con; Statement sql; ResultSet rs;

try{Class.forName(\"sun.jdbc.odbc.JdbcOdbcDriver\"); }

catch(ClassNotFoundException e){}

try { con=DriverManager.getConnection(\"jdbc:odbc:mydata\ sql=

con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); //返回可滚动的结果集:

rs=sql.executeQuery(\"SELECT * FROM student\"); //将游标移动到最后一行: rs.last();

//获取最后一行的行号: int lastRow=rs.getRow(); ..整理分享..

WORD完美格式

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

pageCount=(lastRow%pageSize==0)?(lastRow/pageSize):(lastRow/pageSize+1); //当前显示的初始页数: int showPage=1; //告知客户总页数: %>

共有<%=pageCount%>页
每页显示<%=pageSize%>条记录. <% //获取客户想要显示的页数:

String integer=request.getParameter(\"showPage\"); if(integer==null) { integer=\"1\"; }

try {showPage=Integer.parseInt(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; rs.absolute(posion); // 设置游标的位置 out.print(\"

\"); out.print(\"\");

out.print(\"

\"); for (int i=1;i<=pageSize;i++) { out.print(\"\");

out.print(\"

\"); ..整理分享..

WORD完美格式

out.print(\"

\"); out.print(\"\"); out.print(\"\"); out.print(\"\"); out.print(\"\") ; rs.next(); }

out.print(\"

\"+\"学号\"); out.print(\"\"+\"姓名\"); out.print(\"\"+\"操作系统\"); out.print(\"\"+\"微机原理\"); out.print(\"\"+\"数据结构\"); out.print(\"
\"+rs.getString(2)+\"\"+rs.getString(3)+\"\"+rs.getInt(4)+\"\"+rs.getInt(5)+\"\"+rs.getInt(6)+\"
\"); con.close(); }

catch(SQLException e1) {} %>

3、采用bean实现数据库的基本操作,具体方法参加教材第7章。下列实例基于CachedRowSet对象实现分页查询的方法,适用于结果集记录非常多的场合

ShowRecordByPage.java package tom.jiafei; import java.sql.*; import com.sun.rowset.*; 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{ Class.forName(\"sun.jdbc.odbc.JdbcOdbcDriver \").newInstance(); }

catch(Exception e){} }

public void setPageSize(int size) { pageSize=size; ..整理分享..

WORD完美格式

字段个数=0;

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

try{ Connection con=DriverManager.getConnection(uri,user,password); DatabaseMetaData metadata=con.getMetaData();

ResultSet rs1=metadata.getColumns(null,null,tableName,null); int k=0;

while(rs1.next()) { 字段个数++;

字段[k]=rs1.getString(4); //获取字段的名字 k++; }

Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_READ_ONLY);

ResultSet rs=sql.executeQuery(\"SELECT * FROM \"+tableName); rowSet=new CachedRowSetImpl(); //创建行集对象 rowSet.populate(rs);

con.close(); //关闭连接 rowSet.last();

int m=rowSet.getRow(); //总行数 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) ..整理分享..

WORD完美格式

showPage=pageAllCount; presentPageResult=show(showPage); return presentPageResult; }

public StringBuffer show(int page) { StringBuffer str=new StringBuffer(); str.append(\"

\"); str.append(\"\");

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

{ str.append(\"

\"); }

str.append(\"

\");

try{ rowSet.absolute((page-1)*pageSize+1); for(int i=1;i<=pageSize;i++) { str.append(\"

\");

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

{ str.append(\"

\"); }

str.append(\"

\"); rowSet.next(); } }

catch(SQLException exp){} str.append(\"

\"+字段[i]+\"
\"+rowSet.getString(k)+\"
\"); return str; }

public void setDatabaseName(String s) { databaseName=s.trim(); }

public String getDatabaseName() { return databaseName; }

public void setTableName(String s) { tableName=s.trim(); }

public String getTableName() { return tableName; }

public void setPassword(String s) { password=s.trim();; ..整理分享..

WORD完美格式

}

public void setUser(String s) { user=s.trim(); }

public String getUser() { return user; } }

choiceDatabase.jsp <%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"tom.jiafei.ShowRecordByPage\" %>


该数据库

表 的记录中将分页显示。


共有 页.
每页最多显示条记录。
单击超链接分页查看


分页查看>

showBypage.jsp <%@ page contentType=\"text/html;charset=GB2312\" %> <%@ page import=\"tom.jiafei.ShowRecordByPage\" %>

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

条记录


当前显示第页,

共有WORD完美格式

/>页。


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

\" >

\" >

输入页码:

返回主页 四、实验思考题

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

2、修改实验内容3的ShowRecordByPage.java和showBypage.jsp的源代码,在分页显示的基础上,加入“首页”、“末页”的链接。

五、设计性实验环节

根据实验内容(4)的运行结果,在分页显示的基础上,加入“首页”、“上一页”、“下一页”、“末页”的链接,如图12-11所示。设计出满足要求的JSP程序。

..整理分享..

WORD完美格式

图12-11

实验十三 Java Servlet

一、实验目的

(1)、掌握怎样编写和使用Servlet。 (2)、掌握编写和配置和Servlet有关的web.xml文件。 (3)、掌握在Servlet中使用session的方法;熟悉把用户对某JSP页面或Servlet的请求转发给另一个JSP页面或Servlet的方法。

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载 (4)Netbeans 4.1或Jcreator

三、实验原理与内容

(1)、有些Web应用可能需要JSP+JavaBean+Servlet来完成,需要服务器再创建一些Servlet对象,配合JSP页面来完成整个Web应用程序的工作。本小节实验将介绍怎样编写创建Servlet对象的类,怎样在Tomcat服务器上保存编译后的字节码、编写部署文件,怎样请求Tomcat服务器创建一个Servlet对象。

① 复制需要的jar文件:为了编译Servlet源文件,需要HttpServlet、HttpServletRequest等类,JDK内置包中并不包含这些类文件,用户需要将Tomcat服务器中common\\lib目录下的servlet-api.jar文件复制到JDK安装目录的\\jre\\lib\\ext子目录中。

② 添加Servlet类的字节码文件: 使用Jcreator或Netbeans中编写如下的Servlet类:Computer.java,保存在D:盘根目录下,编译该类,形成star\\moon\\Computer.class,将此文件夹保存到Tomcat当前Web目录(如:ROOT目录)下的\\WEB-INF\\classes子目

..整理分享..

WORD完美格式

录中,重新启动Tomcat。

Computer.java: package star.moon; import java.io.*; import javax.servlet.*; import javax.servlet.http.*;

public class Computer extends HttpServlet

{ public void init(ServletConfig config) throws ServletException { super.init(config); }

public void service(HttpServletRequest request,HttpServletResponse response) throws IOException

{ response.setContentType(\"text/html;charset=GB2312\"); PrintWriter out=response.getWriter(); out.println(\"\");

String number=request.getParameter(\"number\"); //获取客户提交的信息。 double n=0;

try{ n=Double.parseDouble(number);

out.print(\"
\"+number+\"的平方根是:\"); out.print(\"
\"+Math.sqrt(n)); }

catch(NumberFormatException e)

{ out.print(\"

请输入数字字符!

\"); }

out.println(\"\"); } }

③编写部署文件:在 Web当前目录\\WEB-INF\\classes子目录中,用记事本打开web.xml文件,在“”标记下,添加如下几行并保存:

computer

star.moon.Computer

computer /getResult

④运行Servlet:编写givenumber.jsp文件,该文件通过表单向Servlet提交一个正实数,Servlet负责计算这个数的平方根并返回给客户。

..整理分享..

WORD完美格式

givenumber.jsp <%@ page contentType=\"text/html;Charset=GB2312\" %>

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

(2)、当用户请求一个Servlet时,Sevlet会调用doPost()或doGet()方法响应用户的请求。doPost()或doGet()方法的两个参数类型都是HttpServletRequest和HttpServletResponse,而且由服务器负责实例化,因此在Servlet类中可以直接使用这两个参数。本小节实验学习在Servlet类中使用HttpServletResponse类的重定向方法sendRedirect()和RequestDispatcher类的转发方法forward()。 ①添加Servlet类的字节码文件: 使用Jcreator或Netbeans中编写如下的两个Servlet类:Verify.java和ShowMessage.java,保存在D:盘根目录下,编译该类,形成***.class的字节码文件,将此文件夹保存到Tomcat当前Web目录(如:ROOT目录)下的\\WEB-INF\\classes子目录中。

Verify.java package star.moon; import java.io.*; import javax.servlet.*; import javax.servlet.http.*;

public class Verify extends HttpServlet

{ public void init(ServletConfig config) throws ServletException {super.init(config); }

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

{ String name=request.getParameter(\"name\"); //获取客户提交的信息 String age=request.getParameter(\"age\"); //获取客户提交的信息 int numberAge=Integer.parseInt(age); if(name.length()==0||name==null)

{ response.sendRedirect(\"input.jsp\"); //重定向 }

else if(age.length()==0||name==null)

{ response.sendRedirect(\"input.jsp\"); //重定向

}

else if(numberAge<=0||numberAge>=150) { response.sendRedirect(\"input.jsp\"); ..整理分享..

WORD完美格式

} else

{ RequestDispatcher dispatcher=

request.getRequestDispatcher(\"forYouShowMessage\");

dispatcher.forward(request, response); //重定向 } }

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

ShowMessage.java package star.moon; import java.io.*; import javax.servlet.*; import javax.servlet.http.*;

public class ShowMessage extends HttpServlet

{ public void init(ServletConfig config) throws ServletException {super.init(config); }

public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { response.setContentType(\"text/html;charset=GB2312\"); PrintWriter out=response.getWriter();

String name=request.getParameter(\"name\"); //获取客户提交的信息 String age=request.getParameter(\"age\"); //获取客户提交的信息 try{ byte bb[]=name.getBytes(\"ISO-8859-1\"); name=new String(bb,\"gb2312\"); }

catch(Exception exp){}

out.print(\"
您的姓名是:\"); out.print(name);

out.print(\"
您的年龄是:\"); out.print(age); }

public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { doPost(request,response); ..整理分享..

WORD完美格式

} }

②编写部署文件:在 Web当前目录\\WEB-INF\\classes子目录中,用记事本打开web.xml文件,在“”标记下,添加如下几行并保存:

verify

star.moon.Verify

showMessage

star.moon.ShowMessage

verify

/verifyYourMessage

showMessage /forYouShowMessage

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

input.jsp <%@ page contentType=\"text/html;charset=GB2312\" %>

输入姓名:
输入年龄:

四、实验思考题

1、假设创建Servlet的类是tom.jiafei.Student,应当怎样配置web.xml文件? 2、 HttpServletResponse类的sendRedirect()方法和RequestDispatcher类的

forward()方法有何不同?

五、综合实验

利用Servlet实验猜数字游戏,实验运行的效果如图13-1、图13-2和图13-3所示

..整理分享..

WORD完美格式

图13-1 图13-2

图13-3

实验十四 网上书店

一、实验目的

(1)、综合掌握JSP页面设计的方法。 (2)、综合掌握JSP+JavaBean的设计模式。 (3)、掌握JSP+JavaBean+Servlet的设计方法。

二、实验工具

(1)JDK1.4、JDK1.5或JDK1.6,可以从SUN公司的网站免费下载 (2)编辑工具:记事本或Dreamweaver MX 2004、FrontPage 2003 (3)Tomcat服务器,也可以从网上免费下载 (4)Netbeans 4.1或Jcreator

三、实验原理与内容

1、系统功能

本系统建立一个全面的网上图书购物系统。该系统包括用户注册、用户登录、书目浏览、订购图书、查看订单、修改订单、修改密码和信息等功能,框架如图14-1所示。

..整理分享..

WORD完美格式

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

网上书店

用户业务 网上业务

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

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

图14-1 系统功能框架

修改订单

(1)用户注册:新用户填写表单、包括用户名、E-mail地址等信息。如果输入的用户名已经被其他用户注册使用,系统提示用户更改用户名。

(2)用户登录:输入用户名、密码。如果用户输入的用户名或者密码有错误,系统将显示错误信息;如果登录成功,将就一个成功登录的信息返回给用户,同时用户被连接到“订购图书”页面。

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

(4)订购图书:成功登录的用户可以在该页面订购所需要的图书。如果用户直接进入该页面或没有成功登录就进入该页面,将被连接到“用户登录”页面。

(5)查看订单:成功登录的用户可以在该页面查看自己的订单。如果用户直接进入该页面或者没有成功登录就进入该页面,将被连接到“用户登录”页面。

(6)修改订单:成功登录的用户可以在该页面删除自己的订单。如果用户直接进入该页面或者没有成功登录就进入该页面,将被连接到“用户登录”页面。

(7)修改密码:成功登录的用户可以在该页面修改自己的密码。如果用户直接进入该页面或者没有成功登录就进入该页面,将被连接到“用户登录”页面。 (8)修改个人信息:可以修改密码和用户名以外的个人信息。

2、数据库设计

用Access建立一个数据库shop.mdb(也可以用SQL Server2000),建有注册信息表(user)、书目表(book)、购物车表(preorder)和订单表(orderform) 信息注册表(user)的字段有: 用户登录名称(logname),主键 用户的真实姓名(realname) 口令(password)

电子邮件地址(email) 电话(phone)

邮寄地址(address)

..整理分享..

WORD完美格式

书目表(book)的字段有: 图书ID(id_book),主键,自增长 书名(book_name) 作者(author)

出版社(publisher) 出版时间(time) 单价(price) 分类(category)

购物车表(preorder)的字段有: ID(id),主键,自增长

拟订购者注册用户名(logname) 拟订购的图书ID(id_book) 书名(book_name) 作者(author)

出版社(publisher) 出版时间(time) 单价(price)

订单表(orderform)的字段有: 图书订购号(order_number),主键,自增长 已注册的用户名(logname) 真实姓名(realname) 订购的图书ID(id_book) 订购的图书名(bookname) 订购的数量(mount) 联系电话(phone) 邮寄地址(address)

在表user和orderform之间建立一对多的关系。数据库建立之后,在window建立ODBC源,指向此数据库。

3、页面设计

本系统所有的页面都将包含一个导航条,该导航条由用户注册、用户登录、书目浏览、订购图书、修改密码、修改订单、查看订单组成。各页面通过使用JSP的<%@ include %>标记将导航条文件head.jsp嵌入自己的页面。 head.jsp的关键代码如下:

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

..整理分享..

WORD完美格式

\">书目浏览 § \">用户注册 § \">用户登录 § \">定购商品 § \">修改定单 § \">查看定单 § \">修改密码 § \">修改个人信息 §

(1)主页(bookmain.jsp)

含有head.jsp,显示欢迎光临网上书店,网站计数器,版权信息等……,效果如图14-2所示。

(2)用户注册(userRegister.jsp)界面

用户的注册信息需要存入数据库shop.mdb的user表中,并且用到名为Register.java的JavaBean文件。Register.java主要完成加载桥接器实现数据库的连接、设置属性值、获取属性值、添加记录到数据库的user表。

图14-2 首页运行效果

注册页面userRegister.jsp首先通过表单输入您的信息,然后将这些信息通过动作标记设置为Bean Register.java的属性,并调用Bean的addItem()方法将用户的注册信息存入到数据库中。效果如图14-3所示。

(3)用户登录(userLogin.jsp)

用户可在该页面输入自己的用户名和密码,系统将对用户名和密码进行验证,如果身份正确将被连接到订购图书页面,否则在页面上端提示用户输入的密码或者用户名不正确,其中用到Bean Login.java。Login.java主要完成加载桥接器实现与数据库的连接、设置属性值、获取属性值、查询数据库的user表,将对用户名和密码进行验证。若验证不正确,则提示不正确信息。登录页面userLogin.jsp首先给出表单让用户输入用户名和密码,然后通过动作标记送给Bean的属性,之后调用Bean的getMessage()进行验证,效果如图14-4所示。

..整理分享..

WORD完美格式

图14-3 用户注册运行效果

图14-4

(4)订购图书(buybook.jsp)

成功登录的用户可以在该页面订购图书。用户将订购的图书存入订货单,如果用户要修改该图书的订购情况,就必须到修改订单页面修改订单后才能再次订购该书,将用到BuyBook.java和OrderForm.java两个bean文件。

订购页面使用的BuyBook.java负责通过登录者的登录名logname查询数据库的preoder表,查阅该用户准备订购的图书,将书的id、书名、作者、出版社、时间、价格送给订购界面。

用户订购页面使用的OrderForm.java负责填写订购单(最终订单),向数据库的orderform订单表添加订购记录。

订购图书页面的buyBook.jsp首先通过BuyBook.java检索到当前用户准备订购的图书列表,如果用户准备订购该书,填写订单。效果如图14-5所示:

..整理分享..

WORD完美格式

图14-5

图14-6

(5)查看订单(showOrderForm.jsp)

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

(6)修改订单(modifyForm.jsp)

选择修改方式的页面modifyForm.jsp根据书的订购号(order_number)来删除或修改订单中的内容。modifyForm.jsp首先查询数据库显示用户的所

有订单,然后提供两个表单,一个供修改,一个供删除。若用户单击“提交删除”按钮,则连接到deleteForm.jsp页,删除订单的相应内容;若用户单击“提交修改”按钮,则连接到changeForm.jsp页,修改订单的相应内容。效果如图14-6所示。

删除订购单页面deleteForm.jsp首先从modifyForm.jsp页面获取订单号,然后根据订单号删除数据库中相应的订单表项,运行效果如图14-7所示。

修改订单数量页面changeForm.jsp首先从modifyForm.jsp页面获取订单号和新的订购数量,然后根据订单号修改数据库中相应的订单表项,运行效果如图14-8所示。

..整理分享..

WORD完美格式

图14-7

图14-8

(7)书目浏览(showBookList.jsp)

用户可以分页浏览所有的书籍,同时将准备订购的图书添加到购物车。浏览书目页面所用的Bean PageNumber.java,主要完成分页的计算。浏览书目页面showBookList.jsp首先查询数据库,以分页方式显示所有书目,并且显示一个表单。当用户选择订购时,该表单将相关信息内容(包括当前订购者的登录名等多项信息)提交到addPreorder.java,后者向preorder表格中添加一个购物车条目。效果如图14-9所示。

图14-9 (8)修改密码(modifyPassword.jsp)略 (9)修改个人信息(modifyMessage.jsp)略

..整理分享..

WORD完美格式

实验报告名称: 搭建JSP运行的实验环境

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:JSP页面

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:显示不同大小的“你好JSP”

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:JSP指令和动作

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:Tag文件的代码复用

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:中文显示服务器端日期

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:JSP内置对象

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:session对象

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:简易留言板

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:JSP中使用Java Bean

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:JSP中的文件操作

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称: JSP中使用数据库

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称: Java Servlet

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

WORD完美格式

实验报告名称:综合实验:网上书店

姓 名: 学号: 专业班级: 指导教师: 日期: 成 绩:

实验目的:

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

..整理分享..

因篇幅问题不能全部显示,请点此查看更多更全内容