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

时间:2008-09-16 12:25:46

标签: java spring-mvc module

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

所以问题是:Portlet,瓷砖或其他一些技术?

7 个答案:

答案 0 :(得分:4)

如果您使用的是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这个控制器是用于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

答案 1 :(得分:2)

瓷砖可能是一种痛苦。比以前更好的改进(即没有),而是限制。

Wicket可能更符合您的要求,除非您已经确定了JSP。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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