当前位置:七道奇文章资讯编程技术Java编程
日期:2011-01-26 02:54:00  来源:本站整理

面向Java开辟人员的Scala指南: Scala和servlet[Java编程]

赞助商链接



  本文“面向Java开辟人员的Scala指南: Scala和servlet[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
为了让一门语言实用于 “实际”,并且使其 “光辉起来”,该语言必须可以服务于实际环境和利用程序.在这一期的 面向 Java 开辟人员的 Scala 指南 系列中,Ted Neward 将介绍 Scala 在实际环境中的利用,即注释 Scala 若何与核心 Servlet API 交互,乃至大概会对其举行一些改正.

    Scala 明显是一门风趣的语言,很合适表现语言理论和创新方面的新思惟,但终究它要用在 “实际” 环境中,它必须能满意开辟人员的某些需求并在 “实际” 环境中有一定的实用性.

    理解 Scala 语言的一些核心功效之后,就可以熟习到 Scala 语言的一些机动性,并能安心利用 Scala 成立 DSL.目前我们进入实际利用程序利用的环境,看看 Scala 若何适应环境.在本系列的新阶段中,我们将首先谈论大部份 Java? 利用程序的核心:Servlet API.

    Servlet 回想

    回想一下 Servlet 101 课程和教程,servlet 环境的核心实际上就是通过一个套接字(普通是端口 80)利用 HTTP 协议的客户机-服务器交换.客户机可以是任何 “用户-代理”(由 HTTP 标准定义),服务器是一个 servlet 容器.servlet 容器在我编写的一个类上查找、加载和履行办法,该类终究必须实现 javax.servlet.Servlet 接口.

    普通,实际的 Java 开辟人员不会编写直接实现接口的类.因为最初的 servlet 标准是用于为 HTTP 之外的其他协议供应一个通用 API,所以 servlet 命名空间被分为了两部份:

    一个 “通用” 包(javax.servlet)

    一个特定于 HTTP 的包(javax.servlet.http)

    这样,将在一个称为 javax.servlet.GenericServlet 的抽象基类的通用包中实现一些基本的功效;然后在派生类 javax.servlet.http.HttpServlet 中实现其他特定于 HTTP 的功效,该类普通用作 servlet 实际 “内容” 的基类.HttpServlet 供应了一个 Servlet 的完好实现,将 GET 恳求拜托给一个将要被覆盖的 doGet 办法,将 POST 恳求拜托给一个将要被覆盖的 doPut 办法,依此类推.

关于本系列

Ted Neward 将和您一同深化探究 Scala 编程语言.在这个新的 developerWorks 系列 中,您将理解有关 Scala 的全部最新谈论,并在实践中看到 Scala 的语言功效.在举行相关对比时,Scala 代码和 Java 代码将放在一同展示,但是(您将发现)Scala 与 Java 中的很多东西都没有直接的关联,这恰是 Scala 的魅力所在!假如用 Java 代码就可以够实现的话,又何必再学习 Scala 呢?

    Hello, Scala 与 Hello, Servlet

    明显,任何人编写的第一个 servlet 都是广泛的 “Hello, World” servlet;Scala 的第一个 servlet 示例也是如此.回想一下很多年之前介绍的 servlet 教程,当时基本的 Java “Hello, World” servlet 只是输出清单 1 所示的 HTML 呼应:

    清单 1. 预期的 HTML 呼应

<HTML>
   <HEAD><TITLE>Hello, Scala!</TITLE></HEAD>
   <BODY>Hello, Scala! This is a servlet.</BODY>
</HTML>

    用 Scala 编写一个简单的 servlet 来实现这个操作非常简单,并且这个 servlet 与其呼应的 Java 情势几近一样,如清单 2 所示:

    清单 2. Hello, Scala servlet!

import javax.servlet.http.{HttpServlet,
  HttpServletRequest => HSReq, HttpServletResponse => HSResp}

class HelloScalaServlet extends HttpServlet
{
  override def doGet(req : HSReq, resp : HSResp) =
    resp.getWriter().print("<HTML>" +
      "<HEAD><TITLE>Hello, Scala!</TITLE></HEAD>" +
      "<BODY>Hello, Scala! This is a servlet.</BODY>" +
      "</HTML>")
}

    注意,我利用了一些得当的导入别名来缩短恳求的范例名称和呼应范例;除此之外,这个 servlet 几近与其 Java servlet 情势一样.编译时请记得在 servlet-api.jar(普通随 servlet 容器一同公布;在 Tomcat 6.0 发行版中,它躲藏在 lib 子目录中)中包含一个引用,不然将找不到 servlet API 范例.

    这还预备得不够充分;按照 servlet 标准,它必须利用一个 web.xml 布置描写符布置到 Web 利用程序目录中(或一个 .war 文件中),该描写符描写 servlet 应当与哪个 URL 结合.关于这样一个简单的例子,利用一个相当简单的 URL 来配合它最简单,如清单 3 所示:

    清单 3. 布置描写符 web.xml

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <servlet>
    <servlet-name>helloWorld</servlet-name>
    <servlet-class>HelloScalaServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>helloWorld</servlet-name>
    <url-pattern>/sayHello</url-pattern>
  </servlet-mapping>
</web-app>

    从这里开始,我假定读者会在必要时调整/改正布置描写符,因为这跟 Scala 没有关系.

    当然,格局杰出的 HTML 与格局杰出的 XML 非常类似;鉴于这一点,Scala 对 XML 字面值的支持使编写这个 servlet 简单得多(参阅 参考资料 中的 “Scala 和 XML” 一文).Scala 不是在传送给 HttpServletResponse 的 String 中直接嵌入消息,它可以别离逻辑和表示情势(非常简单),办法是操纵此支持将消息放在 XML 实例中,然后再传送回去:

    清单 4. Hello, Scala servlet!

import javax.servlet.http.{HttpServlet,
  HttpServletRequest => HSReq, HttpServletResponse => HSResp}

class HelloScalaServlet extends HttpServlet
{
  def message =
    <HTML>
      <HEAD><TITLE>Hello, Scala!</TITLE></HEAD>
      <BODY>Hello, Scala! This is a servlet.</BODY>
    </HTML>

  override def doGet(req : HSReq, resp : HSResp) =
    resp.getWriter().print(message)
}

    Scala 的内联表达式求值工具利用 XML 字面值,这意味着可以轻松地使 servlet 更风趣.比方,将当前日期增添到消息中与将 Calendar 表达式增添到 XML 中一样简单,不过增添了几行 { Text(java.util.Calendar.getInstance().getTime().toString() ) }.这仿佛显得有点冗长,如清单 5 所示:

    清单 5. Hello, timed Scala servlet!

import javax.servlet.http.{HttpServlet,
  HttpServletRequest => HSReq, HttpServletResponse => HSResp}

class HelloScalaServlet extends HttpServlet
{
  def message =
    <HTML>
      <HEAD><TITLE>Hello, Scala!</TITLE></HEAD>
      <BODY>Hello, Scala! It's now { currentDate }</BODY>
    </HTML>
  def currentDate = java.util.Calendar.getInstance().getTime()

  override def doGet(req : HSReq, resp : HSResp) =
    resp.getWriter().print(message)
}

    实际上,Scala 编译器与 XML 对象消息一同整合到一个 scala.xml.Node 中,然后在将它传送给呼应的 Writer 的 print 办法时将其转换为一个 String.

    不要藐视这一点 — 表达情势从逻辑中别离出来完好在一个类内部举行.这条 XML 消息将举行编译时查抄,以确保语法精确和格局杰出,并得到一些尺度 servlet(或 JSP)不具有的好处.由于 Scala 可以举行范例推断,因此可以省略有关 message 和 currentDate 的实际范例消息,使得这就像动态语言 Groovy/Grails 一样.初次利用效果不错.

    当然,只读 servlet 相当麻烦.


  以上是“面向Java开辟人员的Scala指南: Scala和servlet[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • Jt —— 面向Java情势的框架
  • 面向Java开辟人员的Scala指南 - 用Scitter更新Twitter
  • 面向Java开辟人员的Scala指南 - 类操作
  • 面向Java开辟人员的Scala指南 - 面向对象的函数编程
  • 面向Java开辟人员的Scala指南 - 实现承当
  • 面向Java开辟人员的Scala指南 - Scala和servlet
  • 面向Java开辟人员的Scala指南 - Scala掌握构造内部揭密
  • 面向Java开辟人员的Scala指南 - 包和访谒修饰符
  • <b>面向Java开辟人员的Scala指南 - 构建计算器,第1部份</b>
  • 面向Java开辟人员的Scala指南 - 构建计算器,第2部份
  • 面向Java开辟人员的Scala指南 - 构建计算器,第3部份
  • 面向Java开辟人员的Scala指南 - 关于特点和行为
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .