Servlet和JSP技术特性

开发 后端
本文介绍Servlet和JSP新特性,JSP是servlet技术的一个扩展,而不是废弃servlet。在实际应用当中,servlet和JSP页面一起使用。

J2EE 1.4提供用Java开发Web应用程序的新的Servlet 2.4和JavaServer Pages (JSP) 2.0技术。本文展示了这两种技术的新特性,并在适当的地方提供每个特性的示例代码。本文假设读者熟悉以前的 Servlet 2.3和JSP 1.2版本。给出的例子已用Tomcat 5(包含在Java Web Services Developer Pack 1.2中)进行了测试。

Servlet和JSP毫无疑问是两种应用最广的J2EE技术。Servlet技术是用Java进行Web应用编程的基础,也是JSP的基础。但是,servlet编程可能会非常麻烦。特别是当你不得不发送一个没多少代码的长HTML页面时更是如此。每个HTML标记必须嵌入到字符串中,用PrintWriter对象的显示方式发送。是一种工作单调乏味而烦人的工作。使用servlet的另一个缺点是每一处改变都需要servlet程序员介入。

Sun公司了解到这一问题之后便开发了JSP作为解决方案。在JSP中,程序员和页面设计员的分工变得容易多了,并且当Servlet和JSP页面更改时会自动进行编译。不过请注意,JSP是servlet技术的一个扩展,而不是废弃servlet。在实际应用当中,servlet和JSP页面一起使用。

Servlet 2.4提供了几个新类,且不支持javax.servlet.SingleThreadModel接口。这一版本只支持HTTP 1.1,所以Servlet 2.4应用程序不适用于HTTP 1.0客户程序。2.4版增加了请求监听器和请求属性监听器,并能在一个应用程序中将servlet用作欢迎页面。另外,Servlet 2.4还提供了更好的ServletRequest和RequestDispatcher对象,并更好地支持国际化。此外,现在是根据模式而不是文档类型定义(document-type definition,DTD)文件来验证部署描述符是否有效。这就意味着支持部署描述符的可扩展性。

下面具体说明Servlet 2.4的新特性。请求监听器和请求属性监听器。Servlet 2.3增加了servlet上下文相关监听器和会话相关监听器。Servlet 2.4增加了新的javax.servlet.ServletRequestListener和javax.servlet.ServletRequestAttributeListener两种接口,它们会通知你与Request对象有关的事件。如果你对每个Request对象的初始化和撤消感兴趣,你可以实施ServletRequestListener接口。这个接口有两个方法:requestInitialized()和requestDestroyed()。当需要一个Request对象时,servlet容器便调用requestInitialized方法。当不再需要Request对象时,servlet容器便调用requestDestroyed方法。

这两个方法都从servlet容器接收一个javax.servlet.ServletRequestEvent对象。可以从ServletRequestEvent实例获得servlet上下文和servlet请求。

第二个监听器接口ServletRequestAttributeListener处理Request对象属性的添加、更改和删除。该接口有以下方法:
attributeAdded。向Request对象添加新属性时由servlet容器调用。
attributeRemoved。从Request对象中删除属性时由servlet容器调用。
attributeReplaced。Request对象中现有属性值被替换时由servlet容器调用。

这三个方法从servlet容器获得javax.servlet.ServletRequestAttributeEvent类的一个实例。ServletRequestAttributeEvent类扩展了ServletRequestEvent类,并添加了两个新方法:getName和getValue。getName方法返回触发事件的属性的名称,getValue返回属性的值。

代码清单1 给出这两个新的监听器的示例类。当servlet容器调用方法时二者都显示方法名。监听器经过编译后,它们的类文件必须被部署到WEB-INF/classes目录下。ServletRequest中的新方法。在Servlet 2.4中,javax.servlet.ServletRequest接口增加了4个新方法:

getRemotePort。返回发送请求的客户机或最后一个代理服务器的Internet Protocol(IP)源端口。
getLocalName。返回从中接收请求的IP接口的主机名。
getLocalAddr。返回从中接收请求的接口的IP地址。
getLocalPort。返回从中接收请求的接口的IP端口号。

请注意,在Servlet 2.3中,getServerName和getServerPort方法返回的值就是现在getLocalName和getLocalPort返回的值。在2.4版中,getServerName和getServerPort已重新定义。欲了解更多的信息,请查看API文档。

将一个JSP页面中的代码示例如下

  1. out.println("<br>Remote Port : " +  
  2. request.getRemotePort());  
  3. out.println("<br>Local Name : " +  
  4. request.getLocalName());  
  5. out.println("<br>Local Addr : " +  
  6. request.getLocalAddr());  
  7. out.println("<br>Local Port : " +  
  8.  
  9. request.getLocalPort()); 

如果一个Request对象未被传递,则这些属性的值为null。另一方面,在所传递来对象的资源中这些属性将具有非null值。当某一个资源必须只能通过另一个资源调用而不能直接调用时,这些属性值很有用。

举个例子,在一个叫做myApp的Context(上下文)中有一个名为ModernServlet的servlet, ModernServlet被传递给TargetServlet。 在TargetServlet中,显示代码清单2中的代码。

myApp的部署描述符包含以下和元素:

  1. <servlet> 
  2. <servlet-name>Modernservlet-name> 
  3. <servlet-class>ModernServlet  
  4. servlet-class> 
  5. servlet> 
  6. <servlet-mapping> 
  7. <servlet-name>Modernservlet-name> 
  8. <url-pattern>/Modernurl-pattern> 
  9. servlet-mapping> 
  10. <servlet> 
  11. <servlet-name>Targetservlet-name> 
  12. <servlet-class>TargetServlet  
  13. servlet-class> 
  14.  
  15. servlet> 
  16. <servlet-mapping> 
  17. <servlet-name>Targetservlet-name> 
  18. <url-pattern>/Targeturl-pattern> 
  19. servlet-mapping> 

【编辑推荐】

  1. 创建Servlet过滤器的向导
  2. 安装Servlet和JSP开发工具
  3. 扩展Future Response Servlet
  4. Servlet容器的匹配过程
  5. 浅谈user cache Servlet
责任编辑:佚名 来源: 中国IT实验室
相关推荐

2009-07-03 10:46:48

JSP ServletJavaBean

2009-07-06 15:34:56

JSP和Servlet

2009-06-30 15:37:27

Servlet和JSP

2009-07-07 14:04:55

JSP入门

2009-07-08 09:35:53

Java ServleServlet 3.0

2009-07-03 11:21:43

Servlet和JSPJSP路径

2009-08-20 17:35:47

Servlet和JSP

2009-07-08 09:22:03

Servlet和JSP

2009-06-25 14:26:07

JSPJavaBeanServlet

2009-07-03 14:41:03

2009-07-08 15:25:56

Servlet和JSP

2009-07-07 13:29:33

Servlet和JSP

2009-08-10 09:19:28

Servlet JSP

2009-07-02 09:56:24

导入事件驱动技术JSP Servlet

2009-06-29 16:19:57

JSP Servlet

2009-07-01 14:09:24

Servlet和BeaJSP

2009-07-02 09:13:25

什么是JSPServlet

2009-06-29 15:39:53

Servlet和JSPServlet引擎

2009-07-07 17:10:57

JSP和Servlet

2009-07-03 14:02:51

点赞
收藏

51CTO技术栈公众号