如何在Slingservlet中获取currentPagePath?

时间:2014-07-14 14:08:19

标签: cq5

从某些javascript中,我使用Slingservlet

调用以下("/bin/fooServlet?"+params);
@SlingServlet(paths = "/bin/fooServlet", methods = "GET", metatype = true)
public class FooServlet extends SlingAllMethodsServlet {    
..
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) {
        Session  session = resourceResolver.adaptTo(Session.class);
        Page currentPage = pageManager.getPage(request.getPathInfo());
         String currentPagePath = currentPage.getPath();
...
}

我的问题是:如何获取currentPagePath中当前网页的FooServlet?代码中的currentPagePath为空。

4 个答案:

答案 0 :(得分:2)

正如托马斯所提到的,如果定义一个具有固定路径属性的servlet,则不会引用资源。

实现此目标的一种方法是将页面路径与请求一起传递给servlet。另外CQ.WCM.getPagePath()仅返回/libs/wcm/core/content/siteadmin,因为当前页面是siteadmin,您可能需要稍微调整一下脚本才能访问siteadmin中的选定页面。

要从siteadmin或页面本身获取页面路径,可以使用以下脚本,然后将值传递给servlet以进行进一步处理。

var currentPagePath = null;
/* if accessed via siteadmin */
if(CQ.wcm.SiteAdmin.hasListSelection()) {
    var grid = CQ.wcm.SiteAdmin.getActiveGrid();
    var selections = grid.getSelectionModel().getSelections();

    /*Assuming that you are selecting only one page at a time. */
    currentPagePath = selections[0].id;
} else { /* accessed via page */
    currentPagePath = CQ.WCM.getPagePath();
}

然后你可以使用currentPagePath作为参数之一来调用servlet。

GET /bin/fooServlet?currentPagePath=' + currentPagePath + '&foo=bar';

<强>更新 上面的代码适用于CQ 5.5 +,对于旧版本,您可以使用它。

var currentPagePath = null;
/* if accessed via siteadmin */
if(CQ.wcm.SiteAdmin.hasListSelection()) {
    var grid = CQ.Ext.getCmp(window.CQ_SiteAdmin_id + "-grid");
    if (grid) {
        var selections = grid.getSelectionModel().getSelections();
        currentPagePath = selections[0].id;
    }
} else { /* accessed via page */
    currentPagePath = CQ.WCM.getPagePath();
}

答案 1 :(得分:0)

如果您使用固定的paths属性定义servlet,则不能引用ResourcePage 您需要定义与页面组件匹配的resourceTypes或使用cq:Page,但这对于页面的每个请求都会处于活动状态,如果没有至少一些selectors,则不建议这样做 然后,您可以使用Resource获取request.getResource()。要获得Page,您需要将ResourceResolver调整为PageManager并使用getContainingPage(Resource resource)

查看文档: http://sling.apache.org/documentation/the-sling-engine/servlets.html

答案 2 :(得分:0)

在这种情况下,

request.getPathInfo()可能是/bin/fooServlet?[parameterString],这就是为什么PageManager为其路径返回null的原因 - 从PageManager的角度来看,此位置没有资源。

一个简单的选择是在命中Servlet时发送一个额外的callingPage参数。这样你就可以从参数map中读取它:

GET /bin/fooServlet?foo=bar&callingPage=/en/home.html

void doGet() {
    PageManager pageManager = resourceResolver.adaptTo(PageManager.class);    
    String callingPage = request.getParameter("callingPage");
    String callingPagePath = pageManager.getPage(callingPage).getPath();
}

答案 3 :(得分:0)

我不知道这是不是一个好习惯,但也许你可以使用引用者。

import java.net.URI;
import java.net.URISyntaxException;

try {
    String currentPagePath = new URI(request.getHeader("referer")).getPath();
} catch (java.net.URISyntaxException e) {
}