js保存当前路径
曾经做了一个取消订单的功能。这个功能在个人中心里面有,在订单的详细页面也有。按照正常的思路,这两块都可以提交到相同的action去处理,但是返回的页面是不一样的,都是返回到当前页面就可以了。简单地说,就是在个人中心页面,该客户点击取消订单,提交到某个action,进行数据库的操作,将一张表中的字段值改变,然后重新返回到个人中心页面,只是那里的“取消”按钮变成了灰色的“已取消”就OK了,而在订单的详细页面,也是相同的,提交到相同的acion,但是返回页面不是个人中心页面,而是订单的详细页面。
这时候可以考虑用js保存当前路径,写到cookie中,在acion中获取到该路径,通过get/set方法,只需要在<result></result>中写上该路径的el表达式就行了。
代码如下:
<script type="text/javascript"> function saveUrlAndGo(url, form) { document.cookie = "returnUrl=" + escape(location.pathname + location.search); if (form) { form.action = url; form.submit(); } else { location.href = url; } } </script>
因此只要在action中配置好returnUrl,就可以很方便地解决这个问题,而不必写两个action了。
java代码如下:
action读取cookie
public String getReturnUrl()
{
HttpServletRequest request = ExecuteContext.getContext().getHttpContext().getRequest();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("returnUrl".equalsIgnoreCase(cookie.getName())) {
String context = request.getContextPath();
String value = cookie.getValue();
if ((TextUtils.isNotEmpty(context)) && (value.startsWith(context)))
value = value.substring(context.length());
try
{
return URLDecoder.decode(value, "UTF-8");
} catch (UnsupportedEncodingException e) {
return value;
}
}
}
}
return null;
}
这里做了一下判断,因为可能会有不同的目录存入cookie,因此要拿到当前的目录。
ExecuteContext这个类在我们公司是一个公共类,它的代码如下:
代码
public class ExecuteContext
{
private static final ThreadLocal threadLocal = new ThreadLocal();
private HttpContext httpContext;
private IdentityContext identityContext;
ExecuteContext(HttpContext httpContext, IdentityContext identityContext)
{
this.httpContext = httpContext;
this.identityContext = identityContext;
}
public static ExecuteContext getContext() {
return (ExecuteContext)threadLocal.get();
}
public static void setContext(ExecuteContext context) {
threadLocal.set(context);
}
public IdentityContext getIdentityContext() {
return this.identityContext;
}
public HttpContext getHttpContext() {
return this.httpContext;
}
}