从某些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
为空。
答案 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,则不能引用Resource
或Page
您需要定义与页面组件匹配的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) {
}