Scala 显然是一门有趣的语言,很适合体现语言理论和创新方面的新思想,但最终它要用在 “现实” 环境中,它必须能满足开发人员的某些需求并在 “现实” 环境中有一定的实用性。
了解 Scala 语言的一些核心功能之后,就能认识到 Scala 语言的一些灵活性,并能放心使用 Scala 创建 DSL。现在我们进入实际应用程序使用的环境,看看 Scala 如何适应环境。在本系列的新阶段中,我们将首先讨论大部分 Java™ 应用程序的核心:Servlet API。
servlet 回顾
回忆一下 Servlet 101 课程和教程,servlet 环境的核心实际上就是通过一个套接字(通常是端口 80)使用 HTTP 协议的客户机-服务器交换。客户机可以是任何 “用户-代理”(由 HTTP 规范定义),服务器是一个 servlet 容器。servlet 容器在我编写的一个类上查找、加载和执行方法,该类最终必须实现 javax.servlet.Servlet 接口。
关于本系列Ted Neward 将和您一起深入探讨 Scala 编程语言。在这个新的 developerWorks 系列 中,您将了解有关 Scala 的所有最新讨论,并在实践中看到 Scala 的语言功能。在进行相关比较时,Scala 代码和 Java 代码将放在一起展示,但是(您将发现)Scala 与 Java 中的许多东西都没有直接的关联,这正是 Scala 的魅力所在!如果用 Java 代码就能够实现的话,又何必再学习 Scala 呢?
.通常,实际的 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 方法,依此类推。
Hello, Scala 与 Hello, Servlet
显然,任何人编写的第一个 servlet 都是普遍的 “Hello, World” servlet;Scala 的第一个 servlet 示例也是如此。回忆一下许多年之前介绍的 servlet 教程,当时基本的 Java “Hello, World” servlet 只是输出清单 1 所示的 HTML 响应:
清单 1. 预期的 HTML 响应
用 Scala 编写一个简单的 servlet 来实现这个操作非常简单,而且这个 servlet 与其相应的 Java 形式几乎一样,如清单 2 所示:
清单 2. Hello, Scala servlet!
注意,我使用了一些适当的导入别名来缩短请求的类型名称和相应类型;除此之外,这个 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
从这里开始,我假设读者会在必要时调整/修改部署描述符,因为这跟 Scala 没有关系。
当然,格式良好的 HTML 与格式良好的 XML 非常相似;鉴于这一点,Scala 对 XML 字面值的支持使编写这个 servlet 简单得多(参阅 参考资料 中的 “Scala 和 XML” 一文)。Scala 不是在传递给 HttpServletResponse 的 String 中直接嵌入消息,它可以分离逻辑和表示形式(非常简单),方法是利用此支持将消息放在 XML 实例中,然后再传递回去:
清单 4. Hello, Scala servlet!
Scala 的内联表达式求值工具使用 XML 字面值,这意味着能够轻松地使 servlet 更有趣。例如,将当前日期添加到消息中与将 Calendar 表达式添加到 XML 中一样简单,不过增加了几行 { Text(java.util.Calendar.getInstance().getTime().toString() ) }。这似乎显得有点冗长,如清单 5 所示:
清单 5. Hello, timed Scala servlet!
实际上,Scala 编译器与 XML 对象消息一起整合到一个 scala.xml.Node 中,然后在将它传递给响应的 Writer 的 print 方法时将其转换为一个 String。
不要小看这一点 — 表达形式从逻辑中分离出来完全在一个类内部进行。这条 XML 消息将进行编译时检查,以确保语法正确和格式良好,并获得一些标准 servlet(或 JSP)不具备的好处。由于 Scala 可以进行类型推断,因此可以省略有关 message 和 currentDate 的实际类型消息,使得这就像动态语言 Groovy/Grails 一样。初次使用效果不错。
当然,只读 servlet 相当麻烦。
Hello, Scala。这些是参数。
大多数 servlet 不会只返回类似静态内容或者当前日期和时间的简单消息,它们带有 POST 形式的内容,检查内容并进行相应的响应。例如,可能 Web 应用程序需要知道使用者的身份,并询问其姓名:
清单 6. 挑战!
这个方法不会在任何用户界面设计大赛中夺冠,但是它达到了目的:这是一个 HTML 表单,它会将数据发送给一个新的 Scala servlet(绑定到 sayMyName 的相对 URL)。这些数据将根据 servlet 规范存储在一个名称-值对集合中,可通过 HttpServletRequest.getParameter() API 调用获得。在此调用中,我们将 FORM 元素的名称作为一个参数传递给 API 调用。
从 Java 代码直接转换相对容易一些,如清单 7 中的 servlet 所示:
清单 7. 响应(v1)
但这缺少了我之前提到的消息分离的一些好处,因为现在消息定义必须显式使用参数 firstName 和 lastName;如果响应 get 中使用的元素个数超过 3 个或 4 个,情况就会变得比较复杂。此外,doPost 方法在将参数传递给消息进行显示之前,必须自行提取每一个参数 — 这样的编码很繁琐,并且容易出错。
一种解决方法是将参数提取和 doPost 方法本身的调用添加到一个基类,如清单 8 中的版本 2 所示:
清单 8. 响应(v2)
这个版本使 servlet 显示变得比较简单(相对上一版本而言),而且增加了一个优点,即 param 和 header 映射保持不变(注意,我们可以将 param 定义为一个引用请求对象的方法,但这个请求对象必须已经定义为一个字段,这将引发大规模的并发性问题,因为 servlet 容器认为每一个 do 方法都是可重入的)。
当然,错误处理是处理 Web 应用程序 FORM 的重要部分,而 Scala 作为一种函数性语言,保存的内容都是表达式,这意味着我们可以将消息编写为结果页面(假设我们喜欢这个输入),或编写为错误页面(如果我们不喜欢这个输入)。因此,检查 firstName 和 lastName 的非空状态的验证函数可能如清单 9 所示:
清单 9. 响应(v3)
注意,模式匹配可以使编写比较简单的验证规则变得很容易。利用模式匹配绑定到原始值(比如上一个例子),或者绑定到一个本地变量(比如我们要排除任何姓名中有 “e” 的人,比如上一个注释)。
显然,还有事情需要做!困扰 Web 应用程序的典型问题之一是 SQL 注入攻击,它由通过 FORM 传入的未转义 SQL 命令字符引入,并且在数据库中执行之前连接到包含 SQL 结构的原始字符串。使用 scala.regex 包中的正则表达式支持,或者一些解析器组合子(在本系列最后三篇文章中讨论)可以确认 FORM 验证是否正确。事实上,整个验证过程会提交给使用默认验证实现的基类,该验证实现默认情况下只返回 true(因为 Scala 是函数性语言,所以不要忽略好的对象设计方法)。
结束语
虽然 Scala servlet 框架的功能不像其他一些 Java Web 框架的那样完整,但是我这里创建的这个小 Scala servlet 有两个基本用途:
•展示以有趣的方式利用 Scala 的功能,使 JVM 编程更简单。
•简单介绍将 Scala 用于 Web 应用程序,这自然会引入 “lift” 框架(参见 参考资料 小节)。
本期到此结束,我们下一期再见!
了解 Scala 语言的一些核心功能之后,就能认识到 Scala 语言的一些灵活性,并能放心使用 Scala 创建 DSL。现在我们进入实际应用程序使用的环境,看看 Scala 如何适应环境。在本系列的新阶段中,我们将首先讨论大部分 Java™ 应用程序的核心:Servlet API。
servlet 回顾
回忆一下 Servlet 101 课程和教程,servlet 环境的核心实际上就是通过一个套接字(通常是端口 80)使用 HTTP 协议的客户机-服务器交换。客户机可以是任何 “用户-代理”(由 HTTP 规范定义),服务器是一个 servlet 容器。servlet 容器在我编写的一个类上查找、加载和执行方法,该类最终必须实现 javax.servlet.Servlet 接口。
关于本系列Ted Neward 将和您一起深入探讨 Scala 编程语言。在这个新的 developerWorks 系列 中,您将了解有关 Scala 的所有最新讨论,并在实践中看到 Scala 的语言功能。在进行相关比较时,Scala 代码和 Java 代码将放在一起展示,但是(您将发现)Scala 与 Java 中的许多东西都没有直接的关联,这正是 Scala 的魅力所在!如果用 Java 代码就能够实现的话,又何必再学习 Scala 呢?
.通常,实际的 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 方法,依此类推。
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 相当麻烦。
Hello, Scala。这些是参数。
大多数 servlet 不会只返回类似静态内容或者当前日期和时间的简单消息,它们带有 POST 形式的内容,检查内容并进行相应的响应。例如,可能 Web 应用程序需要知道使用者的身份,并询问其姓名:
清单 6. 挑战!
<HTML> <HEAD><TITLE>Who are you?</TITLE></HEAD> <BODY> Who are you? Please answer: <FORM action="/scalaExamples/sayMyName" method="POST"> Your first name: <INPUT type="text" name="firstName" /> Your last name: <INPUT type="text" name="lastName" /> <INPUT type="submit" /> </FORM> </BODY> </HTML>
这个方法不会在任何用户界面设计大赛中夺冠,但是它达到了目的:这是一个 HTML 表单,它会将数据发送给一个新的 Scala servlet(绑定到 sayMyName 的相对 URL)。这些数据将根据 servlet 规范存储在一个名称-值对集合中,可通过 HttpServletRequest.getParameter() API 调用获得。在此调用中,我们将 FORM 元素的名称作为一个参数传递给 API 调用。
从 Java 代码直接转换相对容易一些,如清单 7 中的 servlet 所示:
清单 7. 响应(v1)
class NamedHelloWorldServlet1 extends HttpServlet { def message(firstName : String, lastName : String) = <HTML> <HEAD><TITLE>Hello, {firstName} {lastName}!</TITLE></HEAD> <BODY>Hello, {firstName} {lastName}! It is now {currentTime}.</BODY> </HTML> def currentTime = java.util.Calendar.getInstance().getTime() override def doPost(req : HSReq, resp : HSResp) = { val firstName = req.getParameter("firstName") val lastName = req.getParameter("lastName") resp.getWriter().print(message(firstName, lastName)) } }
但这缺少了我之前提到的消息分离的一些好处,因为现在消息定义必须显式使用参数 firstName 和 lastName;如果响应 get 中使用的元素个数超过 3 个或 4 个,情况就会变得比较复杂。此外,doPost 方法在将参数传递给消息进行显示之前,必须自行提取每一个参数 — 这样的编码很繁琐,并且容易出错。
一种解决方法是将参数提取和 doPost 方法本身的调用添加到一个基类,如清单 8 中的版本 2 所示:
清单 8. 响应(v2)
abstract class BaseServlet extends HttpServlet { import scala.collection.mutable.{Map => MMap} def message : scala.xml.Node; protected var param : Map[String, String] = Map.empty protected var header : Map[String, String] = Map.empty override def doPost(req : HSReq, resp : HSResp) = { // Extract parameters // val m = MMap[String, String]() val e = req.getParameterNames() while (e.hasMoreElements()) { val name = e.nextElement().asInstanceOf[String] m += (name -> req.getParameter(name)) } param = Map.empty ++ m // Repeat for headers (not shown) // resp.getWriter().print(message) } } class NamedHelloWorldServlet extends BaseServlet { override def message = <HTML> <HEAD><TITLE>Hello, {param("firstName")} {param("lastName")}!</TITLE></HEAD> <BODY>Hello, {param("firstName")} {param("lastName")}! It is now {currentTime}. </BODY> </HTML> def currentTime = java.util.Calendar.getInstance().getTime() }
这个版本使 servlet 显示变得比较简单(相对上一版本而言),而且增加了一个优点,即 param 和 header 映射保持不变(注意,我们可以将 param 定义为一个引用请求对象的方法,但这个请求对象必须已经定义为一个字段,这将引发大规模的并发性问题,因为 servlet 容器认为每一个 do 方法都是可重入的)。
当然,错误处理是处理 Web 应用程序 FORM 的重要部分,而 Scala 作为一种函数性语言,保存的内容都是表达式,这意味着我们可以将消息编写为结果页面(假设我们喜欢这个输入),或编写为错误页面(如果我们不喜欢这个输入)。因此,检查 firstName 和 lastName 的非空状态的验证函数可能如清单 9 所示:
清单 9. 响应(v3)
class NamedHelloWorldServlet extends BaseServlet { override def message = if (validate(param)) <HTML> <HEAD><TITLE>Hello, {param("firstName")} {param("lastName")}! </TITLE></HEAD> <BODY>Hello, {param("firstName")} {param("lastName")}! It is now {currentTime}.</BODY> </HTML> else <HTML> <HEAD><TITLE>Error!</TITLE></HEAD> <BODY>How can we be friends if you don't tell me your name?!?</BODY> </HTML> def validate(p : Map[String, String]) : Boolean = { p foreach { case ("firstName", "") => return false case ("lastName", "") => return false //case ("lastName", v) => if (v.contains("e")) return false case (_, _) => () } true } def currentTime = java.util.Calendar.getInstance().getTime() }
注意,模式匹配可以使编写比较简单的验证规则变得很容易。利用模式匹配绑定到原始值(比如上一个例子),或者绑定到一个本地变量(比如我们要排除任何姓名中有 “e” 的人,比如上一个注释)。
显然,还有事情需要做!困扰 Web 应用程序的典型问题之一是 SQL 注入攻击,它由通过 FORM 传入的未转义 SQL 命令字符引入,并且在数据库中执行之前连接到包含 SQL 结构的原始字符串。使用 scala.regex 包中的正则表达式支持,或者一些解析器组合子(在本系列最后三篇文章中讨论)可以确认 FORM 验证是否正确。事实上,整个验证过程会提交给使用默认验证实现的基类,该验证实现默认情况下只返回 true(因为 Scala 是函数性语言,所以不要忽略好的对象设计方法)。
结束语
虽然 Scala servlet 框架的功能不像其他一些 Java Web 框架的那样完整,但是我这里创建的这个小 Scala servlet 有两个基本用途:
•展示以有趣的方式利用 Scala 的功能,使 JVM 编程更简单。
•简单介绍将 Scala 用于 Web 应用程序,这自然会引入 “lift” 框架(参见 参考资料 小节)。
本期到此结束,我们下一期再见!
发表评论
-
Scala + Twitter = Scitter(scala代码学习第15天)
2011-04-08 09:11 864Twitter 迅速占领了 Interne ... -
构建计算器,第 3 部分将 Scala 解析器组合子和 case 类结合起来(scala代码学习第十天)
2011-04-01 09:25 949欢迎勇于探索的读者回到我们的系列文章中!本月继续探索 Scal ... -
scala代码学习构建计算器,第2 部分(代码学习第九天)
2011-03-31 10:53 806回忆一下我们的英雄所处的困境:在试图创建一个 DSL(这里只不 ... -
Scala构建计算器,第1 部分(代码学习第8天)
2011-03-30 11:59 1191特定于领域的语言 可能您无法(或没有时间)承受来自于您的项目 ... -
scala包和访问修饰符(代码学习第七天)
2011-03-29 15:51 1614系列的过程中我遗漏了 ... -
实现继承(代码学习第五天)
2011-03-26 10:13 962近十几年来,面向对象语言设计的要素一直是继承的核心。不支持继承 ... -
关于特征和行为(代码学习第四天)
2011-03-25 09:38 696著名科学家、研究学者 ... -
Scala 控制结构内部揭密(scala代码学习第三天)
2011-03-24 09:15 1304迄今为止,在此 系列 ... -
面向 Java 开发人员的 Scala 指南: 类操作(代码学习第2天)
2011-03-22 19:06 740第一天中只是些简单应用 ,您只是稍微了解了一些 Scala 语 ... -
programming in scala 2nd代码学习(第一天)
2011-03-22 18:42 932近来没事,拿出了原先学习scala的代码 书中代码噢、拿出自己 ... -
scalatra web框架快速搭建(官方使用文档)
2011-03-21 22:42 2513昨天写了个sbt构建scala项目的文章,就是为了今天的sca ... -
A build tool for Scala(simple-build-tool) sbt安装指南
2011-03-20 22:49 2200今天有位写框架的大哥叫我学一学scalatra框架,找了 ... -
Scala functional style deferent from java OOP(特点)
2011-03-20 17:34 981该程序通过一段斐波那契数列的计算,比较一下Scala的函数式编 ... -
Java 开发人员的 Scala 指南: 面向对象的函数编程
2011-03-20 11:59 1034函数概念 开始之前, ...
相关推荐
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,为Java开发者提供了一种更高效、更简洁的编程选择。在Java开发领域,Servlet是用于构建Web应用程序的标准API,广泛应用于服务器端编程。本...
面向对象:Java,Js,Python,Scala 3.Java语言版本迭代概述 1991年 Green项目,开发语言最初命名为Oak (橡树) 1994年,开发组意识到Oak 非常适合于互联网 1996年,发布JDK 1.0,约8.3万个网页应用Java技术来制作 ...
ScalaTest则是Scala社区中的一个强大的测试工具,它提供了丰富的匹配器和断言,支持行为驱动开发(BDD)风格的测试,使得测试代码同样清晰易读。例如,你可以使用以下代码来测试Scalatra应用中的某个路由: ```...
标题 "gateway-servlet-2.0.3.zip" 暗示了这是一个与网关服务相关的Servlet库,可能是一个特定版本的实现或者扩展。在Java Web开发中,Servlet是用于处理HTTP请求的核心组件,而网关Servlet则可能扮演着统一入口、...
在大数据领域,Hadoop和Scala是两个至关重要的...在实际操作中,你将学习如何配置和优化这些工具,以及如何编写和运行Scala代码来处理和分析大数据集,这对于任何希望在大数据领域深化技能的人来说都是宝贵的实践经验。
相当于 Ruby 的 Rack、Python 的 WSGI、Haskell 的 WAI 和 Java 的 Servlet。 示例代码: // Make your model safe and streaming by using a scalaz-stream Process def getData(req: Request): ...
- **Android开发**:Java是Android应用的主要开发语言,开发者使用Android SDK和Java编写应用。 - **Kotlin**:虽然不是Java,但Kotlin现在已被Google推荐为Android首选语言,它可以无缝集成到Java项目中。 4. **...
- **面向对象**:Java是一种完全面向对象的编程语言,支持类、接口和继承等概念,使得代码模块化,易于维护和扩展。 - **平台无关性**:Java的“一次编写,到处运行”(Write Once, Run Anywhere)理念,得益于其...
2. Java EE(企业版):提供了企业级应用开发所需的各种组件和服务,如Servlet、JSP、EJB等。 3. Java ME(微型版):适用于嵌入式设备和移动应用。 三、Java在软件开发中的应用 1. Web开发:Spring框架是Java在Web...
除了这些,还有其他一些轻量级框架,比如Play Framework,它是一个基于Scala和Java的Web开发框架,采用MVC架构,提供了简洁的API和实时反馈机制,适合快速开发Web应用。如果"java0323"涉及到Play Framework,那么你...
5. **Play Framework**:Play是一个现代的、开源的Java和Scala Web框架,它强调简洁的代码和实时反馈,支持TDD(测试驱动开发)和敏捷开发。 6. **JUnit**:JUnit是Java最广泛使用的单元测试框架,它为编写和运行可...
1. **Java 语言基础**:Java 是大数据开发的主要编程语言,因此首先要熟练掌握 Java 语法、面向对象编程、异常处理、集合框架等基础知识。推荐阅读《java 编程思想》。 2. **数据库**:理解数据库系统的基础,如 ...
Scalatra是一个轻量级、基于Scala的Web框架,它为构建RESTful服务提供了简洁而高效的API。这个压缩包"scalatra-scalatest-2.1.0-RC3.zip"很可能是Scalatra的一个版本,结合了Scalatra框架与ScalaTest测试库,版本号...
Jetty是一个轻量级、高性能的Java web服务器和Servlet容器,而Jetty NoSQL Memcached是Jetty的一个扩展,它允许将用户会话数据存储在Memcached这种分布式内存对象缓存系统中,从而提高了会话数据的访问速度和可伸缩...
Jetty是一个轻量级、高性能的开源HTTP服务器和Servlet容器,广泛用于Java Web应用程序的部署和运行。它支持HTTP、HTTPS、WebSocket等协议,并且具有高度可嵌入性和模块化的特性,使得开发者可以轻松地在自己的应用中...
除此之外,Play Framework是一个轻量级、基于Actor模型的框架,它支持Scala和Java语言,强调开发的敏捷性和TDD(测试驱动开发)。Play Framework采用反应式编程模型,可以实现高效的异步处理。 在实际开发中,...
4. **Play Framework**:Play Framework是一个轻量级的、基于Actor模型的Web开发框架,它使用Scala或Java编写。Play的路由系统允许开发者定义URL到控制器方法的映射,提供了简单易用的模板引擎来生成HTML响应。 5. ...
6. **Web应用开发**:Java的Servlet和JSP(JavaServer Pages)技术广泛应用于动态网站开发。Spring框架、Struts、Hibernate等Java EE(Enterprise Edition)框架为大型企业级Web应用提供了强大的支持。 7. **企业级...
这是一个Grails插件,可在Grails Web项目中使用Scala代码。 分配 grails-scala-.zip用于插件源分发-这是推荐版本,因为此插件的二进制版本不包含必需的jar 依存关系 使用的Grails版本要求的Servlet容器来运行Web应用...