hushangjie 2008-06-30
我在SSH框架遇到一些的问题
有很多是网上找的答案!@
包的冲突
1.去掉类路径上的关于Hibernate的3个lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
2.加入Spring中的以下4个lib
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
cglib-nodep-2.1_3.jar
Spring和Hibernate共用的一些jar文件发生了版本冲突,删除WEB-INF/lib/asm-2.2.3.jar然后重启Tomcat.
asm-2.2.3.jar
asm.jar
asm-attrs.jar
asm-commons-2.2.3.jar
asm-util-2.2.3.jar
解决办法是:
1.去掉类路径上的关于Hibernate的3个lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
2.加入Spring中的以下4个lib
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
cglib-nodep-2.1_3.jar
Tomcat的Debug报错
SourcenotfoundforWebappClassLoader.loadClass
SourcenotfoundforSystemLogHandler.findStream()line:123
将设置里的tomcat--advanced--addjavaprojectstotomcatclasspath在你相应的项目名前打勾,Source
notfound.......的问题自会解决!
注意struts-config.xml的Type路径
在struts-config.xml里的每个action声明时type="org.springframework.web.struts.DelegatingActionProxy"
如下:
<action
attribute="regForm"
input="/WEB-IN地/page/reg.jsp"
name="regForm"
path="/reg"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy">
<forwardname="suc"path="/WEB-INF/page/suc.jsp"/>
<forwardname="false"path="/WEB-INF/page/err.jsp"/>
</action>
3种解决重复提交问题
1<scriptlanguage="javascript">
varcheckSubmitFlg=false;
functioncheckSubmit(){
if(checkSubmitFlg==true){
returnfalse;
}
checkSubmitFlg=true;
returntrue;
}
document.ondblclick=functiondocondblclick(){
window.event.returnValue=false;
}
document.onclick=functiondoconclick(){
if(checkSubmitFlg){
window.event.returnValue=false;
}
}
</script>
<html:formaction="myAction.do"method="post"onsubmit="returncheckSubmit();">
2还是javascript,将提交按钮或者image置为disable
<html:formaction="myAction.do"method="post"
onsubmit="getElById('submitInput').disabled=true;returntrue;">
<html:imagestyleid="submitInput"src="images/ok_b.gif"border="0"/>
</html:form>
3利用struts的同步令牌机制
利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。
基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
if(isTokenValid(request,true)){
//yourcodehere
returnmapping.findForward("success");
}else{
saveToken(request);
returnmapping.findForward("submitagain");
}
Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor类中的generateToken()方法。
1.//验证事务控制令牌,<html:form>会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
2.在action中:
//<inputtype="hidden"name="org.apache.struts.taglib.html.TOKEN"
//value="6aa35341f25184fd996c4c918255c3ae">
if(!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,
newActionError("error.transaction.token"));
resetToken(request);//删除session中的令牌
3.action有这样的一个方法生成令牌
protectedStringgenerateToken(HttpServletRequestrequest){
HttpSessionsession=request.getSession();
try{
byteid[]=session.getId().getBytes();
bytenow[]=
newLong(System.currentTimeMillis()).toString().getBytes();
MessageDigestmd=MessageDigest.getInstance("MD5");
md.update(id);
md.update(now);
return(toHex(md.digest()));
}catch(IllegalStateExceptione){
return(null);
}catch(NoSuchAlgorithmExceptione){
return(null);
}
}
-- 创建了一个 bean 名称自动代理,它描述如何应用拦截器。还有其他的方法定义拦截点,但是这种方法常见而简便。-- 将 Struts 动作注册为将被拦截的 bean。如果您想要拦截其他的 Stru