资源描述
高级Java程序设计实验指导书优质资料
(可以直接使用,可编辑 优质资料,欢迎下载)
《高级Java程序设计》
实验指导书
四川农业大学商学院
目 录
实验一简单的Servlet与JSP1
实验二 请求对象3
实验三 响应对象7
实验四 Servlet容器模型9
实验五会话管理13
实验六 JSP基本语法与页面指令16
实验七 JSP隐含对象与作用域20
实验八 Web组件重用与JavaBeans24
实验九 JDBC访问数据库27
实验十表达式语言的使用35
实验十一用户自定义标签41
实验十二 JSTL与标签文件44
实验十三 Servlet事件处理50
实验十四 Servlet过滤器的使用55
实验十五 Web应用的安全性59
说明:
本实验指导书根据《高级Java程序设计》课程教学大纲编写,共包括15个实验,每个实验2学时,学生每周完成一个实验。
实验环境:
计算机系统应该安装JDK 1.5以上版本,开发工具使用JCreator 4.5 Pro版,服务器使用Tomcat 版,数据库使用PostgreSQL 8.3.0版。
该实验指导书的配套教材是《Java Web编程技术》沈泽刚 主编,清华大学出版社,2021.3。
实验一 简单的Servlet与JSP
一、实验目的
1. 了解和掌握Servlet和JSP页面的编写和运行。
2. 比较Servlet与JSP的区别和联系,体会动态页面的含义。
二、实验原理
Servlet是运行在服务器端的Java程序,它主要是为了扩展服务器的功能。编写和运行Servlet一般要经过4个步骤:(1)编辑源文件,它是继承 Servlet的Java类;(2)编译源文件;(3)在服务器中部署该Servlet,即将类文件存放到服务器的适当目录中,并修改web.xml部署描述文件;(4)使用浏览器访问该Servlet程序。
JSP是一种服务器端的动态页面技术,它的实质也是Servlet。它的编写较Servlet容易。二者的主要区别是:Servlet通常是实现业务逻辑,而JSP通常实现表示逻辑。
三、实验内容与步骤
(一)编写和运行一个简单的Servlet
【步骤1】在Tomcat安装目录的webapps下建立一个helloapp的目录,在其中再建立一个WEB-INF目录,在WEB-INF目录中建立一个classes目录。这样就建立了一个名为helloapp的Web应用程序。
【步骤2】编写下面Servlet类,编译并将类文件放入classes目录中
package com.demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet. .*;
public class HelloServlet extends Servlet{
public void service( ServletRequest request,
ServletResponse response)
throws ServletException,IOException{
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println("<h3>Hello World!</h3>");
out.println("</body>");
out.println("</html>");
}
}
【步骤3】在WEB-INF目录中建立一个名为web.xml的文件,该文件为Web应用程序的部署描述文件,简称DD。具体内容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns=" ://java.sun /xml/ns/j2ee"
xmlns:xsi=" :// w3.org/2001/XMLSchema-instance"
5.xsd"
version="2.5">
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.demo.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
【步骤4】在浏览器的地址栏中输入下列地址访问该Servlet。
:8080/helloapp/hello
在浏览器的窗口中应该显示Hello, World!内容。
(二)下面的Servlet可显示系统当前时间。请编译并部署该Servlet,然后使用浏览器访问。
package com.demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet. .*;
public class HelloWorldServlet extends Servlet{
public void service()
throws ServletException,IOException{
PrintWriter out =;
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println(" <font color= '#0000ff'>");
out.println("<h3>Hello,World!</h3>");
out.println("The time now is:"+new java.util.Date());
out.println("</body>");
out.println("</html>");
}
}
(三)编写下面的JSP文件,将其用hello.jsp名保存到helloapp目录中
<html><head>
<title>A Simple JSP Page</title>
</head>
<body>
<font color="#0000ff">
<h3>Hello,World!</h3>
The time now is:<%=new java.util.Date()%>
</font>
</body></html>
使用下面的URL访问该页面:
:8080/helloapp/hello.jsp
(四)运行下面的JSP页面square.jsp
<html><body>
<table border=’1’ cellspacing=’0’ cellpadding=’5’>
<tr><th>number</th><th>squared</th></tr>
<% for ( int i=0; i<10; i++ ) { %>
<tr><td><%= i %></td><td><%= (i * i) %></td></tr>
<% } %>
</table>
</body></html>
(五)改写上述页面,使其运行后产生下列页面。
图1.1 square.jsp运行结果
四、思考题
1. 如何安装配置JDK和Tomcat?
2. 如何在Tomcat中运行Servlet和JSP页面?
实验二 请求对象
一、实验目的
1. 掌握如何获得请求参数;
2. 掌握如何检索请求头;
3. 了解如何通过请求对象获得客户信息;
4. 重点掌握使用请求对象存储数据和请求转发。
二、实验原理
对客户的请求,容器根据请求调用Servlet的相应doXxx()方法,该方法带有两个参数,一个是 ServletRequest,一个是 ServletResponse,它们分别表示请求对象和响应对象,它们是容器自动创建的两个对象。可以使用这两个接口定义的若干方法完成有关操作。
三、实验内容与步骤
(一)通过查询串传递请求参数,并在Servlet中检索请求参数
【步骤1】编写下面的Servlet。
package com.demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet. .*;
public class HelloUserServlet extends Servlet{
public void service( ServletRequest request, ServletResponse response)
throws ServletException,IOException{
String userName = request.getParameter("userName");
PrintWriter pw = response.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("</head>");
pw.println("<body>");
pw.println("<h3>Hello, " + userName + "</h3>");
pw.println("</body>");
pw.println("</html>");
}
}
【步骤2】编译该Servlet,然后修改web.xml文件,将下面代码添加到其中:
<servlet>
<servlet-name>helloUserServlet</servlet-name>
<servlet-class>com.demo.HelloUserServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloUser</servlet-name>
<url-pattern>/hellouser</url-pattern>
</servlet-mapping>
【步骤3】使用下面的URL访问之。
:8080/helloapp/hellouser?userName=John
将userName的值改为你自己的名字,看输出结果。若不给出查询字符串,结果如何?参数值使用汉字如何?
(二)通过表单传递请求参数,使用 ServletRequest对象获得请求参数
【步骤1】首先编写一个input.html文件,存放在helloapp目录中。该页面在屏幕上显示一个表单,其中包括姓名和年龄域,点击“确定”按钮后,将表单参数传递给ParamServlet并显示出来。
input.html代码如下:
<html>
<head><title>参数传递</title>
<meta -equiv="Content-Type" content="text/html;charset=gb2312">
</head>
<body>
<center>
<h3>从表单向Servlet传递参数</h3>
<form method="GET" action="paramtest" >
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="确定" >
<input type="reset" value="重置" >
</form>
<center>
</body>
</html>
【步骤2】编写ParamServlet.java,其代码如下:
package com.demo;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet. .*;
public class ParamServlet extends Servlet {
public void doGet( ServletRequest request, ServletResponse response)
throws ServletException, IOException{
response.setCharacterEncoding("gb2312");
response.setContentType("text/html;charset=gb2312");
String name = request.getParameter("name");
name = new String(name.getBytes("iso8859-1"),"gb2312");
String age = request.getParameter("age");
age = new String(age.getBytes("iso8859-1"),"gb2312");
PrintWriter pw = response.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("</head>");
pw.println("<body>");
pw.println("<h3>姓名:"+name+"</h3><p>");
pw.println("<h3>年龄:"+age+"</h3><p>");
pw.println("</body>");
pw.println("</html>");
}
public void doPost( ServletRequest request, ServletResponse response)
throws ServletException, IOException{
doGet(request, response);
}
}
【步骤3】修改web.xml文件,将下面代码添加到其中:
<servlet>
<servlet-name>ParamServlet</servlet-name>
<servlet-class>com.demo.ParamServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ParamServlet</servlet-name>
<url-pattern>/paramtest</url-pattern>
</servlet-mapping>
【步骤4】测试参数传递。在浏览器的地址栏中输入: ://localhost:8080/helloapp/input.html。输入数据,点击“确定”按钮,体会表单参数的传递。
问题1:如何通过超链接的锚标签(<a href>)传递请求参数?
(三)编写一个Servlet,显示所有请求头
【步骤1】ShowHeadersServlet.java的Servlet能够检索所有的请求头,代码如下:
package com.demo;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet. .*;
public class ShowHeadersServlet extends Servlet {
public void doGet( ServletRequest request, ServletResponse response)
throws ServletException, IOException{
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>All Headers</title>");
out.println("</head>");
out.println("<body bgcolor=\"#fdf5e6\">");
out.println("<h1 align=\"center\">All Request Headers</h1>");
out.println("<table border=1 align=\"center\">\n"+
"<tr bgcolor=\"#ffad00\">\n"+
"<th>Header Name<th>Header Value");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String headerName = (String)headerNames.nextElement();
out.println("<tr><td>"+headerName);
out.println("<td>"+request.getHeader(headerName));
}
out.println("</table>\n</body></html>");
}
public void doPost( ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
doGet(request, response);
}
}
【步骤2】修改web.xml,加入下面内容:
<servlet>
<servlet-name>ShowHeadersServlet</servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern>/showheaders</url-pattern>
</servlet-mapping>
【步骤3】在浏览器地址栏中输入下面URL访问该Servlet
(四)简单的综合应用
【步骤1】创建一个名为input.html的HTML页面,其中包括一个表单,表单中包含两个文本域,分别供用户输入学号和姓名,该页面也包含提交和重置按钮。
【步骤2】定义一个名为com.demo.Student类,其中包括学号sno和姓名name两个private的成员变量,定义访问和修改sno和name的方法。
【步骤3】编写名为FirstServlet的Servlet,要求当用户在input.html中输入信息后点击“提交”按钮,请求FirstServlet对其处理。在FirstServlet中使用表单传递的参数(学号和姓名)创建一个Student对象并将其作为属性存储在请求对象中,然后获得通过请求对象的getRequestDispatcher()方法获得RequestDispatcher()对象,将请求转发到SecondServlet。
【步骤4】在SecondServlet中取出请求对象上存储的Student对象,并显示输出该学生的学号和姓名。在SecondServlet的输出中应该包含一个超链接,点击该连接可以返回input.html页面。
图2.1 input.html页面显示结果 图2.2 SecondServlet显示结果
四、思考题
1. 在Servlet中如何获得请求参数?
2. 如何实现请求转发?如何在请求对象中共享数据?
实验三 响应对象
一、实验目的
1. 了解和掌握如何从响应对象获得输出流对象;
2. 掌握如何设置响应类型;
3. 掌握如何设置响应头和状态码;
4. 重点掌握如何实现响应重定向。
二、实验原理
对Servlet的请求目的是要获得响应消息。Servlet要向用户发送响应数据首先要获得输出流对象。另外,通过响应对象还可向客户端发送状态码,也可以设置有关响应头,还可以对响应重定向。
三、实验内容与步骤
(一) 通过设置响应内容类型构建Excel电子表格
package com.demo;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet. .*;
public class ExcelServlet extends Servlet{
public void doGet( ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
response.setHeader("Cache-Control","no-cache");
response.setContentType("application/vnd.ms-excel;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("<h3>Student information</h3>");
out.println("学号\t姓名\t性别\t年龄\t所在系");
out.println("95001\t李勇\t男\t20\t信息");
out.println("95002\t刘晨\t女\t19\t数学");
}
}
该程序的运行结果如下图所示:
图3.1 生成Excel电子表格
(二)向客户发送二进制文件
package com.demo;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet. .*;
public class DownloadServlet extends Servlet{
public void doGet( ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
response.setContentType("application/jar");
File f = new File("C:\\servlet-api.jar");
FileInputStream is = new FileInputStream(f);
ServletOutputStream os = response.getOutputStream();
byte[] bytearray = new byte[1024];
int bytesread = 0;
while( (bytesread = is.read(bytearray) ) != -1 ){
os.write(bytearray, 0, bytesread);
}
os.flush();
}
}
注意:此Servlet正确运行,需要将servlet-api.jar文件复制到C盘根目录下。
(三)下面的ShowTimeServlet通过设置refresh响应头实现每2秒钟刷新一次页面。
package com.demo;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
import javax.servlet.*;
import javax.servlet. .*;
public class ShowTimeServlet extends Servlet{
public void doGet( ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
response.setContentType("text/html;charset=gb2312");
response.setHeader("refresh","2");
PrintWriter out = response.getWriter();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm:ss");
String s = sdf.format(date);
out.println("<html>");
out.println("<body>");
out.println("<h3 align=\"center\">每5秒钟刷新一次页面</h3><p>");
out.println("<h3 align=\"center\">现在的时间是:"+s+"</h3><p>");
out.println("</body>");
out.println("</html>");
}
}
(四)响应重定向
【步骤1】建立下面的login.html登录页面
<html>
<head> <title>Login Page</title> </head>
<body>
<form action="login.do" method="post">
<table width="298" border="0" align="center"
cellpading="2" cellspacing="1">
<tr>
<td align="right">用户名:</td>
<td align="left"><input type="text" name="username" size="15"></td>
</tr>
<tr>
<td align="right">密 码:</td>
<td><input type="password" name="password" size="15"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录">
<input type="reset" value="取消"></td>
</tr>
</form>
</body>
</html>
【步骤2】编写一个名为RedirectServlet的Servlet,在其中检索用户名和口令参数值,然后判断其是否正确(若用户名和口令都为admin即认为正确),如果正确将响应重定向到welcome.html页面,否则将响应重定向到error.html页面,这两个页面请你自己编写,存放在应用程序根目录。下面是Servlet的部分代码。
package com.demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet. .*;
public class RedirectServlet extends Servlet{
public void doPost( ServletRequest request,
ServletResponse response)
throws IOException,ServletException{
// 此处添加若干代码
if(){
response.sendRedirect();
}else{
response.sendRedirect();
}
}
}
四、思考题
1. 如何理解Servlet的生命周期?
2. 如何理解请求转发与响应重定向?
实验四 Servlet容器模型
一、实验目的
1. 掌握Web应用程序的DD文件web.xml的配置方法和作用;
2. 掌握如何通过ServletConfig获取Servlet的初始化参数;
3. 掌握ServletContext的概念,如何获得ServletContext对象;
4. 掌握如何通过RequestDispatcher转发请求。
二、实验原理
Web应用程序有严格定义的目录结构,它需要一个称为部署描述文件的文件web.xml来配置。对应用程序的每个Servlet,可以在web.xml中定义若干个初始化参数,然后通过ServletConfig对象获取这些参数。
ServletContext对象表示该应用程序的环境,通过该对象可以获得应用程序范围的初始化参数、容器版本信息、资源的URL、在其中存放共享数据以及登录日志等。
三、实验内容与步骤
(一)建立一个名为bookstore的Web应用程序
在Tomcat的webapps目录下,建立一个如下所示的目录结构:
|- bookstore
|- html (包含所有的HTML文件)
|- jsp (包含所有的JSP文件)
|- images (包含所有的GIF、JPEG和BMP图象文件)
|- index.html (默认的HTML文件)
|- WEB-INF
|-classes
├ lib
├ web.xml
图4.1 bookstore应用程序的目录结构
这样就建立了一个名为bookstore的Web应用程序,本实验后面的题目都在该应用程序下面完成。
(二)使用ServletConfig检索Servlet的初始化参数
【步骤1】编写ConfigDemoServlet程序,内容如下:
package com.demo;
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet. .*;
public class ConfigDemoServlet extends Servlet{
String servletName=null;
ServletConfig config=null;
String email=null;
String telephone=null;
public void init() {
config = getServletConfig();
servletName = config.getServletName();
email = config.getInitParameter("email");
telephone = config.getInitParameter("telephone");
}
public void service( ServletRequest request, ServletResponse response)
throws ServletException,IOException{
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("Servlet名称:"+servletName+"<br>");
out.println("Email地址:"+email+"<br>");
out.println(" :"+telephone);
out.println("</body></html>");
}
}
【步骤2】修改web.xml文件,在其中添加下面Servlet定义和初始化参数定义
<servlet>
<servlet-name>configDemoServlet</servlet-name>
<servlet-class>Servlet</servlet-class>
<init-param>
<param-name>email</param-
展开阅读全文