搞不懂 ???? servlet 问题

热烈的红颜 2008-06-14 02:28:57
我先写了一个ServletTest.java->编译后放到class文件夹下面->修改web.xml 重启Tomcat服务器->在浏览器中运行 显示结果正确
我发现以下两个高不清楚的问题 请指教
1:当我修改了ServletTest.java的内容 然后重复上述步骤 发现运行结果 没有变化 和以前的一样(我觉得应该运行出现修改后的结果)?????????????
2:当我把class文件夹下面的ServletTest.class文件删除以后 在浏览器当中仍然可以看到运行结果??????
...全文
117 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaoweianan 2008-06-17
  • 打赏
  • 举报
回复
2:当我把class文件夹下面的ServletTest.class文件删除以后 在浏览器当中仍然可以看到运行结果??????
应该是结果在浏览器中缓存造成的
Grass_itcast 2008-06-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 forerver121 的回复:]
引用 2 楼 fulianglove 的回复:
发布到tomcat路径下了,到tomcat目录里找到删掉,clean下
Tomcat 6.0\webapps\下
[/Quote]
你的项目名下删除
forerver121 2008-06-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fulianglove 的回复:]
发布到tomcat路径下了,到tomcat目录里找到删掉,clean下
[/Quote]Tomcat 6.0\webapps\下
Never_leilei 2008-06-16
  • 打赏
  • 举报
回复
重启下TOMCAT就OK了
nanjg 2008-06-16
  • 打赏
  • 举报
回复
建议新建一个web项目 基于eclipse,我偏偏不看好初学者脱离eclipse等IDE,浪费不必要的时间
热烈的红颜 2008-06-14
  • 打赏
  • 举报
回复
是在哪个目录下啊
chinaboy2005 2008-06-14
  • 打赏
  • 举报
回复
tomcat目录里找到删掉,clean
dracularking 2008-06-14
  • 打赏
  • 举报
回复
补充一下 web工程是要部署的 一旦修改从本地工程文件到应用服务器需要重起或redeploy
一般servlet等需要 jsp不需要
carnation003 2008-06-14
  • 打赏
  • 举报
回复
同意二楼!
fulianglove 2008-06-14
  • 打赏
  • 举报
回复
一楼的。。。。。。。
fulianglove 2008-06-14
  • 打赏
  • 举报
回复
发布到tomcat路径下了,到tomcat目录里找到删掉,clean下
jiexun1985 2008-06-14
  • 打赏
  • 举报
回复
本文介绍servlet 容器的基本原理。现有两个Servlet容器,第一个很简单,第二个则是根据第一个写出。为了使第一个容器尽量简单,所以没有做得很完整。复杂一些的 servlet 容器 (包括 TOMCAT 4 和 5) 可以参考其他资料。

  两个servlet容器都处理简单的servlet及staticResource。您可以使用 webroot/ 目录下的 PrimitiveServlet 来测试它。复杂一些的 servlet会超出这些容器的容量,创建复杂servlet容器不是本文的内容,所以在这里就不详细介绍了。

  两个应用程序的类都封装在ex02.pyrmont 包下。在理解应用程序如何运作之前,您必须熟悉 javax.servlet.Servlet 接口。首先就来介绍这个接口。随后,就介绍 servlet 容器服务servlet 的具体内容。

  javax.servlet.Servlet 接口

  servlet编程,需要引用以下两个类和接口:javax.servlet 和 javax.servlet.http,在这些类和接口中,javax.servlet.Servlet接口尤为重要。所有的 servlet 必须实现这个接口或继承已实现这个接口的类。

  Servlet 接口有五个方法,如下:

 public void init(ServletConfig config) throws ServletException

 public void service(ServletRequest request, ServletResponse response) throws ServletException, java.io.IOException

 public void destroy()

 public ServletConfig getServletConfig()

 public java.lang.String getServletInfo()

  init、service和 destroy 方法是 Servlet 生命周期的方法。当 Servlet 类实例化后,容器加载 init,以通知 servlet 它已进入服务行列。init 方法必须被加载,Servelt 才能接收和请求。如果要载入数据库驱动程序、初始化一些值等等,程序员可以重写这个方法。在其他情况下,这个方法一般为空。[page_break]

  service 方法由 Servlet 容器调用,以允许 Servlet 响应一个请求。Servlet 容器传递 javax.servlet.ServletRequest 对象和 javax.servlet.ServletResponse 对象。ServletRequest 对象包含客户端 HTTP 请求信息,ServletResponse 则封装servlet 响应。通过这两个对象,您可以写一些需要 servlet怎样服务和客户怎样请求的代码。

  从service中删除Servlet实例之前,容器调用destroy方法。在 servlet容器关闭或servlet 容器需要更多的内存时,就调用它。这个方法只有在servlet 的service 方法内的所有线程都退出的时候,或在超时的时候才会被调用。在 servlet 容器调用 destroy方法之后,它将不再调用 servlet的 service方法。

  destroy 方法给了servlet机会,来清除所有空闲资源(比如:内存,文件处理和线程),以确保在内存的持续状态和 servlet的当前状态是同步的。Listing 2.1 包含了PrimitiveServlet 的代码,此servlet非常简单,可以用它来测试本文的servlet容器应用程序。

  PrimitiveServlet 类实现了javax.servlet.Servlet 并提供了五个servlet方法的接口。它做的事情也很简单:每次调用 init、service 或 destroy方法的时候,servlet就向控制口写入方法名。service 方法也从ServletResponsec对象中获得java.io.PrintWriter 对象,并发送字符串到浏览器。

  Listing 2.1.PrimitiveServlet.java

import javax.servlet.*;

import java.io.IOException;

import java.io.PrintWriter;

public class PrimitiveServlet implements Servlet {

public void init(ServletConfig config) throws ServletException {

System.out.println("init");

}

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {

System.out.println("from service");

PrintWriter out = response.getWriter();

out.println("Hello.Roses are red.");

out.print("Violets are blue.");

}

public void destroy() {

System.out.println("destroy");

}

public String getServletInfo() {

return null;

}

public ServletConfig getServletConfig() {

return null;

}

}

  Application 1[page_break]

  现在,我们从 servlet容器的角度来看看 servlet 编程。一个功能健全的 servlet容器对于每个 servlet 的 HTTP请求会完成以下事情:

  1、当 servlet 第一次被调用的时候,加载了 servlet类并调用它的init方法(仅调用一次)

  2、响应每次请求的时候 ,构建一个javax.servlet.ServletRequest 和 javax.servlet.ServletResponse实例。

  3、激活 servlet 的 service 方法,传递 ServletRequest 和 ServletResponse 对象。

  4、当servlet 类关闭的时候,调用 servlet 的destroy 方法,并卸载 servlet 类。

  发生在 servlet 容器内部的事就复杂多了。只是这个简单的 servlet 容器的功能不很健全,所以,这它只能运行非常简单的servelt ,并不能调用 servlet 的 init 和destroy 方法。然而,它也执行了以下动作:

  1、等待 HTTP 请求。

  2、构建 ServletRequest 和 ServletResponse 对象

  3、如果请求的是一个staticResource,就会激活StaticResourceProcessor实例的 process方法,传递ServletRequest 和 ServletResponse 对象。

  4、如果请求的是一个servlet ,载入该类,并激活它的service 方法,传递ServletRequest 和ServletResponse 对象。注意:在这个servlet 容器,每当 servlet被请求的时候该类就被载入。

  在第一个应用程序中,servlet容器由六个类组成 。

  HttpServer1

  Request

  Response

  StaticResourceProcessor

  ServletProcessor1

  Constants

  这个程序的进入口(静态 main 方法)是HttpServer 类。这个方法创建了HttpServer实例,并调用它的await方法等待 HTTP 请示,然后创建一个 request 对象和 response对象,根据请求是否是staticResource还是 servlet 来分派它们到 StaticResourceProcessor实例或ServletProcessor实例。[page_break]

  Constants 类包含 static find WEB_ROOT,它是从其他类引用的。 WEB_ROOT 指明 PrimitiveServlet 位置 和容器服务的staticResource。

  HttpServer1 实例等待 HTTP 请求,直到它收到一个 shutdown 命令。发布 shutdown命令和前文是一样的。

  HttpServer1 类

  此应用程序内的 HttpServer1类 与前文简单的 WEB 服务器应用程序中的HttpServer 十分相似。但是,此应用程序内的 HttpServer1 能服务静态资源和 servlet。如果要请求一个静态资源,请输入以下 URL:

  http://machineName:port/staticResource 。如果要请求一个 servlet,请输入以下 URL:

http://machineName:port/servlet/servletClass

  如果您想在本地浏览器请求一个 PrimitiveServle servlet ,请输入以下 URL:

http://localhost:8080/servlet/PrimitiveServlet

  下面Listing 2.2类的await方法,是等待一个HTTP请求,直到一个发布shutdown命令。与前文的await 方法相似。

  Listing 2.2. HttpServer1 类的 await 方法

public void await() {

ServerSocket serverSocket = null;

int port = 8080;

try {

serverSocket = new ServerSocket(port, 1,

InetAddress.getByName("127.0.0.1"));

}

catch (IOException e) {

e.printStackTrace();

System.exit(1);

}

// 循环,等待一个请求

while (!shutdown) {

Socket socket = null;

InputStream input = null;

OutputStream output = null;

try {

socket = serverSocket.accept();

input = socket.getInputStream();

output = socket.getOutputStream();

// 创建请求对象并解析

Request request = new Request(input);

request.parse();

// 创建回应对象

Response response = new Response(output);

response.setRequest(request);

//检测是否是 servlet 或静态资源的请求

//servlet 请求以 "/servlet/" 开始

if (request.getUri().startsWith("/servlet/")) {

ServletProcessor1 processor = new ServletProcessor1();

processor.process(request, response);

}

else {

StaticResourceProcessor processor =

new StaticResourceProcessor();

processor.process(request, response);

}

// 关闭socket

socket.close();

//检测是否前面的 URI 是一个 shutdown 命令

shutdown = request.getUri().equals(SHUTDOWN_COMMAND);

}

catch (Exception e) {

e.printStackTrace();

System.exit(1);

}

}

}

  此文 await 方法和前文的不同点就是,此文的 await 方法中的请求调度到StaticResourceProcessor 或 ervletProcessor 。[page_break]

  如果 URI中包含 "/servlet/.",请求推进到后面,否则,请求传递到 StaticResourceProcessor 实例。

  Request 类

  Servlet service 方法接受 servlet 容器的 javax.servlet.ServletRequest 和javax.servlet.ServletResponse 实例。因此,容器必须构建 ServletRequest和ServletResponse对象,然后将其传递到正在被服务的service 方法。

  ex02.pyrmont.Request 类代表一个请求对象传递到 service 方法。同样地,它必须实现 javax.servlet.ServletRequest 接口。这个类必须提供接口内所有方法的实现。这里尽量简化它并只实现几个方法。要编译 Request 类的话,必须提供这些方法的空实现。再来看看 request 类,内部所有需要返回一个对象实例都返回null,如下:

public Object getAttribute(String attribute) {

return null;

}

public Enumeration getAttributeNames() {

return null;

}

public String getRealPath(String path) {

return null;

}

  另外,request 类仍需有前文有介绍的 parse 和getUri 方法。

  Response 类

  response 类实现 javax.servlet.ServletResponse,同样,该类也必须提供接口内所有方法的实现。类似于 Request 类,除 getWriter 方法外,其他方法的实现都为空。

public PrintWriter getWriter() {

// autoflush is true, println() will flush,

// but print() will not.

writer = new PrintWriter(output, true);

return writer;

}

  PrintWriter 类构建器的第二个参数是一个代表是否启用 autoflush 布尔值 ,如果为真,所有调用println 方法都 flush 输出。而 print 调用则不 flush 输出。因此,如果在servelt 的service 方法的最后一行调用 print方法,则从浏览器上看不到此输出。这个不完整性在后面的应用程序内会有调整。

  response 类也包含有前文中介绍的 sendStaticResource方法。

  StaticResourceProcessor 类

  StaticResourceProcessor 类用于服务静态资源的请求。它唯一的方法是 process。

  Listing 2.3.StaticResourceProcessor 类的 process方法。

public void process(Request request, Response response) {

try {

response.sendStaticResource();

}

catch (IOException e) {

e.printStackTrace();

}

}

  process 方法接受两个参数:Request 和 Response 实例。它仅仅是调用 response 类的sendStaticResource 方法。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧