6

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

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

4

7 回答 7

4

如果您使用的是 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,您可能需要考虑一个完整的门户解决方案,例如Liferay Portal

于 2008-09-16T13:24:51.553 回答
2

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

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

于 2008-09-16T12:32:20.960 回答
2

我不推荐使用 Portlets,除非您的应用程序确实是一个Web 门户

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

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

于 2009-01-08T19:28:57.037 回答
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);
    }
}
于 2008-09-16T12:45:16.907 回答
1

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

于 2009-07-21T15:33:35.207 回答
0

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

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

于 2008-09-16T12:33:43.407 回答
0

我不是 100% 确定“可重用组件”在这种情况下是什么意思,但如果你的意思是你希望某些常见元素出现在每个页面上,例如横幅、页脚、导航链接等,那么别无所求站点网格。我的团队已经在几个国际化的 Web 应用程序上成功使用了它。

于 2008-09-17T09:04:14.213 回答