【问题标题】:What's the best way to make a modular java web application [closed]制作模块化Java Web应用程序的最佳方法是什么[关闭]
【发布时间】:2010-09-09 11:00:37
【问题描述】:

我正在用 Java(带有 JSP 视图的 Spring MVC)构建小型网站,并试图找到制作和包含少数可重用模块(如“最新消息”“即将发生的事件”......)的最佳解决方案。

所以问题是:Portlet、Tile 还是其他一些技术?

【问题讨论】:

    标签: java spring-mvc module


    【解决方案1】:

    我在结合 Ajax JSF (IceFaces) 和 Liferay Portal 使用 portlet 方面有很多经验,我不会向任何人推荐它们 - 阅读教程和实践中的真正地狱时,一切看起来都很好。当然,我认为 Spring MVC 和 JSP 更方便、更轻量级,但无论如何,portlet 并没有得到很好的技术支持。

    【讨论】:

      【解决方案2】:

      我不建议使用 Portlet,除非您的应用程序确实是 web portal

      如果您只想“可重用组件”使用JSP tagfiles,它们非常简单但非常强大,因为它们与常规 JSP 相同。

      我有使用瓷砖的经验,但所涉及的复杂性根本不值得。

      【讨论】:

        【解决方案3】:

        Tapestry 是一个 Java Web 应用程序框架,重点在于轻松创建可重用组件。

        我使用过sitemesh,它适用于将一组页面包装在标准页眉和页脚中,但Tapestry 更适合创建在许多页面上使用的组件,每个页面可能多次使用。 Tapestry 组件可以将其他组件作为参数,这允许 Sitemesh 样式的包装。

        【讨论】:

        【解决方案4】:

        我不能 100% 确定“可重用组件”在这种情况下是什么意思,但如果您的意思是希望某些常见元素出现在每个页面上,例如横幅、页脚、导航链接等,那么请查看不超过SiteMesh。我的团队已在几个国际化 Web 应用程序上成功使用它。

        【讨论】:

          【解决方案5】:

          如果您使用的是 Spring MVC,那么我建议您使用 Portlets。在 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 这个控制器用于 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 容器,例如 eXoSunApache。如果您想将您的应用程序构建为一组 portlet,您可能需要考虑一个完整的 portlal 解决方案,例如 Liferay Portal

          【讨论】:

          • thnx 有用的答案,你有使用 Spring portlets MVC 的经验吗?一些教程,指导?能不能推荐个门户服务器?
          • 开发它们是我的主要工作,所以我有丰富的经验。虽然网上没有太多具体的文档。由于 Porlet 框架几乎是相同的,因此您可以通过遵循 Spring MVC 文档取得相当大的进展。 Liferay 是一个很好的门户,但可能超出您的需要。
          【解决方案6】:

          我是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);
              }
          }
          

          【讨论】:

            【解决方案7】:

            瓷砖可能会很痛苦。与以前相比有很大的改进(即没有),但相当有限。

            Wicket 可能更符合您的要求,除非您已选择 JSP。

            【讨论】:

            • 你能评论一下为什么“瓷砖会很痛苦”吗?
            猜你喜欢
            • 2018-07-07
            • 2023-03-09
            • 2011-05-16
            • 2013-04-06
            • 2010-09-09
            • 1970-01-01
            • 2016-12-26
            • 2015-04-24
            相关资源
            最近更新 更多