Spring MVC视图层的JSP替代品


77

我正在寻找从头开始创建新的应用程序,并且可能会使用Spring MVC和Spring Web Flow。Spring Roo创建的项目使用Spring MVC和Web Flow(可选)。对于视图技术,有哪些好的替代方案?或者采用Spring的JSP和JSTL标签库以及jQuery是可行的选择?


14
对于任何有兴趣的人,我最终都选择了JSP,并且效果非常好。由于jsp标记文件提供了可重用性,并且在spring和jstl中提供了不错的taglib,所以我记得2004年起就没有那么可怕的JSP,因为它包含大量的scriptlet等。
digitaljoel 2011年

请提出替代方案。
praveenpds

1
这是Spring MVC官方文档中的相关部分:View Technologies
informatik01

Answers:


50

在标准Java EE API中,唯一替代JSP的是Facelets。到目前为止(2010年),JSF是唯一本地支持Facelets的MVC框架。

Spring MVC仅支持开箱即用的JSP,但它具有可配置的视图解析器,使您无论如何都可以使用Facelets。其他候选对象是第三方模板框架,例如VelocityFreemarkerThymeleaf,可以将其配置为Spring MVC的视图技术。Spring文档提供了Velocity和Freemarker的集成示例


“到目前为止(2010年),JSF是唯一本地支持Facelets的MVC框架。” 您是说“到目前为止(2010年),Facelets是唯一本地支持JSF MVC框架的视图技术”吗?是不是Facelets的(这是一个视图技术)应该suppport像JSF一个MVC框架?(很抱歉,如果我说的没有意义,那么我对JSF还是很陌生的)。
Utku

自JSF 2.0起,Facelets已包含在JSF本身中。因此,您无需单独安装它。Facelets本身可以与任何其他MVC框架(例如Spring MVC)一起使用,但是您必须手动安装和配置它。
BalusC

53

我最近发现了Thymeleaf

它似乎可以完全替代JSP,并且与Spring MVC集成。模板方法看起来更像HTML,并且可能更适合UI设计人员。他们有一份简短的文章,将两个解决方案并排比较。


3
Thymeleaf本身很棒,但是我喜欢布局方言和布局方言
Filip Spiridonov

为什么在小面膜上使用百里香叶?另外,facelet的模板方法看起来像html等。为什么我们要使用它?根据方面,是什么使它成为一件好事?对我来说“没事”。因此,Java EE最近为模板语言开发了“ facelets”。因此,JSP是旧技术。为什么与他比较?它是旧技术?对不起我的英语不好。
erginduran 2015年

17

我最近开始使用纯HTML和jQuery在Spring MVC中进行演示,仅创建JSON视图。

到目前为止,它运行得很好,即使我必须执行JavaScript工作,它也可以与我的设计师进行更轻松的交互,并且在他进行更改时可以更快地进行周转,因为我不必将他的HTML转换为我的JSP。评审团对现场的整体可维护性尚无定论。


生成的Restful API是否可以处理分页?
Yazan Jaber 2012年

您宁静的api可以做您想做的任何事情。对于分页,只需添加开始和结束或偏移量和页面大小,或获得所需结果所需的任何内容。
digitaljoel 2012年

嗨,我知道这很晚了,但只是提示,Thymeleaf尝试解决您在回答中提到的确切问题(开发人员与设计人员的互动)。那么,可能值得一看。
acdcjunior 2013年

谢谢@acdcjunior。我在SpringOne上的Thymeleaf上进行了一次演示,看起来很有趣而且很自然,直到演示者在他的测试中说Thymeleaf比JSP慢8倍-10倍。
digitaljoel 2013年

是的,确实速度较慢。检查此线程:forum.thymeleaf.org/Performance-issue-td3722763.html。对我来说,这就是我没有盲目投入的原因(因为我通常是为互联网门户开发的,所以),但是对于“ Intranet”应用程序,那些JSF可以接受的应用程序,我觉得百里香也可以。希望它们的性能将来会提高。干杯!
acdcjunior 2013年

16

您可以在Spring MVC上拥有任意数量的视图技术。我有FreeMarker和JSP视图解析器。当我遇到一个在FreeMarker中过于复杂(或者在JSP中更加方便)的视图时,我创建了一个JSP视图。例如,带有JSTL的Spring可以很好地处理表单。为此,我使用了JSP视图,但是对于几乎所有其他内容,我都有FreeMarker视图。

基本上,请参阅Spring MVC文档以了解如何配置多个视图解析器:

<bean name="freeMarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
   <property name="cache" value="true"/>
   <property name="prefix" value=""/>
   <property name="suffix" value=".ftl"/>
   <property name="order" value="1"/> <!--NOTICE THE ORDER-->
</bean>

<bean id="jspViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
    <property name="order" value="2"/> <!--NOTICE THE ORDER-->
</bean>



8

虽然这是一个古老的问题,但我认为我将提供一个新兴的替代方案Scalate

Scalate是模板选项中的强大工具。唯一的问题是Scalate需要很多依赖关系(虽然它需要Scala,但不需要您用Scala编写)。

我目前最喜欢的是确实具有Spring集成的Handlebars.java


有趣的是,它没有列出任何Spring兼容性。您已成功将其与Spring MVC集成吗?
digitaljoel 2012年


@digitaljoel另请参阅在Spring MVC中使用Scalate
arashi01

5

(我以前的回答在这里过时了。)Freemarker至少和Velocity一样好。但是Thymeleaf看起来更加引人注目,再加上布局方言,它可能使sitemesh和tile这样的模板框架变得不必要。对于JSF,Thoughtworks的批评似乎是正确的:

我们继续看到团队在使用JSF(JavaServer Faces)时遇到麻烦,并建议您避免使用此技术。团队似乎选择JSF是因为它是Java EE标准,而没有真正评估编程模型是否适合他们。我们认为JSF有缺陷,因为JSF的编程模型鼓励使用其自身的抽象,而不是完全拥抱底层的Web模型。像ASP.NET Webforms一样,JSF尝试在顶级HTML标记和无状态HTTP协议上创建有状态的组件树。JSF 2.0和2.2的改进,例如无状态视图的引入和GET的推广,都是朝着正确方向迈出的一步,甚至可以承认原始模型存在缺陷,但是我们觉得这太迟了。


为什么是最好的选择?速度检查错误非常糟糕。那为什么更好呢?
亚当·根特

@Adam:这要简单得多,并且不允许scriptlet,我认为这是对JSP的改进。我记得为速度模板编写测试也非常简单。
内森·休斯

3

我同时使用Stripes和Spring。条纹在大多数情况下不会妨碍您,但是我发现,当需要时,条纹会很好地增强Spring的效果。


3

我正在使用速度和Spring MVC。另外,我将应用程序托管在Google的App引擎上,没有任何问题。


3

您还可以在Spring MVC的View层中使用Angular(客户端框架)。


服务器端可以渲染吗?
protoEvangelion

如果我对您的理解正确,那么您想问一下Angular是否进行服务器端重做。从Angular 2.x开始,它提供了此功能。您可以看一下以下参考:服务器端渲染
ddsultan

抱歉,我应该更具体一些。我的意思是有没有办法在Java中在没有Node.js服务器的情况下在服务器端呈现Angular应用程序?
protoEvangelion

1
您可能要检查Java的一个社区项目:Angular UniversalJ。我认为它在后台利用了Node。
ddsultan

2

我的建议是不要看上面大部分内容中未描述的视图框架,因为它会导致回发等问题,这意味着您将无法从该视图技术提交数据并从服务器获取响应。例如验证之类的编辑数据提交,将刷新服务器中的数据。

这是因为以上视图技术中的Java Bean不使用Spring容器生命周期。您将只能将它们用于纯视图示例无状态请求。JSF的示例,您将无法使用回发,因为jsf回发仅在使用jsf生命周期时有效,并且如果您将spring框架JSF视图解析器与spring mvc一起使用,则将无法进行回发,因此您需要替换jsf servlet控制器代替spring mvc控制器。

同样,由于您对整个项目的要求尚不明确,并且如果您不希望回发任何要求,则可以使用上述一些选择。

基于zk框架的zk mvc是写在spring mvc之上的一种示例视图技术,您可以在其中扩展ZK GenericForwardComposer的spring mvc控制器以处理事件。您始终可以使用Spring框架使用Spring来处理这些控制器的生命周期。

您可以在Google上找到类似的其他产品。

该审查基于框架生命周期的高级设计。

祝一切顺利 !!!


2

我认为Tiles可以为您提供帮助。
您可以定义模板并在其中使用JSTL。



1

什么phpj

它可以用作视图模板,也可以从头开始构建Web服务器系统

我制作了phpj,因为我不想一直更新我的应用程序并用tomcat加载它,因此我可以使用类似Apache的配置为我的Web应用程序使用静态位置


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.