2013-06-05 81 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