如何在Sling servlet中将sling.servlet.resourceTypes设置为相对于自身路径(到servlet资源的路径)?

3
如果我提问方式不正确,那么我将首先说明我想要实现的目标:
我在CQ5中有一个组件结构: /apps/TEST/components/DatabaseConnection(DatabaseConnection是组件名称) /apps/TEST/components/DatabaseConnection/src/ServletDatabaseConnection (这是我的servlet,用于处理来自TEST/components/DatabaseConnection的POST请求。)
在我的servlet中,sling.servlet.resourceTypes设置为TEST/components/DatabaseConnection。
因此,我已经设置了sling.servlet.resourceTypes的相对路径,servlet将查找位于/apps/TEST/components/DatabaseConnection和/libs/TEST/components/DatabaseConnection/下的资源类型。
但是,我希望能够将我的组件DatabaseConnection移动到任何其他文件夹中,而不需要在servlet或应用程序中更改任何内容。但是,如果我现在这样做,我将不得不将sling.servlet.resourceTypes更改为新的资源类型。
考虑到Sling中的一切都是资源,那么我的servlet也是一个资源,对吗?因此,可能可以将sling.servlet.resourceTypes相对地设置为servlet的资源类型?
那么,我能否相对于此servlet的资源类型设置sling.servlet.resourceTypes?如果不能,是否有其他方法使我的组件“可移动”,以便我无需在servlet中更改任何内容?
我发现这两个资源非常有用: http://www.pro-vision.de/content/medialib/pro-vision/production/adaptto/2012/adaptto2012-apache-sling-basic-concepts-rainer-bartl-peter-manne/_jcr_content/renditions/rendition.file/adaptto2012-apache-sling-basic-concepts-rainer-bartl-peter-mannel.pdf http://sling.apache.org/site/resources.html 但我仍然无法想出解决方法。

像TEST/components/DatabaseConnection这样的资源类型是相对于搜索路径列表(/apps,/libs)的,但是您的servlet源代码所在的位置不会被考虑在内。我猜核心问题是您想要移动组件 - 也许您需要在另一个问题中描述用例,可能有其他方法来解决您的问题。 - Bertrand Delacretaz
2个回答

1

已经过去了7个月,我在查看同事的代码后找到了实现我想要的目标的方法 :)

所以我想让组件和它的servlet可以移动。

为此,我们不需要使用resourceType,而是需要使用sling.servlet.paths。 http://sling.apache.org/documentation/the-sling-engine/servlets.html

为了使其工作,我们需要做三件事情。

1)在我们想要发送到Servlet的表单中设置一些操作。例如:

<form name="name" id="id" action="/someaction/dothis" method="POST">
<button name="submit"> Submit </button>
</form>

2)在servlet中设置sling.servlet.paths。在我们的情况下:

@Component(immediate = true)
@Service(value=javax.servlet.Servlet.class)
@Properties(value = {
@Property(name="sling.servlet.methods", value={ "POST" }),
//
@Property(name="sling.servlet.paths", value={"/someaction/dothis"})
})
public class ServletEvaluation extends SlingAllMethodsServlet {
...
}

3) 在 OSGi 控制台 /system/console/configMgr 中配置 Apache Sling Servlet/Resource Resolver: 将 sling.servlet.path 添加到执行路径中。 在我们的情况下,将执行路径设置为 /someaction。


0

你尝试过使用绝对路径而不是资源类型吗?例如,如果你将路径设置为/bin/TEST/DatabaseConnection,那么资源类型就无关紧要了。


我希望我的servlet与组件在同一个文件夹中。这样,如果我移动组件,servlet的绝对路径也会改变。 "我在CQ5中有一个组件的以下结构:/apps/TEST/components/DatabaseConnection(DatabaseConnection是组件名称)/apps/TEST/components/DatabaseConnection/src/ServletDatabaseConnection。这是我用于处理来自TEST/components/DatabaseConnection的POST请求的servlet。" - Zhenya
其实,我现在认为,即使我设法将路径设置为相对于其资源的servlet,它也不会按预期工作。假设我将整个带有servlet的组件复制到其他应用程序中,并从那里构建一个带有servlet的bundle。它将无法正常工作,因为它将具有相同的名称。 - Zhenya
那第一个捆绑包。所以,现在我认为它不应该这样工作。正确的方式(就我所理解的)是将我的servlet放到某个单独的文件夹中,而不是与我的组件一起。然后我可以配置多个组件来使用它。并且,我可以移动使用它的组件,但仍然必须更改resourceType。长话短说,我认为没有解决我的问题的方法。 - Zhenya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接