将jetty服务器嵌入到Android应用程序中

到目前为止,我正在尝试将示例Android应用程序安装到嵌入式android jetty web服务器,从而能够从Google代码运行示例hello-3.1.war。 当我在eclipse中运行hello-3.1时,就发生了空指针exception。

HTTP ERROR 500 Problem accessing /hello-3.1/sayit. Reason: INTERNAL_SERVER_ERROR Caused by: java.lang.NullPointerException at org.mortbay.ijetty.hello.HelloWorld.init(HelloWorld.java:29) at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440) at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) Powered by Jetty:// 

Hello-3.1 Web应用程序编码:

web.xml中

   <!--  jsp org.apache.jasper.servlet.JspServlet  logVerbosityLevel DEBUG   fork false   xpoweredBy false  0  -->  hello org.mortbay.ijetty.hello.HelloWorld   hello /sayit/*   

的pom.xml

    org.mortbay.ijetty example-webapps-parent 3.1 ../pom.xml  4.0.0 hello I-Jetty :: Hello 3.1 war http://maven.apache.org    maven-compiler-plugin  1.5 1.5 false     org.codehaus.mojo exec-maven-plugin 1.1   generate-dex process-classes  exec    java  <!-- -JXmx1024M --> -jar ${env.ANDROID_HOME}/platform-tools/lib/dx.jar --dex --verbose --core-library --output=${project.build.directory}/classes.dex --positions=lines ${project.build.directory}/classes/       maven-antrun-plugin   copydex process-classes  run               org.mortbay.jetty servlet-api-2.5 2.5 provided  <!--  org.eclipse.jetty jetty-jsp-2.1 7.2.2.v20101205  --> <!--  org.mortbay.jetty jsp-2.1-glassfish 2.1.v20100127 --> <!--  javax.servlet servlet-api 2.5 provided  -->  javax.servlet jsp_api 2.0 provided   com.google.android android ${android.version} provided    

在Android上无法使用JSP。

或者更准确一点,在Android设备上编译JSP是不可能的。

你需要做什么:

  1. 从web.xml或webdefault.xml中删除JspServlet。 无论如何你不能在Android上使用它。
  2. 在开发机器上预编译JSP,并在web.xml中包含已编译的JSP引用。 看看那里的各种JSPC工具,他们都支持这一点。
  3. 使用i-jetty项目中概述的技术对编译后的WAR文件进行Dexify。

这将允许您使用JSP进行开发,并在Android上使用它们,但不是作为原始*.jsp文件本身,而是编译的*.class文件(然后将其解释为Android字节码格式)。

你可以看看NanoHTTPDserver,它是一个在Android上运行的轻型网络服务器,你必须自己做很多处理,但它可能只是服务于你的目的。

NanoHTTPD要点链接