【发布时间】:2014-09-03 02:13:20
【问题描述】:
我现在对第 7 章的 Scala in Action 这本书有点坚持。
书中有一个使用 Jetty Server 和 Scalaz 构建的示例应用程序。关键是一旦启动 Jetty 服务器并将 GET 请求发送到特定 url,Scalaz 应该在 MethodParts 提取器对象的帮助下使用模式匹配。
但是,每当我尝试访问该网址时,结果都是 404。
我正在使用 SBT 0.13.5 和码头版本 9.2.2.v20140723。 Scalaz 的版本是 6.0.3。我正在运行 Java 8。
我想知道,可能是什么问题?据我从书中了解到,由于 Scalaz 使用模式匹配来匹配 URL,因此不需要其他配置。
可能是 Jetty 没有正确配置某些东西吗?还是我缺少的其他东西?
模式匹配部分代码:
def handle(implicit request: Request[Stream], servletRequest: HttpServletRequest): Option[Response[Stream]] =
request match {
case MethodParts(GET, "card" :: "create" :: Nil) =>
Some(OK(ContentType, "text/html") << strict << CreateStory(param("message")))
case _ => None
}
Application类值的主要部分:
val application = new ServletApplication[Stream, Stream]{
def application(implicit servlet: HttpServlet, servletRequest: HttpServletRequest,
request: Request[Stream]) = {
def found(x: Iterator[Byte]): Response[Stream] = OK << x.toStream
handle | HttpServlet.resource(found, NotFound.xhtml)
}
}
Web.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<!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>Scalaz</servlet-name>
<servlet-class>
scalaz.http.servlet.StreamStreamServlet
</servlet-class>
<init-param>
<param-name>application</param-name>
<param-value>
com.kanban.application.WeKanbanApplication
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Scalaz</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
提供 Jetty 的库依赖:https://github.com/earldouglas/xsbt-web-plugin
谢谢!
【问题讨论】:
-
Servlet
2.3!?您真的是针对 Jetty 4.x(从 1997 年开始)编写的吗?那个 servlet 规范在很多年前就被淘汰了。 Jetty 9.2 在 Servlet 规范 3.1 上(考虑升级您的web.xml。 -
更改 web.xml 并不能解决问题。