网站首页 | 网页制作 | 网络编程 | 图形图象 | 冲浪宝典 | 操作系统 | 软件教学 | 网络安全 | 认证考试 | 下载中心 | 游戏下载
| 网络编程首页 | ASP | ASP.NET | PHP | JSP | C# | Delphi | Java | C/C++ | XML | SMS | VC | VB | 数据库 |
您现在的位置: 超人气学院 >> 网络编程 >> JSP >> jsp文摘 >> 文章正文 用户登录 新用户注册
Servlet和JSP迈上新台阶           
Servlet和JSP迈上新台阶
作者:未知 文章来源:mx68.com收集 点击数: 更新时间:2006-1-18 23:41:59

即将面世的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中,程序员和页面设计员的分工变得容易多了,并且当JSP页面更改时会自动进行编译。不过请注意,JSP是servlet技术的一个扩展,而不是废弃servlet。在实际应用当中,servlet和JSP页面一起使用。

Servlet 2.4的新特性

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页面中的代码示例如下--


out.println("<br>Remote Port : " +
  request.getRemotePort());
out.println("<br>Local Name : " +
  request.getLocalName());
out.println("<br>Local Addr : " +
  request.getLocalAddr());
out.println("<br>Local Port : " +

  request.getLocalPort());

--该代码生成这样的内容:


Remote Port : 3303
Local Name : localhost
Local Addr : 127.0.0.1
Local Port : 8080


请求调度程序的新特性。使用请求调度程序可将当前请求传递给一个新的资源,或从当前页面引入另一个资源。Servlet 2.4增加了一些属性,它们将被添加到传递给另一个资源的一个Request对象上:


javax.servlet.forward.request_uri
javax.servlet.forward.context_path
javax.servlet.forward.servlet_path
javax.servlet.forward.path_info
javax.servlet.forward.query_string


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

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

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


<servlet>
   <servlet-name>Modern</servlet-name>
   <servlet-class>ModernServlet
   </servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>Modern</servlet-name>
   <url-pattern>/Modern</url-pattern>
</servlet-mapping>
<servlet>
   <servlet-name>Target</servlet-name>
   <servlet-class>TargetServlet
   </servlet-class>

</servlet>
<servlet-mapping>
   <servlet-name>Target</servlet-name>
    <url-pattern>/Target</url-pattern>
</servlet-mapping>


下面是调用ModernServlet时控制台显示的结果:


javax.servlet.forward.request_uri : /myApp/Modern
javax.servlet.forward.context_path : /myApp
javax.servlet.forward.servlet_path : /Modern
javax.servlet.forward.path_info : null
javax.servlet.forward.query_string : null


将过滤器用于请求调度程序。Servlet 2.4在部署描述符中添加了一个新的元素,以便servlet程序员决定是否将过滤器(filters)应用于请求调度程序。元素的值可以是REQUEST(默认值)、FORWARD、INCLUDE和ERROR:


REQUEST。如果请求直接来自客户机则使用过滤器。


FORWARD。如果请求正由请求调度程序进行处理,表示与或相匹配的Web组件使用传递调用,则使用过滤器。


INCLUDE。只有在请求正由请求调度程序进行处理,表示与或相匹配的Web组件使用包含(include)调用时,才使用过滤器。


ERROR。只有在请求正由错误页面机制处理为一个与元素相匹配的错误资源时才使用过滤器。

Servlet 2.4只支持HTTP 1.1客户机。Servlet 2.3既支持HTTP 1.0,又支持HTTP 1.1,而Servlet 2.4与Servlet 2.3不同,它只支持HTTP 1.1客户机。作为过渡,HTTP/1.0状态码302(暂时建议)仍然存在,而且仍然由javax.servlet.http.HttpServletResponse接口中的SC_MOVED_TEMPORARILY表示。HTTP 1.1具有Found的状态码302,它由HttpServletResponse接口中的静态SC_FOUND表示。

Servlet用作欢迎页面。在Servlet 2.3中,你可以在部署描述符中使用元素列出欢迎文件--当收到一个不完整的URL时将显示的文件。但是,在Servlet 2.3中,在元素中只能使用HTML文件或JSP文件。在Servlet 2.4中,如今可以将一个servlet用作欢迎页面。下例为一个叫做Modern的servlet,它的类为ModernServlet.class,并已被映射到path /Modern。


<servlet>
  <servlet-name>Modern</servlet-name>
  <servlet-class>ModernServlet
  </servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>Modern</servlet-name>
  <url-pattern>/Modern</url-pattern>
</servlet-mapping>
<welcome-file-list>

  <welcome-file>Modern</welcome-file>
</welcome-file-list>

此时,若用户键入诸如http://domain/context/(不带资源文件)的URL时,就会调用ModernServlet。

对国际化的新支持。在Servlet 2.3中,没有办法直接告诉客户浏览器应当使用什么字符编码。要实现这一目的,你必须把一个java.util.Locale对象传递给javax.servlet.ServletResponse接口的setLocale方法,如下所示:


response.setLocale(locale);

这意味着你必须首先创建一个Locale对象。

另外一种办法是,在Servlet 2.3中,你可以使用setContentType方法来传递内容类型和字符集,如:


setContentType('text/html;
               charset=UTF-8');

在Servlet 2.4中,javax.servlet.ServletResponse接口中有两个支持国际化的新方法。第一个方法是setCharacterEncoding,它的用法如下:


public void
setCharacterEncoding(String charset)

使用setCharacterEncoding,你可以只将字符编码指定为一个字符串,而不必先创建Locale对象。不过,请注意,要让这种方法起作用,必须在调用getWriter方法之前以及响应提交之前调用它。

第二个新方法是getContextType,作为在ServletResponse对象中调用setContentType、setLocale或setCharacterEncoding方法的结果,它返回在ServletResponse对象中使用的内容类型。

除了javax.servlet.ServletResponse中的这两个方法之外,你还可以利用Servlet 2.4在部署描述符中定义一个新元素:它使servlet程序员不必在他/她的servlet中指定locale-to-charset映射。如何使用这一新元素的例子如下:


<locale-encoding-mapping-list>
  <locale-encoding-mapping>
    <locale>ja</locale>
    <encoding>ISO-2022-JP</encoding>

  </locale-encoding-mapping>
</locale-encoding-mapping-list>


部署描述符的可扩展性。在Servlet 2.3应用程序中,根据DTD文件对部署描述符进行验证。现在Servlet 2.4支持根据模式对部署描述符进行验证。使用模式比使用DTD有以下几点好处:


通过模式可以继承另一个模式(可扩展的)的语法。


模式比DTD更精确。


通过模式可以指定每个元素的内容的实际数据类型。


模式可以用于多个名字空间。


通过模式可以指定一个元素出现的最多和最少次数。
但是,为了向后兼容,要求Servlet 2.4容器支持Servlet 2.3和Servlet 2.2 DTD。

不支持javax.servlet.SingleThreadMo

[1] [2] 下一页

[ 收藏此页到: 天天|和讯|博采|ViVi|狐摘|我摘|天极 ] 文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    专 题 栏 目
    最 新 热 门
  • 此栏目下没有热点文章
  • 相 关 文 章
    JBuilder9.0开发实用技巧七
    Jsp&Servlet会话控制
    图解利用Eclipse3+SysdeoT
    J2SE1.5注释语法新鲜试用
    图解Java开发工具JBuilder
    冰茶过后的喜悦--Eclipse3
    收集Eclipse插件网站^_^
    eclipse&myEclipse
    JGoodiesForms1.0.5Releas
    妙使Java成功访问SQLServe
    Jboss下MSSQLServer配置指
    批量安装部署webservice到
    eclipse+cvs的基本使用方法
    异常java.sql.SQLExceptio
    J2SE的相关命名和版本号(J
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)