用dwr實現在表單存儲的功能,dwr與spring的結合使用上遇上了些問題,先把應用步驟記錄下來吧:
1.dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "
http://www.getahead.ltd.uk/dwr/dwr10.dtd
">
<dwr>
??? <allow>?????
??????? <create creator="spring" javascript="FormDataDwrUtil">???
?????? <param name="beanName" value="formDataDwrUtil"/> ???////配置成spring,會從spring中去找到這個bean
??????? </create>
?? </allow>?
??
<signatures>
? <![CDATA[
? import java.util.Map;?
? ]]>
</signatures>
</dwr>
2.applicationContext.xml 片段
<bean id="formDataDwrUtil" class="com.odp.web.dwr.FormDataDwrUtil">
??<property name="formInstanceDao">
????? <ref bean="formInstanceDao"/>
??? </property>
?</bean>
3.web.xml? 片段
?
<servlet>
??????? <servlet-name>context</servlet-name>
??????? <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
??????? <load-on-startup>1</load-on-startup>
? </servlet>
? <servlet>
??????? <servlet-name>dwr-invoker</servlet-name>
??????? <display-name>DWR Servlet</display-name>
??????? <description>Direct Web Remoter Servlet</description>
??????? <servlet-class>uk.ltd.getahead.dwr.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>
?? 4.jsp引用
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/interface/FormDataDwrUtil.js'></script>
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/engine.js'></script>
<script type='text/javascript' src='<%=request.getContextPath()%>/xx/js/dwr/util.js'></script>?
<!--將包中js直接拿出來用了, 做了一些修改以滿足實際需求-->
<script>
?? var formdata;
? function saveItem(){???
? ?DWRUtil.getMapValues(formdata);???? //將form表單中的數據組織成map賦給formdata
????FormDataDwrUtil.saveValues(aftersave, formdata);? ?? //調用java代碼存儲數據
? }?
? function aftersave(result){???????
//回調方法,顯示保存結果
???if( result? != null ){
? ??parent.setInstanceId(""+result);
? ??document.getElementById("msg").innerHTML = "<font color='red' size='2px'>保存成功!</font>";
? ??document.getElementById("save").style.display = "none";
? ??//document.getElementById("print").style.display="block";
? ??//document.getElementById("printpreview").style.display="block";
? ?}else{
? ??document.getElementById("msg").innerHTML = "<font color='red' size='2px'>保存失敗!</font>";
? ?}
? }
??
/**
?*? 根據參數找到指定的表單數據組織成map
*/
? function findItem(instanceId , tablename){??????????
??? DWRUtil.useLoadingMessage("loading.....");
? ?FormDataDwrUtil.getFormData(loadItem , instanceId , tablename);
? }
/**
*回調方法,將數據填充到表單中
*/
? function loadItem(pformdata){
??? formdata = pformdata;
? ?DWRUtil.setValues( pformdata );
?? }
?
ok,能正常使用,正常保存數據,加載數據了.
問題出現了,當我改變了應用中類,weblogic會自動重載,spring重新裝載數據、類,所有的東西都不受影響,dwr這里卻出了問題,錯誤如下:
???
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoade
rListener registered?
??????? at org.springframework.web.servlet.support.RequestContextUtils.getWebApp
licationContext(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletContext;)Lor
g/springframework/web/context/WebApplicationContext;(RequestContextUtils.java:83
)
??????? at uk.ltd.getahead.dwr.create.SpringCreator.getBeanFactory()Lorg/springf
ramework/beans/factory/BeanFactory;(SpringCreator.java:174)
??????? at uk.ltd.getahead.dwr.create.SpringCreator.getInstance()Ljava/lang/Obje
ct;(SpringCreator.java:131)
??????? at uk.ltd.getahead.dwr.create.SpringCreator.getType()Ljava/lang/Class;(S
pringCreator.java:104)
??????? at uk.ltd.getahead.dwr.impl.DefaultInterfaceProcessor.handle(Ljavax/serv
let/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V(DefaultIn
terfaceProcessor.java:69)
??????? at uk.ltd.getahead.dwr.impl.DefaultProcessor.handle(Ljavax/servlet/http/
HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V(DefaultProcessor.j
ava:77)
??????? at uk.ltd.getahead.dwr.AbstractDWRServlet.doPost(Ljavax/servlet/http/Htt
pServletRequest;Ljavax/servlet/http/HttpServletResponse;)V(AbstractDWRServlet.ja
va:162)
??????? at uk.ltd.getahead.dwr.AbstractDWRServlet.doGet(Ljavax/servlet/http/Http
ServletRequest;Ljavax/servlet/http/HttpServletResponse;)V(AbstractDWRServlet.jav
a:149)
??????? at javax.servlet.http.HttpServlet.service(Ljavax/servlet/http/HttpServle
tRequest;Ljavax/servlet/http/HttpServletResponse;)V(HttpServlet.java:740)
??????? at javax.servlet.http.HttpServlet.service(Ljavax/servlet/ServletRequest;
Ljavax/servlet/ServletResponse;)V(HttpServlet.java:853)
??????? at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run
()Ljava/lang/Object;(ServletStubImpl.java:1072)
??????? at weblogic.servlet.internal.ServletStubImpl.invokeServlet(Ljavax/servle
t/ServletRequest;Ljavax/servlet/ServletResponse;Lweblogic/servlet/internal/Filte
rChainImpl;)V(ServletStubImpl.java:465)
??????? at weblogic.servlet.internal.TailFilter.doFilter(Ljavax/servlet/ServletR
equest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V(TailFilter.j
ava:28)
??????? at weblogic.servlet.internal.FilterChainImpl.doFilter(Ljavax/servlet/Ser
vletRequest;Ljavax/servlet/ServletResponse;)V(FilterChainImpl.java:27)
??????? at com.matrixflow.client.RequestEncoderFilter.doFilter(Ljavax/servlet/Se
rvletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V(Reques
tEncoderFilter.java:34)
??????? at weblogic.servlet.internal.FilterChainImpl.doFilter(Ljavax/servlet/Ser
vletRequest;Ljavax/servlet/ServletResponse;)V(FilterChainImpl.java:27)
??????? at weblogic.servlet.internal.WebAppServletContext$ServletInvocationActio
n.run()Ljava/lang/Object;(WebAppServletContext.java:6987)
??????? at weblogic.security.acl.internal.AuthenticatedSubject.doAs(Lweblogic/se
curity/subject/AbstractSubject;Ljava/security/PrivilegedAction;)Ljava/lang/Objec
t;(AuthenticatedSubject.java:321)
??????? at weblogic.security.service.SecurityManager.runAs(Lweblogic/security/ac
l/internal/AuthenticatedSubject;Lweblogic/security/acl/internal/AuthenticatedSub
ject;Ljava/security/PrivilegedAction;)Ljava/lang/Object;(SecurityManager.java:12
1)
??????? at weblogic.servlet.internal.WebAppServletContext.invokeServlet(Lweblogi
c/servlet/internal/ServletRequestImpl;Lweblogic/servlet/internal/ServletResponse
Impl;)V(WebAppServletContext.java:3892)
??????? at weblogic.servlet.internal.ServletRequestImpl.execute(Lweblogic/kernel
/ExecuteThread;)V(ServletRequestImpl.java:2766)
??????? at weblogic.kernel.ExecuteThread.execute(Lweblogic/kernel/ExecuteRequest
;)V(ExecuteThread.java:224)
??????? at weblogic.kernel.ExecuteThread.run()V(ExecuteThread.java:183)
??????? at java.lang.Thread.startThreadFromVM(Ljava/lang/Thread;)V(Unknown Sourc
e)
>
在web.xml? 片段里將下面這段改成Listener也不行,錯誤一樣
? <servlet>
??????? <servlet-name>context</servlet-name>
??????? <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
??????? <load-on-startup>1</load-on-startup>
? </servlet>
現在的解決方法是: 重啟weblogic? 這肯定不是解決的問題的根本。 希望能找到問題所在.......?