像我们构建乐高一样聚合JSP页面的最佳方式

时间:2011-12-19 20:51:51

标签: java design-patterns servlets requestdispatcher

经过多年基于XML / XSLT的开发后,我来到了java世界,而且我逐渐变得越来越怀疑 - 看起来我在Java web app构建意识形态中缺少一些非常重要的东西。

当我们以xslt方式思考时,这就是我们构建布局的方式:我们在一个XML文件中聚合我们需要的所有数据,这些数据可以转换为html布局。

在一些说明性的基于伪XML的语言中,它看起来像这样:

   <data xmlns:x="..." xmlns:xi="..."> 
      <x:get url="http://ourrestapi.net/rrrrrest" xpath="/rest/rest/rest[2]">
        <x:param name="sortBy" value="desc" />
      </x:get>
      <x:get url="http://ourrestapi.net/userdata">
        <x:guard test="authorized">
         <x:param name="login" value="john" />
        </x:guard>
      </x:get>
      <xi:include href="common.xml" />
  </data>

我想这足以说明这个想法。 所以,这就是我一直试图在servlets / jsp世界中实现的方法。 毫无疑问,问题归结为这个问题,我相信这是一个经典的jsp新手问题:“如何在jsp页面中包含servlet输出?”

正确答案是(如果我错了,请纠正我) - 我不应该。我应该use请求链接。据我所知(再一次,如果我混淆了事实,请纠正我),这意味着我应该调用servletA,它将适当的数据放到当前请求中,然后将它转发给servletB,依此类推。最后,我们重定向到填充了所有属性的页面。

至于我,我可以说出这种方法至少有两个主要困难:

  • 我应该保留重定向的顺序。现在servletA应该重定向到servletB,还是一些,不知道监督对象应该做的工作。
  • 如果我们将所有内容存储在请求属性中,如Strings,如果我们需要参数化servletB调用有关我们在servletA中获得的数据,我们必须提供一些繁琐的序列化/反序列化工作。

所以,我的问题是 - 从几个不同来源向JSP页面添加数据的最佳方法是什么

对不起,如果这些问题对于经验丰富的JSP开发人员来说听起来很愚蠢,事实上java世界真的非常庞大且成熟,所以找出真相并不总是那么容易。

2 个答案:

答案 0 :(得分:0)

我认为servlet链接不是填充请求数据的一种非常流行的方式,特别是使用重定向,因为这会清空您的请求。

通常,无论使用哪种后端框架(通常不再是servlet),都会暴露来自一个或多个服务的数据。

是什么让您认为请求属性需要是字符串?它们可以是您想要的任何类型。请求参数,来自 JSP的数据将是字符串,并且必须使用某种形式的类型转换来从请求参数创建域对象。大多数框架都以这种或那种形式内置了这种功能。

答案 1 :(得分:0)

  

当我们在xslt [.....]中思考时,这是我们构建布局的方式所以,这就是我一直试图在servlets / jsp世界中实现的方法

为什么呢? Java和XSLT是不同的野兽。您是否这样做是因为您的应用程序是以XML为中心的,XSLT为您提供了处理它的能力,还是因为您的大脑在XSLT思维模式中被修复了?

如果您的应用程序的核心是XML并且您的方法合理,那么可以查看应该能够处理XML管道的Apache Cocoon。评论中还提到了一些其他框架,因此我将指出Spring的一个方面:它有XSLT views

如果您的数据不容易转换为XML但是您正在这样做,那么您可以使用XSLT处理它只是因为XSLT比JSP更熟悉,那么您做错了。

至于从多个来源收集数据,servlet / JSP链接并不是一个好主意。这些是低级组件,并且(正如您自己注意到的那样)需要外部协调来创建应用程序工作流。通常,Servlet / JSP由构建在它们之上的Web框架协调。

Java Web框架主要是MVC,因此在MVC中,您将在模型中进行数据收集(模型包含业务逻辑和协调以类似数据),然后将其发送给Controlller,后者将选择适当的View for渲染数据。如果您的数据确实是XML(或者可以轻松转换为XML),那么此时XSLT视图可能有所帮助(JSP实际上并不是为处理XML而设计的)。

正如你自己所说的那样,Java世界“非常,非常巨大和成熟”,所以你可以通过多种方式解决这个问题(即有很多方法可以让猫皮肤化)。需要最终合并JSP片段?如何SitemeshApache Tiles,自定义JSP tags,甚至Portlets ......您可以使用的许多框架,库等。

但无论您最终选择哪种解决方案,只需确保使用Java思维模式来实现它。