Servlets 将表单提交到Servlet CQ5

Servlets 将表单提交到Servlet CQ5,servlets,aem,sling,Servlets,Aem,Sling,我创建了一个Servlet调用ShippingDetailsServlet.java并部署了它。我需要提交一个HTML表单到它。我不确定我应该以行动的形式提出什么途径。以下是表格 <form action="/services/mycompany/ShippingDetailsServlet" method="post"> Country: <input type="text" name="country" value="au"><br> Quantity:

我创建了一个Servlet调用ShippingDetailsServlet.java并部署了它。我需要提交一个HTML表单到它。我不确定我应该以行动的形式提出什么途径。以下是表格

<form action="/services/mycompany/ShippingDetailsServlet" method="post">
Country: <input type="text" name="country" value="au"><br>
Quantity: <input type="text" name="quantity" value="1">
<cq:include path="./submit" resourceType="foundation/components/form/submit" />

默认情况下,servlet只能部署在/bin路径下。不要将尾随/添加到路径,也不要添加任何其他属性。例如,使用以下注释:

@SlingServlet(paths={"/bin/services/mycompany"})
public class ShippingDetailsServlet extends SlingAllMethodsServlet
表单中的路径应与@SlingServlet中的路径相同:


如果确实希望在/bin之外创建servlet,则需要在/system/console/configMgr控制台中的apacheslingservlet/Script解析器和错误处理程序配置页面中向执行路径属性添加适当的路径

这不一定是真的。您可以在自定义路径上部署Servlet,但是为了做到这一点,您需要修改apacheslingservlet/Script解析器和错误处理程序,并将自定义路径添加到执行路径部分


此外,如果要将此表单部署到发布实例,您可能需要使用/bin/以外的自定义路径,因为CQ有许多在/bin下注册的管理servlet,将它们公开可能会带来安全问题。

答案如下

如果您对servlet进行了如下注释:

@SlingServlet(methods = { "POST" }, paths = "/apps/mycompany/servlets/GenericServlet")
表单应该发布到路径中相同的url,即/apps/mycompany/servlet/GenericServlet

因此,如果您将servlet中的路径行更改为/services/mycompany/ShippingDetailsServlet
该表单将发布到该表单。

我认为您应该让OP知道在哪里配置Apache Sling Servlet/Script解析器,错误处理程序正在运行http://localhost:4502/system/console/configMgr :DGood调用:。很抱歉,我遗漏了控制台链接。请注意,在路径上安装Sling servlet是次优的,因为您无法在这些路径上设置特定的访问控制规则。更好的方法是让servlet处理特定的sling:resource类型和HTTP方法,并创建一个资源,您可以使用相同的sling:resourceType在其上设置访问控制。
<form action="/bin/services/mycompany" method="post">
@SlingServlet(methods = { "POST" }, paths = "/apps/mycompany/servlets/GenericServlet")