武汉工程大学邮电与信息学院
学生实验报告
课程名称: 动态网页技术
年 级: 20##级
专 业:计算机科学与技术
姓 名:
学 号:
指导教师: 邹君
实验地点: 605、703机房
2012 学年至 2013 学年度第 一 学期
实验一
实验 Tomcat服务器的安装与配置
一、实验目的
本实验的目的是让学生掌握怎样设置Web服务目录、怎样访问Web服务目录下的JSP页面、怎样修改Tomcat服务器的端口号。
二、实验要求
1、将下载的apache-tomcat-6.0.13.zip解压到D盘中,并进行调试。
2、用文本编辑器编写一个简单的JSP页面biao.jsp,并保存到Web服务目录中。
三、实验结果
所运行的代码如下;
biao.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<HTML>
<BODY BGCOLOR=YELLOW>
<h3>乘法表<h3>
<FONT Size=3>
<%
for(int j=1;j<=9;j++)
{
for(int i=1;i<=j;i++)
{
int n=i*j;
out.print(i+"×"+j+"="+n+" ");
}
out.print("<br>");
}
%>
</FONT>
</BODY>
</HTML>
biao.jsp页面
四、实验结果分析
1、默认的端口号为8080,若修改,在conf目录下的server.xml文件中修改端口号。
2、设置虚拟目录。在conf目录下的server.xml中</Host>前加入:
<Context path=”/**” docBase=”路径” debug=”0” reloadable=”true/”>
3、Tomcat服务器必须保持启动。
实验二 JSP页面的基本结构
一、实验目的
本实验的目的是让学生掌握怎样在JSP页面中使用成员变量,怎样使用Java程序片、Java表达式。
二、实验要求
本实验将用户输入的单词按字典顺序排序。需要编写两个JSP页面,名字分别为inputWord.jsp和showDictionary.jsp。
三、实验内容
1) inputWord.jsp页面有一个表单,用户通过该表单输入若干个单词,并提交给showDictionary.jsp页面。
2) showDictionary.jsp负责排序单词,并将排序的全部单词显示给用户。
四、实验结果
实验所用代码如下:
inputWord.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<HTML>
<BODY BGCOLOR=cyan>
<FONT Size=3>
<FORM action="showDictionary.jsp" method = get name=form>
请输入单词(用空格分隔):<INPUT type="text" name="word">
<BR><INPUT type="submit" value="送出" name=submit>
</FORM>
</BODY>
</HTML>
showDictionary.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page import="java.util.*"%>
<HTML>
<BODY BGCOLOR=YELLOW>
<FONT Size=3>
<%!
TreeSet<String>dictionary=new TreeSet<String>();
public void addWord(String s)
{
String word[] = s.split(" ");
for(int i=0;i<word.length;i++)
{
dictionary.add(word[i]);
}
}
%>
<%
String str = request.getParameter("word");
addWord(str);
Iterator<String>te=dictionary.iterator();
while(te.hasNext())
{
String word = te.next();
out.print(" "+word);
}
%>
</FORM>
</BODY>
</HTML>
inputWord.jsp页面
showDictionary.jsp页面
五、实验结果分析
1、jsp页面由html标记、jsp标记、成员变了和方法的声明、java程序片和java表达式组成。
2、jsp页面中的成员变量是被所有用户共享的变量。Java程序片可以操作成员变了,任何一个用户对jsp页面成员变量操作的结果,都会影响到其他用户。
实验三 JSP指令标记
一、实验目的
本实验的目的是让学生掌握怎样在JSP页面中使用include指令标记在JSP页面中静态插入一个文件内容。
二、实验要求
该实验要求使用include指令标记使得每个页面都包含导航条。在进行试验之前,将名字是leader.txt的文件保存到本实验所使用的web服务目录中。
三、实验内容
leader.txt编写3个JSP页面。
1) frist.jsp使用include指令静态插入leader.txt文本文件。
2) second.jsp使用include指令静态插入leader.txt文件。
3) third.jsp使用include指令静态插入leader.txt。
四、实验结果
所运行代码如下:leader.txt
<%@ page contentType="text/html;charset=GB2312"%>
<a href = "firsst.jsp">链接到页面1</a>
<a href = "second.jsp">链接到页面2</a>
<a href = "third.jsp">链接到页面3</a>
first.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<HTML>
<BODY BGCOLOR=YELLOW>
<P>这是页面1
<%@ include file="leader.txt" %>
<BODY>
</HTML>
second.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<HTML>
<BODY BGCOLOR=cyan>
<P>这是页面2
<%@ include file="leader.txt" %>
<BODY>
</HTML>
third.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<HTML>
<BODY BGCOLOR=green>
<P>这是页面3
<%@ include file="leader.txt" %>
<BODY>
</HTML>
frist.jsp页面
second.jsp页面
third.jsp页面
五、实验结果分析
1、include指令标记是在jsp页面出现该指令的位置处,静态的插入一个文 件。被插入的文件必须是可访问和可使用的。Include指令标记是在编译阶段就处理所需要的文件,被处理的文件在逻辑和语法上依赖与当前jsp页面,优点是执行速度快。
实验四 JSP动作标记
一、实验目的
本实验的目的是让学生掌握怎样在JSP页面中使用include标记动态加载文件,使用forward实现页面的转向。
二、实验要求
编写三个JSP页面:giveFileName.jsp、readFile.jsp和error.jsp。
三、实验内容
1)giveFileName.jsp页面使用include动作标记动态加载readFtle.jsp页面,并将一个文件的名字ok.txt传递给被加载的readFtle.jsp页面。
2)readFile.jsp页面负责根据giveFileName.jsp页面传递过来的文件名字进行文件的读取操作,如果该文件不存在就使用forward动作标记将用户转向error.jsp。
3)error.jsp负责显示错误信息。
四、实验结果
实验所用代码如下:
giveFileName.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<HTML>
<BODY BGCOLOR=yellow>
读取名字是ok.txt的文件:
<jsp:include page="readFile.jsp">
<jsp:param name="file" value="D:/Program Files/tomcat/webapps/chapter2/ok.txt"/>
</jsp:include>
</BODY>
</HTML>
readFile.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page import="java.io.*"%>
<HTML>
<BODY BGCOLOR=cyan>
<P><FONT Size=2 color=bule>
This is readFile.jsp.
</FONT>
<FONT Size=4>
<%
String s= request.getParameter("file");
File f=new File(s);
if(f.exists())
{
out.println("<BR>文件"+s+"的内容:");
FileReader in=new FileReader(f);
BufferedReader bIn=new BufferedReader(in);
String line=null;
while((line=bIn.readLine())!=null)
{
out.println("<BR>"+line);
}
}
else
{
%>
<jsp:forward page="error.jsp">
<jsp:param name="mess" value="File Not Found"/>
</jsp:forward>
<%
}
%>
</FONT>
</BODY>
</HTML>
error.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<HTML>
<BODY BGCOLOR=yellow>
<P><FONT Size=5 color=red>
This is error.jsp.
</FONT>
<FONT Size=2>
<%
String s= request.getParameter("mess");
out.println("<BR>本页面得到的信息:"+s);
%>
</FONT>
</BODY>
</HTML>
giveFileName.jsp页面
error.jsp页面
五、实验结果分析
1、include动作标记是在jsp页面运行时才处理加载的文件,被加载的文件在逻辑和语 法上独立与当前jsp页面,include指令标记可以使用param子标记向被加载的jsp 文件传递信息。
实验五 request对象
一、实验目的
本实验的目的是让学生掌握怎样在JSP中使用内置对象request。
二、实验要求
通过JSP页面和Tag文件实现数字的四则运算,要求编写两个JSP页面inputNumber.jsp和receiveNumber.jsp及一个Tag文件Computer.tag。receiveNumber.jsp使用内置对象接受inputNumber.jsp提交的数据,然后将计数任务交给Tag文件Computer.tag去完成。
三、实验内容
1)inputNumber.jsp页面提供一个表单,用户可以通过表单输入两个数、选择四则运算符号,并将输入的两个数和所选择的运算符号提交给receiveNumber.jsp页面。
2)receiveNumber.jsp使用内置对象inputNumber.jsp页面提交的数据,然后将计算任务交给Tag文件Computer.tag去完成。
3)要求Computer.tag使用attribute指令得到receiveNumber.jsp页面传递过来的书和运算符号,使用variable指令将运算结果返回给receiveNumber.jsp页面。
四、实验结果
实验所用代码如下:
inputNumber.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<HTML>
<BODY bgcolor=cyan>
<FONT size=5>
<FORM action="receiveNumber.jsp" method=post name=form>
输入运算数、选择运算符号:<br>
<Input type=text name="numberOne" size=6>
<select name="operator">
<option value="+">+
<option value="-">-
<option value="*">*
<option value="/">/
</select>
<Input type=text name="numberTwo" size=6>
<br><Input type="submit" value="提交你的选择" name="submit">
</FORM>
</FONT>
</BODY>
</HTML>
Computer.tag
<%@ tag pageEncoding="GB2312" %>
<%@ attribute name="numberA" required="true" %>
<%@ attribute name="numberB" required="true" %>
<%@ attribute name="operator" required="true" %>
<%@ variable name-given="result" scope="AT_END" %>
<% try
{
double a=Double.parseDouble(numberA);
double b=Double.parseDouble(numberB);
double r=0;
if(operator.equals("+"))
{
r=a+b;
}
else if(operator.equals("-"))
{
r=a-b;
}
else if(operator.equals("*"))
{
r=a*b;
}
else if(operator.equals("/"))
{
r=a/b;
}
jspContext.setAttribute("result",String.valueOf(r));
}
catch(Exception e){
jspContext.setAttribute("result","发生异常:"+e);
}
%>
inputNumber.jsp页面
receiveNumber.jsp页面
五:实验结果分析
1、内置对象request的作用就是用来接收客户端提交的请求
2、request对象用的比较多的方法是getParameter方法。
request对象的getParameter方法根据指定的参数,获取客户端提交的信息。
其语法规则如下:
<% String name=request.getParameter (“txtName”)%>
其中,name是一个字符串变量。txtName是客户端提交信息中的一个字段名。
3、下面的就是在实验里面request的使用
<%
String a=request.getParameter("numberOne");
String b=request.getParameter("numberTwo");
String operator=request.getParameter("operator")
实验六 responese对象
一、实验目的
本实验的目的是掌握怎样使用response对象动态响应用户的请求。
二、实验要求
编写两个JSP页面inputRadius.jsp和drawCircle.jsp页面,drawCircle.jsp页面使用response对象做出动态响应。
三、实验内容
1)inputRadius.jsp提供表单,用户在表单中输入一个代表圆的半径的数字,提交给drawCircle.jsp页面。
2)drawCircle.jsp页面首先使用request对象获得inputRadius.jsp提交的数字,然后根据数字的大小做出不同的响应。如果数字小于等于0或者大于100,response对象调用setCountType(String s)方法将contentType属性的值设置为text/plain,同时输出“半径不合理”;如果数字大于0并且小于等于100,response对象调用setContentType(String s)方法将contentType属性的值设置为image/jpeg,并绘制一个圆;如果用户在inputRadius.jsp页面输入了非数字,response对象调用sendRedirect(URL url)方法将用户重定向到inputRadius.jsp。
四、实验结果
实验所用代码如下:
inputRadius.jsp
<%@ page contentType="text/html; charset=GB2312" %>
<HTML>
<BODY bgcolor=yellow>
<FONT size=2>
<FORM action="drawCircle.jsp" method=post name=form>
输入圆的半径:<input type=text name="radius" size=6>
<input type="submit" value="提交" name="submit">
</FORM>
</FONT>
</BODY>
</HTML>
drawCircle.jsp
<%@ page contentType="text/html; charset=GB2312" %>
<%@ page import="java.awt.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.awt.image.*" %>
<%@ page import="java.awt.geom.*" %>
<%@ page import="com.sun.image.codec.jpeg.*" %>
<HTML>
<BODY bgcolor="yellow">
<FRONT size=3>
<%
String R=request.getParameter("radius");
out.print(R);
try
{
double number=Double.parseDouble(R);
if(number <=0 || number >100)
{
response.setContentType("text/plain;charset=GB2312");
out.println(number + "作为圆的半径不合理");
}
else if(number>0 && number<=100)
{
response.setContentType("image/jpeg");
int width =100,height =100;
BufferedImage image =new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0,width,height);
Graphics2D g_2d = (Graphics2D)g;
Ellipse2D circle = new Ellipse2D.Double(0,0,number,number);
g_2d.setColor(Color.blue);
g_2d.fill(circle);
g.dispose();
OutputStream outClient = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outClient);
encoder.encode(image);
}
}
catch(Exception e)
{
response.sendRedirect("inputRadius.jsp");
}
%>
</FONT>
</BODY>
</HTML>
1、在输入要求的范围以内:
inputRadius.jsp页面
drawCircle.jsp页面
2、当输入的数据不符合要求的结果显示:
inputRadius.jsp页面
drawCircle.jsp页面
五、实验结果分析:
1、response的作用就是把服务器端的数据以HTTP的格式发送到客户端浏览器
2、与request相比,它的功能和request对象的功能相反。request对象用于得到用户提交的信息而response对象是向用户发送信息,两者结合起来完成动态页面的交互功能。
3、response对象的主要方法:
sendRedirect():页面重定向方法
setStatus():设置状态行方法
setContentType():设置文本类型方法
实验七 session对象
一、实验目的
本实验的目的是让学生掌握怎样使用session对象存储和用户有关的数据。
二、实验要求
使用session对象模拟购物车。编写两个JSP页面choiceBook.jsp和orderForm.jsp。
三、实验内容
1)用户在choiceBook.jsp页面通过超链接将自己要购买的图书信息传递到orderForm.jsp页面。
2)orderForm页面将用户购买的图书信息存储到session对象中,然后生成一个图书订单并显示给用户。
四、实验结果:
实验所用代码如下:
choiceBook.jsp
<%@page contentType="text/html; charset=GB2312" %>
<HTML>
<BODY bgcolor=yellow>
<FONT size = 2>
<p>选择要购买的图书
<table>
<tr>
<td>
<a href="orderForm.jsp?bookMess=Java面向对象设计@ISBN:9876@价格:34元">
Java面向对象设计(34元)
</a>
</td>
</tr>
<tr>
<td>
<a href="orderForm.jsp?bookMess=JSP程序设计@ISBN:4567@价格:34元">
JSP程序设计(34元)
</a>
</td>
</tr>
<tr>
<td>
<a href="orderForm.jsp?bookMess=XML程序设计@ISBN:2356@价格:34元">
XML程序设计(34元)
</a>
</td>
</tr>
</table>
</FONT>
</BODY>
</HTML>
orderForm.jsp
<%@page contentType="text/html;charset=GBK" %>
<%@page import="java.util.*" %>
<%
String book = request.getParameter("bookMess");
if(book != null){
StringTokenizer fenxi = new StringTokenizer(book,"@");
String bookName = fenxi.nextToken();
String bookISBN = fenxi.nextToken();
session.setAttribute(bookISBN,book);
}
%>
<html>
<body bgcolor="cyan">
<font size = 4>
<P>图书订单
<table border=3>
<%
Enumeration keys = session.getAttributeNames();
while(keys.hasMoreElements()){
String key = (String)keys.nextElement();
book = (String)session.getAttribute(key);
if(book != null){
StringTokenizer fenxi = new StringTokenizer(book,"@");
byte X[]= ((String)fenxi.nextToken()).getBytes("ISO-8859-1");
String bookName = new String(X);
byte S[]= ((String)fenxi.nextToken()).getBytes("ISO-8859-1");
String isbn = new String(S);
byte P[]= ((String)fenxi.nextToken()).getBytes("ISO-8859-1");
String price = new String(P);
%>
<tr>
<td><%= bookName %></td>
<td><%= isbn %></td>
<td><%= price %></td>
</tr>
<%
}
}
%>
</table>
</font>
</body>
</html>
choiceBook.jsp页面
orderForm页面
五、实验结果分析:
1、session的作用就是记住客户的连接信息,可以使用会话对象(session)。session对象记录了每个客户与服务器的连接信息
2、判断session是否失效有三种情况1)、客户是否关闭浏览器。2)、是否到达最大的发呆时间3)、是否调用validate()函数
3、session对象常用方法:
setAttribute(String name,java.lang.Object value):设定指定名字的属性值,并且把它存储在session对象中。
getAttribute(String name):获得指定名字的属性,如果该属性不存在,将会返回null