Servlet基础练习
一、实验目的
通过实验掌握下列知识:
1、学习使用Tomcat应用服务器,掌握web应用的配置和部署方法;
2、掌握Servlet的基本结构,能实现输出为HTML的Servlet;
3、理解Servlet的生命周期,理解init、service与destory方法的作用;
4、理解Servlet的多线程机制,能解决线程安全问题。
二、实验内容及步骤
1、安装TOMCAT服务器并配置web应用
1)打开TOMCAT/webapps子目录,创建myweb应用(在myweb文件夹下设置WEB-INF目录并进行部署);
2)将HelloServlet.java编译成.class文件,并放置于正确目录中;
3)修改web.xml文件内容,使得浏览器访问路径为:http://localhost:8080/myweb/servlet/Hello;
4)重启服务器,查看页面运行效果。
2、Servlet生命周期
1)配置LifeCycleServlet,使之运行;
2)刷新页面,观察变量a和变量b值的变化,并记录在实验报告中;
3)分析该运行结果的产生原因,并记录在实验报告中;
4)若在该页面上显示该Servlet的a)首次被装载并初始化的时间,以及b)该Servlet当前被访问的时间,应分别在哪些方法中增加什么代码?
(获取时间的代码可采用:new java.util.Date() ; )
5)实现该功能,查看页面运行效果,并在实验报告中描述实现方法。
3、Servlet生命周期
1)在LifeCycleServlet中,应对哪个变量进行多线程的访问保护?
2)改进LifeCycleServlet代码,使用同步块进行访问保护,并记录在实验报告中。
三、实验要求
1、 填写并上交实验报告,报告中应包括:
实验结果(程序执行结果及产生结果的原因);
碰到的问题及解决方案,实验收获等。
2、 上交程序源代码。
附件: 1、HelloServlet.java源代码: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet 2、LifeCycleServlet.java源代码 import java.io.*; public class LifeCycleServlet extends HttpServlet public void init() throws ServletException { protected void doGet(HttpServletRequest request, HttpServletResponse response) |
二、实验内容及步骤
1、安装TOMCAT服务器并配置web应用
1)打开TOMCAT/webapps子目录,创建myweb应用(在myweb文件夹下设置WEB-INF目录并进行部署);
运行步骤:
1. 用eclipse新建一个,取名为MyNewWeb1,在新建一个Servlet,取名HelloServlet,然后按Run on Server,可以运行,并且在/MyNewWeb1/build/classes出现了需要的HelloServlet.cpp
2)将HelloServlet.java编译成.class文件,并放置于正确目录中;
3)修改web.xml文件内容,使得浏览器访问路径为:http://localhost:8080/myweb/servlet/Hello;
4)重启服务器,查看页面运行效果。
源代码:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
publicclass HelloServlet extends HttpServlet
{
publicvoid doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
" +
"Transitional//EN/">/n";
out.println(docType +
"/n" +
"
"/n" +
"
Hello/n" +
"");
}
}
运行结果:
2、Servlet生命周期
1)配置LifeCycleServlet,使之运行;
2)刷新页面,观察变量a和变量b值的变化,并记录在实验报告中;
3)分析该运行结果的产生原因,并记录在实验报告中;
源代码:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
publicclass LifeCycleServlet extends HttpServlet
{
privateinta=0,b=0;
publicvoid destroy() {
}
publicvoid init() throws ServletException {
a++;
}
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
b++;
PrintWriter out = response.getWriter();
String docType =
" +
"Transitional//EN/">/n";
out.println(docType +
"/n" +
"
"/n" +
"
Please refresh the webpage, and compare two values:/n" +
"
a="+ a + "; b=" + b + "/n" +
"");
}
}
运行结果:
原因:
因为init函数只被调用一次,以后的全是调用doGet函数,故a一直是1,b会自增。
4)若在该页面上显示该Servlet的a)首次被装载并初始化的时间,以及b)该Servlet当前被访问的时间,应分别在哪些方法中增加什么代码?
源代码:
红色的为改动部分
publicvoid init() throws ServletException {
a = new Date() ;
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
b = new Date() ;
PrintWriter out = response.getWriter();
String docType =
" +
"Transitional//EN/">/n";
out.println(docType +
"/n" +
"
"/n" +
"
Please refresh the webpage, and compare two values:/n" +
"
init: " + a + "; " +
"current: " + b + "/n" +
"");
}
}
运行结果:
5)实现该功能,查看页面运行效果,并在实验报告中描述实现方法。
3、Servlet生命周期
1)在LifeCycleServlet中,应对哪个变量进行多线程的访问保护?
答:变量b
2)改进LifeCycleServlet代码,使用同步块进行访问保护,并记录在实验报告中。
代码:
synchronized (this){
b++;
}
|