我们可以直接通过它的URL来调用控制器方法,比如Magnolia中的Spring Controller吗?

时间:2015-05-13 05:31:20

标签: spring-mvc magnolia

我正在使用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应用程序中一样。

请提供解释建议。

提前谢谢。

2 个答案:

答案 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