如何在cq5中设置会话属性

时间:2015-06-18 04:27:43

标签: java jsp cq5 aem sling

我是cq5的新手,请帮助!! 我试图在session属性中设置hashmap。但由于某种原因,我得到JSP无法编译。 请帮忙!!

   <%@include file="/apps/test/test2/global.jsp"%>
         <%@page session="false"
          import="org.apache.sling.api.resource.ValueMap,
                  com.day.cq.wcm.api.WCMMode,
                  com.day.cq.dam.scene7.api.net.NetUtils,
                  org.apache.commons.lang.StringUtils,
                  javax.jcr.Session,
                  org.apache.jackrabbit.api.security.user.UserManager,
                  org.apache.jackrabbit.api.security.user.Authorizable"  %>

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


      <%
         Session session = resourceResolver.adaptTo(Session.class);
         Map<String, String> sessionValues = new HashMap<String, String>(); 

        for(int i=0;i<5;i++)
        {
          sessionValues.put("Id"+i, properties.get("test:Id"+i, "")); 
          sessionValues.put("Url"+i,properties.get("test:Url"+i,""));    
         }
       // put the hashmap as session    
         session.setAttribute("map", sessionValues);

         %>

2 个答案:

答案 0 :(得分:5)

您拥有的Session是一个存储库会话,它与HTTP Session非常不同。 Javax.jcr.Session是您访问内容存储库的门户。它不用于存储与会话相关的属性,也没有任何setAttribute方法。它用于读取和写入存储库(http://jackrabbit.apache.org/jcr/how-jackrabbit-works.html)。如果您要查找的只是一个http会话,那么您应该从slingRequest获取它。

但是,如果您使用http会话,则无法在调度程序中缓存页面(https://forums.adobe.com/thread/960708

答案 1 :(得分:1)

如前所述,您使用的是错误的会话。除此之外,它们是不同的用例,它取决于你想要实现的目标。如果您在请求有效期内尝试在不同组件之间共享属性,则可以set a servlet request attribute

request.setAttribute(name, value)

请求完成后,将重置此属性。 如果要在用户会话中保留数据,则可以使用请求中提供的http会话对象:

request.getSession().setAttribute(name, value)