将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是不可能的。
你需要做什么:
- 从web.xml或webdefault.xml中删除JspServlet。 无论如何你不能在Android上使用它。
- 在开发机器上预编译JSP,并在web.xml中包含已编译的JSP引用。 看看那里的各种JSPC工具,他们都支持这一点。
- 使用i-jetty项目中概述的技术对编译后的WAR文件进行Dexify。
这将允许您使用JSP进行开发,并在Android上使用它们,但不是作为原始*.jsp
文件本身,而是编译的*.class
文件(然后将其解释为Android字节码格式)。
你可以看看NanoHTTPDserver,它是一个在Android上运行的轻型网络服务器,你必须自己做很多处理,但它可能只是服务于你的目的。
NanoHTTPD要点链接
- Java应用程序的Web用户界面
- Jetty 7:为Start.java配置JNDI
- Jetty 7高级分发,JSP和JSTL支持
- 使用CXF,Jetty和Spring的Web服务
- 如何通过Filter和FORWARD调度使用jetty continuation?
- Jetty – 如何在web.xml中以编程方式强制执行安全性约束
- 将Jetty与JAX-RS-Jersey集成
- Jetty mysql连接池配置错误:javax.naming.NameNotFoundException; 剩余名称’env / jdbc / —(mysql 5.0 + jetty 7.0.1)
- 嵌入式Jetty 8热部署类(使用Maven)