嵌入Jetty服务器到Android应用

嵌入Jetty服务器到Android应用

本文介绍了嵌入Jetty服务器到Android应用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

到目前为止,我试图使样品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 =htt​​p://java.sun.com/xml/ns/javaee
    XMLNS:XSI =htt​​p://www.w3.org/2001/XMLSchema-instance
    XSI:的schemaLocation =htt​​p://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 =htt​​p://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
  XMLNS:XSI =htt​​p://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是不可能的。

您需要做的:


  1. 从你的web.xml或webdefault.xml取出JspServlet。你不能在Android上使用也无妨。

  2. pre-编译你的开发机器上你的JSP的,包括在你的web.xml编译JSP引用。在各种工装JSPC看在那里,他们都支持这一点。

  3. 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:

  1. Remove the JspServlet from your web.xml or webdefault.xml. You can't use it on Android anyway.
  2. 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.
  3. 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应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 15:51