2014-04-23 39 views
0

我是DWR的新手。我正在嘗試使用DWR腳本訪問java類。未生成DWR class.js文件

我正在使用帶有struts的DWR作爲Web層,並且內部彈出依賴注入。

我的web.xml看起來是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com /xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns /javaee/web-app_3_0.xsd" id="WebApp_TAPE" version="3.0"> 

<welcome-file-list> 
    <welcome-file>Login.jsp</welcome-file> 
</welcome-file-list> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<filter> 
    <filter-name>struts2</filter-name> 
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
    <servlet> 
     <servlet-name>dwr-invoker</servlet-name> 
     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> 
     <init-param> 
     <param-name>debug</param-name> 
     <param-value>true</param-value> 
     </init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dwr-invoker</servlet-name> 
     <url-pattern>/dwr/*</url-pattern> 
    </servlet-mapping> 
    </web-app> 

我的dwr.xml是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE dwr PUBLIC 
     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" 
     "http://getahead.org/dwr/dwr20.dtd"> 
    <dwr> 
      <allow> 
     <create creator="new" javascript="task"> 
       <param name="class" value="com.Task"/> 
     </create> 
      </allow> 
    </dwr> 

在我的JSP中,我添加了以下三行:

<script type='text/javascript' src="<%=contextString %>/dwr/engine.js"></script> 
    <script type='text/javascript' src="<%=contextString %>/dwr/util.js"></script> 
    <script type='text/javascript' src="<%=request.getContextPath() %>/dwr/interface/task.js"></script> 

這就是我想要訪問「任務」腳本的方式:

var count = task.getTaskCount(); 
    alert(count); 

getTaskCount方法是一個返回int值的簡單方法。

現在,在我上面的代碼中,我可以使用 /dwr /來訪問engine.js和util.js文件。

但是當我嘗試使用URL訪問task.js文件: /dwr/interface/task.js,該腳本不產生以下錯誤控制檯上產生:

2014-04-23 18:48:55,896 ["http-bio-8444"-exec-9] WARN   org.directwebremoting.servlet.ExceptionHandler:67 - Unhandled Exception 
    java.lang.SecurityException: No class by name: taskBL 
at org.directwebremoting.impl.DefaultCreatorManager.getCreator(DefaultCreatorManager.java:189) 
at org.directwebremoting.impl.DefaultRemoter.generateInterfaceScript(DefaultRemoter.java:158) 
at org.directwebremoting.servlet.InterfaceHandler.handle(InterfaceHandler.java:50) 
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101) 
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146) 
at org.directwebremoting.servlet.DwrServlet.doGet(DwrServlet.java:132) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 

任何幫助非常感謝。

在此先感謝。

回答

0

我不使用dwr.xml文件(我有空的文件)。我使用註釋(例如@RemoteProxy),但我不確定您是否正確使用javascript屬性(在您的dwr.xml文件中)。我認爲這不是您在JavaScript中使用的標識符來調用遠程Java對象。

嘗試包括這樣的js腳本(注意是大寫牛逼字母):

<script type='text/javascript' src="<c:url value='/dwr/interface/Task.js' />"></script> 

網址標籤是從<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>這對我的作品,我認爲它更漂亮。

然後在Javascript中方法調用看起來像(再次大寫牛逼字母):

Task.getTaskCount(); 

請看看我的web.xml中。我使用註釋,所以我需要init-param:classes。它告訴dwr哪些類將被遠程訪問。

<servlet> 
    <display-name>DWR Servlet</display-name> 
    <servlet-name>dwr-invoker</servlet-name> 
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> 
    <init-param> 
     <param-name>classes</param-name> 
     <param-value>com.Task</param-value> 
    </init-param> 
    <init-param> 
     <param-name>crossDomainSessionSecurity</param-name> 
     <param-value>false</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>dwr-invoker</servlet-name> 
    <url-pattern>/dwr/*</url-pattern> 
</servlet-mapping>