2

我在 Scalatra 应用程序中使用嵌入式 Jetty 服务器。问题是它提供css具有text/html内容类型的文件:

下面是主要方法:

package yard.web

import org.eclipse.jetty.server.Server
import org.eclipse.jetty.webapp.WebAppContext
import org.scalatra.servlet.ScalatraListener

object JettyMain {
  def main(args: Array[String]) {
    val server = new Server(9080)
    val context: WebAppContext = new WebAppContext("src/main/webapp", "/")
    context.setServer(server)
    context.setInitParameter(ScalatraListener.LifeCycleKey, "yard.web.ScalatraBootstrap")
    context.addEventListener(new ScalatraListener())
    server.setHandler(context)

    server.start()

    println("Press ENTER to stop server")
    Console.readLine()
    server.stop()
    server.join()
  }
}

该文件位于src/main/webapp/libs/bootstrap/css/bootstrap.css,并提供:

$ curl --head http://localhost:9080/libs/bootstrap/css/bootstrap.css
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Last-Modified: Sat, 06 Apr 2013 14:30:35 GMT
Content-Length: 127247
Accept-Ranges: bytes
Server: Jetty(8.1.10.v20130312)

为什么 Jetty 认为它是一个 html 文件?


这是ScalatraBootstrap完整性类:

package yard.web

import org.scalatra.LifeCycle
import javax.servlet.ServletContext
import yard.Settings
import yard.db.Store

class ScalatraBootstrap extends LifeCycle {
  override def init(context: ServletContext) {

    val settings = Settings.default
    val db = Store(settings).db

    context mount (new MainServlet, "/")
  }
}

更新:使用 aResourceHandler会导致 css 以正确的内容类型提供服务。但是,该应用程序不起作用:(

4

1 回答 1

6

CSS 文件通常从org.eclipse.jetty.servlet.DefaultServlet.

这是在etc/webdefault.xml分发的文件中声明的。

由于您使用的是嵌入式模式,因此您需要通过调用WebAppContext.setDefaultsDescriptor(String)手动提供此文件路径etc/webdefault.xml

最后,mime 类型本身由DefaultServletviamime.properties文件加载,该文件由 Jetty 通过调用Classloader.getResource("/org/eclipse/jetty/http/mime.properties").

注意:该mime.properties文件在文件中找到jetty-http-8.1.10.v20130312.jar

于 2013-04-06T15:31:20.830 回答