如何制作一个模块化的Java Web应用程序是最佳方式?

6

我正在使用Java(Spring MVC和JSP视图)构建一个小型网站,并尝试找到最佳解决方案来制作和包含几个可重用的模块(如“最新消息”、“即将举行的活动”等)。

所以问题是:Portlets、tiles还是其他技术?

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


谢谢你的有用回答。你有使用Spring portlets MVC的经验吗?有什么教程、指南可以推荐吗?也许可以推荐一个门户服务器? - moriarty
开发它们是我的主要工作,所以我有丰富的经验。虽然在线上没有太多具体的文档,但你可以通过遵循Spring MVC文档来实现很多,因为Porlet框架几乎相同。Liferay是一个不错的门户网站,但可能超出了你的需求。 - pjesi

2
我不建议使用Portlets,除非你的应用程序真正是一个Web门户
如果你只是想要“可重用组件”,那就使用JSP标签文件,它们非常简单但又极其强大,因为它们与常规JSP相同。
我有使用tiles的经验,涉及到的复杂性根本不值得。

2
瓷砖可能会让人感到棘手。虽然比以前的(即没有)要好得多,但限制较大。
除非您已经决定使用JSP,否则Wicket可能更符合您的需求。

你能否评论一下为什么“瓷砖可能很麻烦”? - matt b

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

1

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


0

我不确定在这个上下文中“可重用组件”是什么意思,但如果你的意思是希望某些常见元素出现在每个页面上,例如横幅、页脚、导航链接等等,那么你可以考虑使用SiteMesh。我的团队已经在几个国际化的Web应用程序中成功地使用了它。


0

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

我曾经使用过Sitemesh,它很适合将一组页面封装在标准头部和底部中,但Tapestry更适合创建在许多页面上可能多次使用的组件。Tapestry组件可以将其他组件作为参数传递,这允许Sitemesh样式的封装。


嗯,Tapestry看起来很有前途...他们有很好的屏幕录像... http://tapestry.apache.org/tapestry5/screencast.html我会去看看的,非常感谢。 - moriarty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接