将表单提交到 Servlet AEM
Submit form to Servlet AEM
Servlet 代码如下所示
@SlingServlet(
methods = {"POST"},
resourceTypes = {"cq:Page"},
extensions = {"html"})
public class AssetDownloadServlet extends SlingAllMethodsServlet {
private static final Logger log = LoggerFactory.getLogger(AssetDownloadServlet.class);
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
{
log.info("%%%%%%%%%%%%%%$$$$$$$$$$$%%%%%%%**************: "+ "doPost");
processRequest(request,response);
}
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
{
log.info("%%%%%%%%%%%%%%$$$$$$$$$$$%%%%%%%**************: "+ "doGet");
processRequest(request,response);
}
private void processRequest(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException{
log.info("%%%%%%%%%%%%%%$$$$$$$$$$$%%%%%%%*******************");
log.info(request.getParameter("format"));
log.info("%%%%%%%%%%%%%%$$$$$$$$$$$%%%%%%%*******************");
}
}
html 页面中的表单如下所示
<form method="POST">
<fieldset>
<p>Format needed?</p>
<ul style="list-style-type:none" data-sly-list.rendition="${renditions}">
<!--${rendition.path}-->
<li>
<label>
<input type="radio" name="format" value="${rendition.name}" />
<span>${rendition.displayName}</span>
</label>
</li>
</ul>
</fieldset>
<fieldset>
<button type="submit">Start Download</button>
<a>Cancel Download</a>
</fieldset>
</form>
页面上的CQ详情
<!--cq{"decorated":false,"type":"myProject/components/page/generic","path":"/content/myProject/en/assetdetail/jcr:content","selectors":"IRNHUF7D","servlet":"Script /libs/foundation/components/page/page.jsp","totalTime":28,"selfTime":8}-->
总结:
我有一个 cq:page 资源,其中有一个表单和 servlet 链接到它。但是在提交表单时,servlet 并未启动投注。我看到 http://localhost:4502/system/console/ 中的属性设置正确。
请推荐..
谢谢
cq:Page
不是资源类型,它是节点类型。您需要将 servlet 中的 resourceType 修复为页面的 jcr:content
节点中的 sling:resourceType
。另一件需要注意的事情是,如果您的路径指向 cq:Page 节点,则不会调用设置了 resourceType 的 servlet,它需要指向 jcr:content
节点才能被 servlet 拾取。
@SlingServlet(
methods = {"POST"},
resourceTypes = {"path/to/resource/type"},
extensions = {"html"})
public class AssetDownloadServlet extends SlingAllMethodsServlet {
你的表单定义应该是 -
<form method="POST" action="${currentPage.path}/_jcr_content.html">
注意jcr:content
写成_jcr_content
Servlet 代码如下所示
@SlingServlet(
methods = {"POST"},
resourceTypes = {"cq:Page"},
extensions = {"html"})
public class AssetDownloadServlet extends SlingAllMethodsServlet {
private static final Logger log = LoggerFactory.getLogger(AssetDownloadServlet.class);
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
{
log.info("%%%%%%%%%%%%%%$$$$$$$$$$$%%%%%%%**************: "+ "doPost");
processRequest(request,response);
}
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
{
log.info("%%%%%%%%%%%%%%$$$$$$$$$$$%%%%%%%**************: "+ "doGet");
processRequest(request,response);
}
private void processRequest(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException{
log.info("%%%%%%%%%%%%%%$$$$$$$$$$$%%%%%%%*******************");
log.info(request.getParameter("format"));
log.info("%%%%%%%%%%%%%%$$$$$$$$$$$%%%%%%%*******************");
}
}
html 页面中的表单如下所示
<form method="POST">
<fieldset>
<p>Format needed?</p>
<ul style="list-style-type:none" data-sly-list.rendition="${renditions}">
<!--${rendition.path}-->
<li>
<label>
<input type="radio" name="format" value="${rendition.name}" />
<span>${rendition.displayName}</span>
</label>
</li>
</ul>
</fieldset>
<fieldset>
<button type="submit">Start Download</button>
<a>Cancel Download</a>
</fieldset>
</form>
页面上的CQ详情
<!--cq{"decorated":false,"type":"myProject/components/page/generic","path":"/content/myProject/en/assetdetail/jcr:content","selectors":"IRNHUF7D","servlet":"Script /libs/foundation/components/page/page.jsp","totalTime":28,"selfTime":8}-->
总结:
我有一个 cq:page 资源,其中有一个表单和 servlet 链接到它。但是在提交表单时,servlet 并未启动投注。我看到 http://localhost:4502/system/console/ 中的属性设置正确。
请推荐..
谢谢
cq:Page
不是资源类型,它是节点类型。您需要将 servlet 中的 resourceType 修复为页面的 jcr:content
节点中的 sling:resourceType
。另一件需要注意的事情是,如果您的路径指向 cq:Page 节点,则不会调用设置了 resourceType 的 servlet,它需要指向 jcr:content
节点才能被 servlet 拾取。
@SlingServlet(
methods = {"POST"},
resourceTypes = {"path/to/resource/type"},
extensions = {"html"})
public class AssetDownloadServlet extends SlingAllMethodsServlet {
你的表单定义应该是 -
<form method="POST" action="${currentPage.path}/_jcr_content.html">
注意jcr:content
写成_jcr_content