2013-06-05 82 views
3

我在Android平台上运行Jetty以提供静态html页面和servlet。 现在我试图增加对JSP页面的支持,但我得到这个例外,当我问任何JSP:Android上的JSP编译(嵌入式Jetty)

HTTP ERROR 500 

Problem accessing /time.jsp. Reason: 

    Server Error 

Caused by: 

org.apache.jasper.JasperException: PWC6033: Error in Javac compilation for JSP 

PWC6199: Generated servlet error: 
The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files 

PWC6199: Generated servlet error: 
The type java.lang.Throwable cannot be resolved. It is indirectly referenced from required .class files 

PWC6199: Generated servlet error: 
The type java.lang.String cannot be resolved. It is indirectly referenced from required .class files 

PWC6199: Generated servlet error: 
org.apache.jasper.runtime.HttpJspBase cannot be resolved to a type 

PWC6199: Generated servlet error: 
org.apache.jasper.runtime.JspSourceDependent cannot be resolved to a type 

PWC6199: Generated servlet error: 
JspFactory cannot be resolved to a type 

PWC6199: Generated servlet error: 
JspFactory cannot be resolved 

PWC6199: Generated servlet error: 
java.util.List cannot be resolved to a type 

PWC6199: Generated servlet error: 
Syntax error, parameterized types are only available if source level is 1.5 or greater 

PWC6199: Generated servlet error: 
String cannot be resolved to a type 

PWC6199: Generated servlet error: 
org.glassfish.jsp.api.ResourceInjector cannot be resolved to a type 

PWC6199: Generated servlet error: 
java.util.List cannot be resolved to a type 

PWC6199: Generated servlet error: 
Syntax error, parameterized types are only available if source level is 1.5 or greater 

PWC6199: Generated servlet error: 
String cannot be resolved to a type 

PWC6199: Generated servlet error: 
_jspx_dependants cannot be resolved to a variable 

PWC6199: Generated servlet error: 
HttpServletRequest cannot be resolved to a type 

PWC6199: Generated servlet error: 
HttpServletResponse cannot be resolved to a type 

PWC6199: Generated servlet error: 
java.io.IOException cannot be resolved to a type 

PWC6199: Generated servlet error: 
ServletException cannot be resolved to a type 

PWC6199: Generated servlet error: 
PageContext cannot be resolved to a type 

PWC6199: Generated servlet error: 
HttpSession cannot be resolved to a type 

PWC6199: Generated servlet error: 
ServletContext cannot be resolved to a type 

PWC6199: Generated servlet error: 
ServletConfig cannot be resolved to a type 

PWC6199: Generated servlet error: 
JspWriter cannot be resolved to a type 

PWC6199: Generated servlet error: 
Object cannot be resolved to a type 

PWC6199: Generated servlet error: 
JspWriter cannot be resolved to a type 

PWC6199: Generated servlet error: 
PageContext cannot be resolved to a type 

PWC6199: Generated servlet error: 
_jspxFactory cannot be resolved 

PWC6199: Generated servlet error: 
_jspx_resourceInjector cannot be resolved to a variable 

PWC6199: Generated servlet error: 
org.glassfish.jsp.api.ResourceInjector cannot be resolved to a type 

PWC6197: An error occurred at line: 3 in the jsp file: /time.jsp 
PWC6199: Generated servlet error: 
java.util.Date cannot be resolved to a type 

PWC6199: Generated servlet error: 
Throwable cannot be resolved to a type 

PWC6199: Generated servlet error: 
SkipPageException cannot be resolved to a type 

PWC6199: Generated servlet error: 
ServletException cannot be resolved to a type 

PWC6199: Generated servlet error: 
_jspxFactory cannot be resolved 


    at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:129) 
    at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:299) 
    at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:392) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:453) 
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:457) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) 
    at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 
    at org.eclipse.jetty.server.Server.handle(Server.java:370) 
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489) 
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:949) 
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1011) 
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644) 
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) 
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 
    at java.lang.Thread.run(Thread.java:856) 

Powered by Jetty:// 

这里是主要的活动我的配置代码:

public void startServer() 
{ 
     server = new Server(8080); 

     System.setProperty("org.apache.jasper.compiler.disablejsr199", "true"); 

     // Create a resource handler for static content. 
     ResourceHandler staticResourceHandler = new ResourceHandler(); 
     staticResourceHandler.setResourceBase(Environment.getExternalStorageDirectory().getAbsolutePath() + "/web/static/"); 
     staticResourceHandler.setDirectoriesListed(false); 

     // Create context handler for static resource handler. 
     ContextHandler staticContextHandler = new ContextHandler(); 
     staticContextHandler.setContextPath("/static"); 
     staticContextHandler.setHandler(staticResourceHandler); 

     // Create WebAppContext for JSP files. 
     WebAppContext webAppContext = new WebAppContext(); 
     webAppContext.setContextPath("/"); 
     webAppContext.setResourceBase(Environment.getExternalStorageDirectory().getAbsolutePath() + "/web/"); 
     webAppContext.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false"); 

     // Create servlet context handler for main servlet. 
     ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     servletContextHandler.setContextPath("/servlet"); 
     servletContextHandler.setResourceBase(Environment.getExternalStorageDirectory().getAbsolutePath() + "/web/servlet/"); 

     terminalServlet = new TerminalServlet(this); 
     networkServlet = new NetworkDrawerServlet(this); 
     servletContextHandler.setClassLoader(Thread.currentThread().getContextClassLoader()); 
     servletContextHandler.addServlet(new ServletHolder(terminalServlet),"/terminal"); 
     servletContextHandler.addServlet(new ServletHolder(networkServlet),"/topology"); 
     //servletContextHandler.addServlet(new ServletHolder(new DefaultServlet()), "/*"); 

     // Create a handler list to store our static, jsp and servlet context handlers. 
     HandlerList handlers = new HandlerList(); 
     handlers.setHandlers(new org.eclipse.jetty.server.Handler[] { staticContextHandler, webAppContext, servletContextHandler }); 

     // Add the handlers to the server and start jetty. 
     server.setHandler(handlers); 
    try { 
     server.start(); 
    } catch (Exception e) { 
    } 
} 

我的地方在extarnal存储中的“/ web /”目录下的webserver文件(静态内容和jsp文件)(它适用于静态内容,我已经在清单文件中设置了读写权限)。

我认为这是Android下的一般疑惑问题,因为在桌面上编译和执行的代码工作正常。

回答

4

JSP在Android上不可行。

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

现有JspServlet实现将尝试编译*.java源到一个目录*.class文件,标准javac不存在,所以你会觉得你可以通过Eclipse的书面做到这一点,JDT推行精益,但即使这样由于某些基本原因而不起作用。

  1. 基本类库不存在于JDT编译器寻找的标准位置。这就是您看到所有“无法解决”错误的原因。
  2. 编译为*.class文件在android上毫无意义,因为实际的Android设备本身不理解*.class文件。它不是Java,而是Dalvik,它正好与Java兼容(在开发/构建时)。
  3. Android的Dalvik VM期望dexified字节码,JDT编译器不能生成该字节码。
  4. 我知道没有设备上的dexify工具,库或实用程序可以为您完成最后一步。如果确实存在,您需要分叉和修改JSP实现以包含这一额外步骤。

如果你想在JSP开发和对Android的web应用程序,这是你需要做的:

  1. 从你的web.xml或webdefault.xml取出JspServlet。无论如何,你无法在Android上使用它。
  2. 在您的开发机器上预编译您的JSP。
  3. 更新您的WEB-INF/web.xml以包含已编译的JSP引用。看看那里的各种JSPC工具,它们都支持这个概念(作为一个适合包含的XML片段,或者通过直接修改你现有的WEB-INF/web.xml
  4. 使用i中概述的技术来减弱后期编译的WAR文件-jetty项目。

这将允许您使用JSP开发,并利用它们在Android,但不作为原料*.jsp文件本身,而是编译*.class files(然后将其dexified到Android的字节码格式)

+0

如果我想通了,我会意识到.class-> DEX功能,就像是不存在。那里好抓。尽管一切都运转良好,但它惊人地发挥了它的作用。 – stu