[Tapestry4] 修改cookie时,必须跳转么? Form button提交的listener和button的onclick谁先执行?
baggiogamp
2007-04-13
我在一个Listener中修改cookie中的值,开始一直都改不了,后来才知道就是因为那个确定按钮的onclick调用了一个js函数(负责跳转到登陆页面)。我设断点跟踪,无论有没有js函数,都会运行Listener方法的代码,但如果加入该js函数对cookie的设置就不起作用(反之,则运行正常)。这是为什么啊?
js代码 function logOutForChangeSkin(){ //window.parent.location.href = "app"; } .html <select jwcid="userSkinSelection" style="width:100px" ></select> .page <component id="userSkinSelection" type="PropertySelection"> <binding name="value" value="selectedSkin"/> <binding name="model" value="skinModel"/> </component> .java public void changeLocale(IRequestCycle cycle){ /* 其他操作*/ if(getSelectedSkin() != null){ if(userService.setUserSkin(userId,getSelectedSkin().getSkinId())){ sysConfig.put(SYSTEM_CSS_URL, getSelectedSkin().getURL());//add by wangbo 鏇存敼鐢ㄦ埛鐨偆 } } boolean hasCookie = false; Cookie[] cookies = cycle.getRequestContext().getRequest().getCookies(); if(cookies != null){ if("NOTFOUNDED".equals((CookieUtils.getCookieValue(cookies,"LMS_HOME_CSSURL","NOTFOUNDED")))){ LongLivedCookie newCookie = new LongLivedCookie("LMS_HOME_CSSURL",getSelectedSkin().getURL()); cycle.getRequestContext().getResponse().addCookie(newCookie); }else{ hasCookie = true; LongLivedCookie newCookie = new LongLivedCookie("LMS_HOME_CSSURL",getSelectedSkin().getURL()); cycle.getRequestContext().getResponse().addCookie(newCookie); } }else{ LongLivedCookie newCookie = new LongLivedCookie("LMS_HOME_CSSURL",getSelectedSkin().getURL()); cycle.getRequestContext().getResponse().addCookie(newCookie); } /* =============================*/ } 我得出的结论是这样的:如果这个页面能顺利运行完(即不调用JS函数)可以实现修改cookie, 如果调用js函数跳转页面,则不能实现对cookie的修改 是不是对cookie的修改要到下个页面才生效啊? |
|
baggiogamp
2007-04-16
这人怎么这么少啊!
|
|
tapestry
2007-04-16
cookie本来就是在response的时候加到客户本地浏览器里的呀
cycle.getRequestContext().getResponse().addCookie(newCookie); |
|
baggiogamp
2007-04-17
tapestry 写道 cookie本来就是在response的时候加到客户本地浏览器里的呀
cycle.getRequestContext().getResponse().addCookie(newCookie); 我问的是: 在那个按钮的onclick=function b() (js方法);按钮的lietener 为void c()(java方法) 我点击按钮时,两个方法都被执行了(设置断点看过了)。 function b(){ window.parent.location = "/app"; //跳转到登陆页面 } 如果把上面这个方法(b)去掉,或者方法体为空,运行的结果都正确(可以对cookie惊醒修改),但加上window.parent.location = "/app"; 怎么就不行了呢? |
|
tapestry
2007-04-17
不知道你为什么这么做,能说说你想实现的功能么。
我认为window.parent.location = "/app"; 重新改变了请求,上一次的请求根本没来的急reponse,个人观点。 |
|
baggiogamp
2007-04-18
要实现的功能是这样的:
换肤,把用户皮肤的路径(css文件路径)存储在cookie中。 在换肤功能页面的listener方法中改变cookie中的数据,同时把页面切换到登陆页面让用户重新登陆。因为这个换肤的页面是在一个iframe中的,所以换的只是这个页面的皮肤,没有改变(刷新)iframe外的页面。所以让iframe外的页面跳转到登陆页面。 我现在想到的解决方案是:在listener中跳转到另一个提示成功页面,在那个页面在跳转,这样就没问题了。就是不明白原来的的错在哪。。 |
|
tapestry
2007-04-18
Tapestry中对cookie的封装
@InjectObject("infrastructure:cookieSource") public abstract CookieSource getCookieSource(); getCookieSource().writeCookieValue("name", "value", MAX_COOKIE_AGE); 提示成功页面response出来应该就可以写cookie,然后你可以设定5秒跳转,具体方法google一下,写meta的。 |
|
baggiogamp
2007-04-19
呵呵....谢谢拉!
但我原来的那种做法为什么不好用呢?明名跟踪到了:response.addCookie(c)了.这段代码走过就应该改变cookie的value了吧?为什么加那段js就不好用了呢?还是不太懂.. 没道理啊! |