我正在使用Magnolia开花模块进行申请。 我们每组件有控制器。当我们使用网址通过网络电话发出请求时,我们使用的是网址,而不是我们在控制器中提到的网址。
e.g。
我们有一个名为 successPage 的网页,其网址为/successPage
SuccessPageComponent.java
中的
@RequestMapping(value = "/success", method = RequestMethod.GET)
public String getSuccessPage(HttpServletRequest request) {
..........
..........
return "redirect:successPage" ;
}
当我们使用网址http://localhost:8080/myproject/successPage
时,
页面正在呈现。
当我们使用网址http://localhost:8080/myproject/success
我们收到错误页面
糟糕,您请求的页面不可用。 它的URL不正确或该频道上的页面不可用,即您在桌面浏览器上查看它,但该页面仅在智能手机频道上提供。
所以有些magnolia负责使用相应的url
映射来执行控制器。
因此,我想知道执行Controller方法的玉兰花的内部机制是什么。
如何访问该方法的方式?
我们可以编写自己的控制器并直接通过url
执行它,就像我们在一个简单的SPRING
应用程序中一样。
请提供解释建议。
提前谢谢。
答案 0 :(得分:0)
因此我想知道Magnolia的内部机制是什么 执行一个Controller方法。
如何访问该方法如何调用它?
来自Magnolia Blossom Documentation:
处理程序映射
Spring使用HandlerMappings将请求映射到处理程序(通常是控制器)。 Blossom询问HandlerMappings以了解您如何映射处理程序。您的HandlerMapping需要是继承自AbstractUrlHandlerMapping的类。通常就是这种情况,Spring 2.5+带注释的控制器和BeanNameUrlHandlerMapping都继承自AbstractUrlHandlerMapping。
我们可以编写自己的控制器并直接执行它 正如我们在一个简单的SPRING应用程序中所做的那样。
理论上,您可以将Spring servlet添加到Magnolia的过滤器链中,其中定义了其他servlet config:/server/filters/servlets
并将控制器的uri映射到该servlet。由于在页面呈现开始之前评估servlet,因此将执行servlet而不是页面
我不确定的是你为什么要那样做?将二者结合起来的全部意义在于获得Spring的业务逻辑的权力或声明和执行,以及让编辑者增强页面的可视内容的可能性。通过直接执行,您将失去将Magnolia和Spring结合在一起的优势。
答案 1 :(得分:0)
因此我想知道玉兰花的内在机制是什么 执行一个Controller方法。
在您的模块类中,实例化一个BlossomDispatcherServlet,用于管理用于呈现内容的控制器。这些控制器无法从外部访问,因为servlet容器不了解此servlet。
如何访问该方法如何调用它?
当请求进入时,它由Magnolia渲染引擎处理,该引擎查找要渲染的内容和用于渲染它的模板。此时调用DispatcherServlet以调用控制器。这发生在"伪装"在servlet上调用service()方法时的转发或包含请求。
如果您对实践中的工作方式感兴趣,请查看BlossomTemplateRenderer和BlossomDispatcherServlet的来源。
我们可以编写自己的控制器并直接通过url>执行它吗?正如我们在一个简单的SPRING应用程序中所做的那样。
是的,通过添加一个DispatcherServlet来管理不用于呈现内容的控制器。在your other question about this topic我已经发布了关于如何做到这一点的答案。它也在今天Blossom documentation。