制作模块化Java Web应用程序的最佳方法是什么

时间:2020-03-05 18:55:46  来源:igfitidea点击:

我正在用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并不是技术支持很好的恕我直言。