我有一个自定义搜索组件,它会从下拉列表[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
答案 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,调度员不会缓存您的请求。