问题描述
到目前为止,我试图使样品Android应用到嵌入式Android的Jetty Web服务器能够从谷歌code运行样品HELLO-3.1.war。虽然我在Eclipse中运行HELLO-3.1则空指针异常已经发生。
HTTP错误500问题访问/hello-3.1/sayit。原因: 内部服务器错误致:显示java.lang.NullPointerException
在org.mortbay.ijetty.hello.HelloWorld.init(HelloWorld.java:29)
在org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440)
在org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339)
在org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
在org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)
在org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
在org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
在org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
在org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
在org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
在org.mortbay.jetty.Server.handle(Server.java:326)
在org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
在org.mortbay.jetty.HttpConnection $ RequestHandler.headerComplete(HttpConnection.java:928)
在org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
在org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
在org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
在org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
在org.mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:582)技术码头://
您好-3.1的Web应用程序的编码:
的web.xml
<?XML版本=1.0编码=ISO-8859-1&GT?;
< web应用程序
的xmlns =http://java.sun.com/xml/ns/javaee
XMLNS:XSI =http://www.w3.org/2001/XMLSchema-instance
XSI:的schemaLocation =http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd
版本=3.0>
<! - < servlet的ID =JSP>
< servlet的名称>&JSP LT; / servlet的名称>
<的servlet类> org.apache.jasper.servlet.JspServlet< / servlet的类>
<初始化参数>
<参数-名称>&logVerbosityLevel LT; /参数 - 名称>
<参数值>调试和LT; /参数值>
< /初始化参数>
<初始化参数>
<参数-名称>&叉LT; /参数 - 名称>
<参数值>假LT; /参数值>
< /初始化参数>
<初始化参数>
<参数-名称>&xpoweredBy LT; /参数 - 名称>
<参数值>假LT; /参数值>
< /初始化参数>
&所述;负载上启动大于0&下/负载上启动>
< / servlet的> - >
<&servlet的GT;
< servlet的名称>&打招呼LT; / servlet的名称>
<的servlet类> org.mortbay.ijetty.hello.HelloWorld< / servlet的类>
< / servlet的> < Servlet映射>
< servlet的名称>&打招呼LT; / servlet的名称>
< URL模式> / sayit / *< / URL模式>
< / Servlet映射>
< / web-app的>
的pom.xml
<?XML版本=1.0编码=UTF-8&GT?;
<项目
XSI:的schemaLocation =http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
XMLNS:XSI =http://www.w3.org/2001/XMLSchema-instance>
&所述亲本GT;
<&的groupId GT; org.mortbay.ijetty< /的groupId>
<的artifactId将实施例-的webapps亲和LT; / artifactId的>
<&版GT; 3.1< /版本>
< relativePath> ../的pom.xml< / relativePath>
< /母体GT;
< modelVersion> 4.0.0< / modelVersion>
<&的artifactId GT;&打招呼LT; / artifactId的>
<名称> I-码头::你好< /名称>
<&版GT; 3.1< /版本>
<包装和GT;战争与LT; /包装>
&LT; URL&GT; HTTP://maven.apache.org< / URL&GT;
&LT;建立&GT;
&LT;&插件GT;
&LT;&插件GT;
&LT;&的artifactId GT; Maven的编译器插件&LT; / artifactId的&GT;
&LT;结构&gt;
&lt;信源&GT; 1.5 LT; /源&GT;
&lt;目标&GT; 1.5 LT; /目标与GT;
&LT(详细);假&LT; /详细&GT;
&LT; /结构&gt;
&LT; /插件&GT; &LT;! - 转换编译的类成clases.dex。 - &GT;
&LT;&插件GT;
&LT;的groupId方式&gt;组织codehaus.mojo&LT; /的groupId&GT;
&LT;&的artifactId GT;的exec-Maven的插件&LT; / artifactId的&GT;
&LT;&版GT; 1.1&LT; /版本&GT;
&LT;&执行GT;
&LT;执行与GT;
&LT;&ID GT;生成-DEX&LT; / ID&GT;
&LT;阶段&gt;工艺类&LT; /阶段&gt;
&LT;目标&GT;
&LT;&目标GT; EXEC&LT; /目标&GT;
&LT; /目标&GT;
&LT;结构&gt;
&LT;! - 可执行&GT; $ {} env.ANDROID_HOME /平台的工具/ DX&LT; /可执行 - &GT;
&LT;可执行指令GT;的Java&LT; /可执行&GT;
&LT;&参数GT;
&LT;! - &LT;&说法GT; -JXmx1024M&LT; /参数&GT; - &GT;
&LT;&说法GT;&罐子LT; /参数&GT;
&LT;&说法GT; $ {} env.ANDROID_HOME /platform-tools/lib/dx.jar</argument>
&LT;&说法GT; - DEX&LT; /参数&GT;
&LT;&说法GT; - 详细&LT; /参数&GT;
&LT;&说法GT; - 核心库&LT; /参数&GT;
&LT;&说法GT; - 输出= $ {} project.build.directory /classes.dex</argument>
&LT;&说法GT; - 位置=行&LT; /参数&GT;
&LT;&说法GT; $ {} project.build.directory /班/&LT; /参数&GT;
&LT; /参数&GT;
&LT; /结构&gt;
&LT; /执行&GT;
&LT; /处决&GT;
&LT; /插件&GT;
&LT;&插件GT;
&LT;&的artifactId GT;的maven-antrun-插件&LT; / artifactId的&GT;
&LT;&执行GT;
&LT;执行与GT;
&LT;&ID GT; copydex&LT; / ID&GT;
&LT;阶段&gt;工艺类&LT; /阶段&gt;
&LT;目标&GT;
&LT;&目标GT;运行&LT; /目标&GT;
&LT; /目标&GT;
&LT;结构&gt;
&LT;任务和GT;
&LT;的mkdir
DIR =$ {project.build.directory} / $ {project.artifactId} - $ {} project.version / WEB-INF / lib目录/&GT;
&LT;罐子
BASEDIR =$ {} project.build.directory
更新=真
包括=classes.dex
destfile=\"${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/lib/classes.zip\" /&GT;
&LT; /任务&GT;
&LT; /结构&gt;
&LT; /执行&GT;
&LT; /处决&GT;
&LT; /插件&GT;
&LT; /插件&GT;
&LT; /构建&GT;
&LT;依赖和GT;
&LT;&依赖性GT;
&LT;&的groupId GT; org.mortbay.jetty&LT; /的groupId&GT;
&LT;&的artifactId GT;的servlet-API 2.5 LT; / artifactId的&GT;
&LT;&版GT; 2.5 LT; /版本&GT;
&LT;&范围GT;及提供LT; /&范围GT;
&LT; /依赖性&GT;
&LT;! - &LT;&依赖性GT;
&LT;&的groupId GT; org.eclipse.jetty&LT; /的groupId&GT;
&LT;&的artifactId GT;码头-JSP-2.1&LT; / artifactId的&GT;
&LT;&版GT; 7.2.2.v20101205&LT; /版本&GT;
&LT; /依赖性&GT; - &GT;
&LT;! - &LT;&依赖性GT;
&LT;&的groupId GT; org.mortbay.jetty&LT; /的groupId&GT;
&LT;&的artifactId GT;的JSP 2.1的GlassFish&LT; / artifactId的&GT;
&LT;&版GT; 2.1.v20100127&LT; /版本&GT;
&LT; /依赖性&GT; - &GT;
&LT;! - &LT;&依赖性GT;
&LT;&的groupId GT;的javax.servlet&LT; /的groupId&GT;
&LT;&的artifactId GT;的servlet-API&LT; / artifactId的&GT;
&LT;&版GT; 2.5 LT; /版本&GT;
&LT;&范围GT;及提供LT; /&范围GT;
&LT; /依赖性&GT; - &GT;
&LT;&依赖性GT;
&LT;&的groupId GT;的javax.servlet&LT; /的groupId&GT;
&LT;&的artifactId GT; jsp_api&LT; / artifactId的&GT;
&LT;&版GT; 2.0&LT; /版本&GT;
&LT;&范围GT;及提供LT; /&范围GT;
&LT; /依赖性&GT;
&LT;&依赖性GT;
&LT;&的groupId GT; com.google.android&LT; /的groupId&GT;
&LT;&的artifactId GT; Android设备和LT; / artifactId的&GT;
&LT;&版GT; $ {android.version}&LT; /版本&GT;
&LT;&范围GT;及提供LT; /&范围GT;
&LT; /依赖性&GT;
&LT; /依赖和GT;
&LT; /项目&GT;
JSP是不可能在Android上。
或者更准确,在Android设备上编译JSP是不可能的。
您需要做的:
- 从你的web.xml或webdefault.xml取出JspServlet。你不能在Android上使用也无妨。
- pre-编译你的开发机器上你的JSP的,包括在你的web.xml编译JSP引用。在各种工装JSPC看在那里,他们都支持这一点。
- Dexify使用在I-码头项目列出的技术岗位编译WAR文件。
这将允许您使用JSP开发,并利用它们在Android,但不作为原料 *。JSP
文件本身,而是编译 *类
文件(然后dexified到了Android字节code格式)。
So far i am trying making sample android applications to embedded android jetty web server enables to run samples hello-3.1.war from Google code. While i run hello-3.1 in eclipse then null pointer exception has been occur.
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 application Codings:
Web.XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- <servlet id="jsp">
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet> -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.mortbay.ijetty.hello.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/sayit/*</url-pattern>
</servlet-mapping>
</web-app>
Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parent>
<groupId>org.mortbay.ijetty</groupId>
<artifactId>example-webapps-parent</artifactId>
<version>3.1</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hello</artifactId>
<name>I-Jetty :: Hello</name>
<version>3.1</version>
<packaging>war</packaging>
<url>http://maven.apache.org</url>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<verbose>false</verbose>
</configuration>
</plugin>
<!-- Convert the compiled classes into a clases.dex. -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>generate-dex</id>
<phase>process-classes</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<!-- executable>${env.ANDROID_HOME}/platform-tools/dx</executable -->
<executable>java</executable>
<arguments>
<!-- <argument>-JXmx1024M</argument> -->
<argument>-jar</argument>
<argument>${env.ANDROID_HOME}/platform-tools/lib/dx.jar</argument>
<argument>--dex</argument>
<argument>--verbose</argument>
<argument>--core-library</argument>
<argument>--output=${project.build.directory}/classes.dex</argument>
<argument>--positions=lines</argument>
<argument>${project.build.directory}/classes/</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>copydex</id>
<phase>process-classes</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<mkdir
dir="${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/lib" />
<jar
basedir="${project.build.directory}"
update="true"
includes="classes.dex"
destfile="${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/lib/classes.zip" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api-2.5</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- <dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp-2.1</artifactId>
<version>7.2.2.v20101205</version>
</dependency> -->
<!-- <dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-glassfish</artifactId>
<version>2.1.v20100127</version>
</dependency>-->
<!-- <dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency> -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp_api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>${android.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
JSP is not possible on Android.
Or to be more accurate, compiling JSP on an Android device is not possible.
What you need to do:
- Remove the JspServlet from your web.xml or webdefault.xml. You can't use it on Android anyway.
- Pre-compile your JSP's on your development machine and include the compiled JSP references in your web.xml. Look at the various JSPC tooling out there, they all support this.
- Dexify the post-compiled WAR file using the techniques outlined at the i-jetty project.
This will allow you to develop with JSPs, and use them on Android, but not as the raw *.jsp
file itself, but rather the compiled *.class
files (which are then dexified into the Android bytecode format).
这篇关于嵌入Jetty服务器到Android应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!