《Web开发技术》实验指导书(JSP版).doc
安徽农业大学Web开发技术JSP版课程配套教材Web开发技术实验指导书(JSP版)刘 波 编写安徽农业大学信息与计算机学院通信工程2008年2月目 录实验一 搭建JSP运行的实验环境1实验二 JSP页面2实验三 显示不同大小的“你好JSP”6实验四 JSP指令和动作8实验五 Tag文件的代码复用11实验六 中文显示服务器端日期13实验七 JSP内置对象18实验八 session对象22实验九 简易留言板27实验十 JSP中使用Java Bean30实验十一 JSP中的文件操作40实验十二 JSP中使用数据库47实验十三 Java Servlet64实验十四 网上书店69实验报告.76实验一 搭建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安装目录下的webappsROOT目录下,运行该页面,观察其对应的Servlet源代码。exer1.jsp的代码:<% page contentType="text/html;charset=GB2312" %> <!- jsp指令标签 -><% page import="java.util.Date" %> <!- jsp指令标签 -><%! Date date; / 数据声明 int sum; public int add(int m,int n) / 方法声明 return m+n; %><HTML><BODY bgcolor=cyan> <!html标记 -> <FONT size=4><P>程序片创建Date对象: <% Date date=new Date(); /java程序片 out.println("<BR>"+date); sum=add(12,34); %> <BR>在下一行输出和:<BR> <%= sum+100 %> <!- Java表达式 -> </FONT></BODY></HTML>(6)将exer1.jsp文件复制到Tomcat安装目录下的webappsexamples目录下,运行该页面,观察其对应的Servlet源代码。(7)将exer1.jsp文件复制到Tomcat安装目录下的webappswebdav目录下,运行该页面,观察其对应的Servlet源代码。四、实验思考题(1)JDK安装完毕后,需要添加哪些环境变量?(2)在Tomcat安装目录下的webapps文件夹中,新建一文件夹myapp,将exer1.jsp文件复制到Tomcat安装目录下的webappsmyapp目录下,运行该页面(http:/localhost:8080/myapp/exer1.jsp ),结果如何?若在d:盘根目录建立一个文件夹myweb,将exer1.jsp文件复制到d:myweb目录下, 运行该页面(http:/localhost:8080/myweb/exer1.jsp ),结果如何?若要正确显示该页面,还应做如何处理?提示:修改conf目录下的server.xml文件。(3)Tomcat默认端口号为8080,如何更改端口号?(4)编写一个JSP页面,用于显示1100的整数和。五、实验报告要求(1)分析JSP的工作原理,说明JSP文件和Servlet的关系(2)根据实验运行情况,对实验步骤和运行结果进行阐述(3)完成实验思考题的解答实验二 JSP页面一、实验目的(1)熟悉典型JSP页面的组成元素,掌握HTML标记和JSP标记的不同(2)掌握在HTML页面中插入JSP脚本(java代码)的方法(2)编写简单的JSP页面,初步掌握JSP网页的设计原理二、实验工具(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" %><HTML><BODY> <%! int count=0; /被客户共享的count synchronized void setCount() /synchronized修饰的方法 count+; %> <% setCount(); out.println("您是第"+count+"个访问本站的客户"); %></BODY></HTML>(2)JSP中声明类(比较教材P15P16页的声明变量和声明方法)是JSP页面对应的Servlet类的内部类,页面上所有脚本元素都可以创建该类的对象。下面的实例定义一个square类,当客户访问该页面时,服务器创建该类的对象,只要客户给出正方形的边长,就可以求出该正方形的周长和面积,创建并运行exer2_2.jsp,观察运行结果exer2_2.jsp:<% page contentType="text/html; charset=gb2312" %><html><body><p>请输入正方形边长<form name="form1" method="get" action="exer2_2.jsp"> <input type="text" name="cat" value="1"> <input type="submit" name="Submit" value="送出"></form><%! public class square double r;square(double r) this.r=r;double getarea() return r*r;double getlength() return r*4;%><%String s=request.getParameter("cat");double r;if (s!=null)r=Double.valueOf(s).doubleValue();elser=1;square cc=new square(r);/创建对象%><p>方的面积是:<%=cc.getarea() %><p>方的周长是:<%=cc.getlength() %></body></html>(3)编写exer2_3.jsp,熟悉在“<%=”和“%>”之间插入表达式,用于输出表达式计算结果的方法exer2_3.jsp:<% page contentType="text/html;charset=GB2312" %><HTML><BODY bgcolor=cyan><FONT size=4><P> Sin(0.9)除以3等于 <%=Math.sin(0.90)/3%><p>3的平方是: <%=Math.pow(3,2)%><P>12345679乘72等于 <%=12345679*72%><P> 5的平方根等于 <%=Math.sqrt(5)%><P>99大于100吗?回答: <%=99>100%></BODY></HTML>(4)在Dreamweaver或FrontPage中利用可视化方法,编写input.jsp和receive.jsp。input.jsp:<% page contentType="text/html;Charset=GB2312" %><HTML><BODY bgcolor=cyan><Font size=3> <FORM action="receive.jsp" method=post name=form> <P>请输入下列信息: <BR>输入您的姓名:<INPUT type="text" name="name" value="张三"></BR> <BR>选择性别:<INPUT type="radio" name="R" value="男" checked="default">男 <INPUT type="radio" name="R" value="女">女 </BR> <BR>选择您喜欢的歌手: <input type="checkbox" name="superstar" value="张歌手" >张歌手 <input type="checkbox" name="superstar" value="李歌手" >李歌手 <input type="checkbox" name="superstar" value="刘歌手" >刘歌手 <input type="checkbox" name="superstar" value="王歌手" >王歌手 </BR> <INPUT TYPE="hidden" value="这是隐藏信息" name="secret"> <INPUT TYPE="submit" value="提交" name="submit"> </FORM> </FONT></BODY></HTML>receive.jsp:<% page contentType="text/html;Charset=GB2312" %><HTML><BODY bgcolor=cyan><Font size=3> <% 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("<P> 您的姓名:"+yourName+"</P>"); out.println("<P> 您的性别:"+yourSex+"</P>"); out.println("<P> 您喜欢的歌手:"); if(personName=null) out.print("一个都不喜欢"); else for(int k=0;k<personName.length;k+) out.println(" "+personNamek); out.println("<P> hidden提交的值:"+secretMess); %></FONT></BODY></HTML> 四、设计性实验环节(1)编写一个jiecheng类,当客户在浏览器中给出指定的正整数N,能计算N的阶乘。创建能实现此功能的jsp文件res1.jsp,观察运行结果(参考exer2_2.jsp)(2)编写程序newclass2.jsp,学会在声明中定义类student,初始化该类(学号、姓名、成绩),用表格形式输出“班号(学号的前4位)、学号、姓名、成绩”。(选做)五、实验报告要求(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”,如图31所示,程序的流程图如图32所示。1、 程序知识点l 显示变量值在JSP中,获取变量值可使用“<%=valname%>”来实现,valname可以是一个整型字符型的变量。图31 浏览器显示不同字体大小l For语句For语句的格式如下for (initialization Statement; conditional Expression; increment Statement) loopBody为了执行For语句,首先执行初始化语句,然后再对条件表达式求值,如果值为TRUE,则执行循环体,随后执行递增语句。表达式的求值和循环体与递增语句的执行不断重复,直到条件表达式的值变为false。多个初始化和增量语句可以用逗号隔开。 For循环的初始化部分可以声明局部循环变量,循环变量的范围在循环体内部。这些循环变量遵循在块内有效的一般规则,即用大括号作为程序块,变量在块内声明,不能与范围外边的变量同名,也不能在循环外引用。图32 程序流程图l 控制字体大小在HTML语言中,控制文字大小可使用“<Hn>”(n从16),因此,可以使用循环语句来控制n的变化。然后,使用<H<%=n%>>,来显示字体大小渐变的“你好JSP”2、程序代码(exer3.jsp)<% page contentType="text/html; charset=gb2312" language="java" %><html><head><title>显示不同大小字体</title></head><body><center><%/利用For循环控制字体由大到小for(int i=1;i<6;i+)%><H<%=i%>>你好 JSP</H<%=i%>><%/利用For循环控制字体由小到大for( ; ; ) /完成空格中的内容%><H<%=i%>>你好 JSP</H<%=i%>><%></center></body></html>3、观察运行结果四、综合设计实验环节综合思考:结合实验二和实验三,编写input2.jsp和receieve2.jsp,根据变量和for循环生成表格的行和列,结果如下图33和图34所示: 图33 input2.jsp执行结果 图34执行“确定”后结果五、实验报告要求(1)根据实验运行情况,对实验步骤和运行结果进行阐述(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" %><html><body><h1>Done</h1>This program example how to use page Directive</body></html>(2)将pagederictive.jsp复制到Tomcate安装目录下的webappsROOT。(3)在IE地址栏输入http:/localhost:8080/pagederictive.jsp2、page指令import属性的使用(1)打开记事本,输入以下文档,并保存为pageimport.jsp。<html><body bgcolor="snow"><%- get Year -%><% page import="java.util.*" %><b>CurrentYear=<%=Calendar.getInstance().get(Calendar.YEAR) %></b></body></html>(2)将pageimport.jsp复制到Tomcate安装目录下的webappsROOT。(3)在IE地址栏输入http:/localhost:8080/pageimport.jsp3、include指令的使用(1)打开记事本,输入以下文档,并保存为copyright.jsp。<html><body bgcolor="snow"><b><%!String companyName="SSI Consulting" %><p>©2002 <%=companyName%>Any unauthorized use of these materials will be prosecuted to the fullest extent of the law</p></b></body></html>(2)打开记事本,输入以下文档,并保存为inc1.jsp。<% page contentType="text/html; charset=gb2312" language="java" %><html><body bgcolor="snow"><b>This page is unde contruction<P><% include file="copyright.jsp" %><P><h6>Last updated:March 2008</h6></b></body></html>(3)将copyright.jsp和inc1.jsp复制到Tomcate安装目录下的webappsROOT(4)在IE地址栏输入http:/localhost:8080/inc1.jsp四、设计性实验环节(1)、编写JSP页面,用“*”显示一个7×7方阵的边框和对角线,结果如图41所示。* * * * * * * * * * * * * * * * * * * * * * * * * * *图41 练习1运行结果(2)、编写JSP页面,判断字符串是否为回文,并用表格显示出来,结果如图42所示。提示:使用StringBuffer类的reverse()颠倒某字符串的顺序,若字符串与颠倒后的字符串相等,则该串为回文。(选做)图42 练习2的运行结果(3)、张三手头分别有800美元和1860美元,编写一个JSP页面,把他的美元换成人民币,并用表格显示出来。假设当前美元兑换人民币的汇率是7.82。(选做)(4)、编写JSP页面分别显示110之间的各数字的阶乘。实验五 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:<p>这是一个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=Math.sqrt(p*(p-a)*(p-b)*(p-c) ; return "<BR>三角形的面积:"+area; else return("<BR>"+a+","+b+","+c+"不能构成一个三角形,无法计算面积"); %> <% out.println("<Br>jsp页面传递过来的三边:"+sideA+","+sideB+","+sideC); double a=Double.parseDouble(sideA); double b=Double.parseDouble(sideB); double c=Double.parseDouble(sideC); out.println(getArea(a,b,c); %>(2)将Trangle.tag保存在.ROOTWEB-INF目录下(3)在ROOT目录下编写exer5_1.jsp文件,代码如下:<% page contentType="text/html;Charset=GB2312" %><% taglib tagdir="/WEB-INF/tags" prefix="computer"%><html><body> <form action="exer5_1.jsp" method="get" name="form1"> <p>请选择三角形的三条边</p><p>SIDE A: <select name="select1"> <option value="3" selected>3</option> <option value="4">4</option> <option value="5">5</option> </select> </p><p>SIDE B: <select name="select2"> <option value="3">3</option> <option value="4" selected>4</option> <option value="5">5</option> </select> </p> <p>SIDE B: <select name="select3"> <option value="3">3</option> <option value="4">4</option> <option value="5" selected>5</option> </select> <input type="submit" name="Submit" value="提交"> </p></form><% String sideaa=request.getParameter("select1");String sidebb=request.getParameter("select2");String sidecc=request.getParameter("select3");%> <%if (sideaa=null)sideaa="3" if (sidebb=null)sidebb="4" if (sidecc=null)sidecc="5" %> <h3>以下是调用Tag文件的效果:</h3> <computer:Trangle sideA="<%=sideaa%>" sideB="<%=sidebb%>" sideC="<%=sidecc%>" /></body></html>(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服务器,也可以从网上免费下载三、实验原理和内容本实例运行后将在浏览器上用中文显示当前服务端的日期,如图61所示。图61 服务器端的日期1、程序知识点l 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才是现在的月份。l int和String的区别在Java中它们是两个完全不同的概念。int是一个类型,而String是一个类。所以在转换上是不能进行简单的强制型转换(int num=(int)string)。在此需要采用String类中的一个方法,一般用法如下:String str_year=String.valueOf(year)l Switch语句switch语句能够根据表达式的值决定执行多个操作中的一个或者几个。switch的一般格式为:switch (expression)case value1:statement1;break;case valueN:statemendN;break;default:default_Statement;expression可以返回任一简单类型的值,case子句中的值valueI必须是常量,而且所有case子句中的值应是不同的。多分支语句把表达式返回的值与每个case 子句中的值相比,如果匹配成功,则执行该case子句后的语句序列,否则执行default中的语句;如果没有default,则不进行任何操作。而case字句中的break用于跳出switch,如果没有break,则switch会顺序执行下个case中的语句,直至遇到break语句或者执行完所有的case或者default语句。 switch语句中使用的表达式必须为整型表达式或不丢失便可显式地转换为整型的表达式。不丢失便可显式地转换为整型的数据类型包括字节、字符和短型数。对于长型数、浮点数和双精度数等数据类型,需明确地转换。case值必须能够求值或编译时能隐含地转换为整型的常量表达式。图62 程序流程图l 程序实现过程可以先获取系统的日期,然后将月份和日期统一成二位整型的格式,再将获取的系统时间拼成字符串,最后利用For循环和swtich语句获取中文时间信息并显示。图62显示程序流程图2、部分程序关键源码(exer6.jsp)<% page contentType="text/html; charset=gb2312" import="java.util.*" %><html><body><% Date dtt=new Date();int year=dtt.getYear();year+=1900;/获取月份int month=dtt.getMonth();month+=1;/获取日期int date=dtt.getDate();/获取星期int day=dtt.getDay();/将int型转换为StringString 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;j<str_i.length();j+)cha_i=str_i.charAt(j);switch(cha_i)case '0':chi_num="O"break;case '1':chi_num="一"break;case '2':chi_num="二"break;case '3':chi_num="三"break;case '4':chi_num="四"break;case '5':chi_num="五"break;case '6':chi_num="六"break;case '7':chi_num="七"break;case '8':chi_num="八"break;case '9':chi_num=