制作模块化Java Web应用程序的最佳方法是什么
我正在用Java构建小型网站(带有JSP视图的Spring MVC),并试图找到最佳的解决方案以制作并包括一些可重用的模块(例如"最新消息","即将发生的事件" ...)。
所以问题是:Portlet,Tile或者其他技术?
解决方案
回答
瓷砖可能会很痛苦。与之前相比(即没有任何效果)有了很大的改进,但有一定的局限性。
除非我们已经决定使用JSP,否则Wicket可能是我们正在寻找的更多东西。
回答
Tapestry是一个Java Web应用程序框架,着重于轻松创建可重用的组件。
我使用过sitemesh,它适合将一组页面包装在标准的页眉和页脚中,但是Tapestry更好地用于创建在许多页面上使用的组件,每页可能多次。 Tapestry组件可以将其他组件用作参数,从而可以进行Sitemesh样式包装。
回答
我是GWT的忠实粉丝。它使我们可以将组件编写为普通的Java类,然后可以将它们随意插入页面中。整个事情最终被编译为Javascript。
这是一个例子:
public class MyApplication implements EntryPoint, HistoryListener { static final String INIT_STATE = "status"; /** * This is the entry point method. Instantiates the home page. */ public void onModuleLoad () { RootPanel.get ().setStyleName ("root"); initHistorySupport (); } private void initHistorySupport () { History.addHistoryListener (this); // check to see if there are any tokens passed at startup via the browser’s URI String token = History.getToken (); if (token.length () == 0) { onHistoryChanged (INIT_STATE); } else { onHistoryChanged (token); } } /** * Fired when the user clicks the browser's 'back' or 'forward' buttons. * * @param historyToken the token representing the current history state */ public void onHistoryChanged (String historyToken) { RootPanel.get ().clear (); Page page; if (Page1.TOKEN.equalsIgnoreCase (historyToken)) { page = new Page1 (); } else if (Page2.TOKEN.equalsIgnoreCase (historyToken)) { page = new Page2 (); } else if (Page3.TOKEN.equalsIgnoreCase (historyToken)) { page = new Page3 (); } RootPanel.get ().add (page); } }
回答
如果我们使用的是Spring MVC,那么我建议我们使用Portlet。在Spring中,Portlet只是轻量级的控制器,因为它们仅负责整个页面的一部分,并且非常易于编写。如果我们使用的是Spring 2.5,则可以享受新注释支持的所有好处,并且它们通过依赖项注入和整个使用Spring的其他好处都非常适合整个Spring应用程序。
Portlet控制器与Servlet控制器几乎相同,这是一个简单的示例:
@RequestMapping("VIEW") @Controller public class NewsPortlet { private NewsService newsService; @Autowired public NewsPortlet(NewsService newsService) { this.newsService = newsService; } @RequestMapping(method = RequestMethod.GET) public String view(Model model) { model.addAttribute(newsService.getLatests(10)); return "news"; } }
在这里,NewsService将自动注入到控制器中。 view方法将一个List对象添加到模型中,该对象将在JSP中以$ {newsList}的形式提供。 Spring将根据该方法的返回值查找名为news.jsp的视图。 RequestMapping告诉Spring该contoller用于portlet的VIEW模式。
XML配置仅需要指定视图和控制器的位置:
<!-- look for controllers and services here --> <context:component-scan base-package="com.example.news"/> <!-- look for views here --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/news/"/> <property name="suffix" value=".jsp"/> </bean>
如果只想将Portlet嵌入现有应用程序中,则可以捆绑Portlet容器,例如eXo,Sun或者Apache。如果要将应用程序构建为一组Portlet,则可能需要考虑使用完整的Portlal解决方案,例如Liferay Portal。
回答
我不确定100%这种情况下的"可重用组件"是什么意思,但是如果我们想让某些通用元素出现在每个页面上,例如横幅,页脚,导航链接等,那么看起来SiteMesh。我的团队已在几个国际化的Web应用程序上成功使用了它。
回答
我不建议我们使用Portlet,除非应用程序确实是一个Web门户。
如果只想让"可重用组件"使用JSP标记文件,它们就变得简单而强大,因为它们与常规JSP相同。
我有使用磁贴的经验,而涉及的复杂性根本不值得。
回答
我在与Ajax JSF(IceFaces)和Liferay Portal结合使用portlet方面有很多经验,我不会向任何人推荐在阅读教程和实践中一切都不错的人。当然,我认为使用Spring MVC和JSP可以使它们更加方便和轻便,但是无论如何,portlet并不是技术支持很好的恕我直言。