态内容或者当前日期和时间的简单消息,它们带有 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>
面向Java开发人员的Scala指南 - Scala和servlet(4)
时间:2011-01-30 IBM Ted Neward
这个方法不会在任何用户界面设计大赛中夺冠,但是它达到了目的:这是一个 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")} {para
|