将表格发布到CQ5中的页面

时间:2014-04-21 14:28:02

标签: search post cq5 aem

我有一个自定义搜索组件,它会从下拉列表[myParam]中搜索某些参数,并在另一个页面中显示搜索结果。我目前使用默认(GET)表单

<form id="searchForm" action="/content/myWeb/searchResult.html" method="get" target="_blank">

在结果页面中,组件选择请求参数并处理搜索。

我需要将其设为POST提交,以便在URL中看不到搜索参数。但如果我在上面的表格中将其设为method="Post",我会收到此错误:

Status  
500
Message     
javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}myParam
Location    /content/myWeb/searchResult
Parent Location     /content/myWeb
Path    
/path/to/search/page

3 个答案:

答案 0 :(得分:4)

该异常是Sling告诉您无法找到您尝试POST的servlet的偶然方式。在这种情况下,Sling默认为SlingDefaultPostServlet,它尝试将属性(由表单值表示)POST到node / content / myWeb / searchResult。 Sling无法说'#34;我找不到已经注册到您请求的servlet&#34;,所以它只是回到它的默认行为

我假设/ content / myWeb / searchResult是一个cq:Page节点类型。该节点类型非常严格,这就是为什么它告诉您无法添加与表单值对应的属性。

之前有效,因为您对/content/myWeb/searchResult.html的GET请求能够解析并执行。系统可以固有地提供对页面节点的所有GET请求。

现在,由于您正在尝试执行POST,因此需要创建并注册可以处理此POST请求的新servlet。为此,您需要创建SlingPostServlet并将其注册到您的特定路径(不推荐)或特定的选择器/扩展组合(推荐)。该servlet应处理请求参数并使用HTML文档进行响应。

警告......

我刚刚描述的内容将帮助您从技术上构建您所要求的内容。也就是说,我不同意你应该做一个POST以隐藏请求参数的前提。&#34;之所以这么多额外的工作,是因为你正在规避REST的原则,Sling在理论上是为了支持而建立的。您的URL(通过请求路径和参数)应该进行通信&#34;我希望页面位于/ content / myWeb / searchResult,给定条件param1 = x,param2 = y,依此类推&#34;。带请求参数的GET是一个适当的RESTful请求。

我建议你重新考虑一下你要做的事情。围绕RESTful原则构建更复杂的解决方案并不是一种好的做法。

答案 1 :(得分:1)

正如旁注,您始终可以通过吊索servlet解析器检查给定的URL是否绑定到servlet。可通过OSGI控制台或URL访问:

http://localhost:4502/system/console/servletresolver

如果servlet已注册到给定的URL,这至少可以帮助您找到闭包。

答案 2 :(得分:0)

您可以为您的页面创建一个POST.jsp,它可以处理POST请求。

使用POST获取请求是不太安宁,但有​​时它可能很有用。此外,通过POST,调度员不会缓存您的请求。