Spring MVC,Tiles,Multiple Controllers

时间:2011-05-16 13:59:06

标签: spring-mvc controller tiles modelattribute

我正在尝试使用Spring MVC来完成即将开展的项目。我需要在应用程序中使用一些网页来呈现多个可重用的“组件”,并认为Tiles应该帮助我实现这一目标吗?每个组件都有自己的控制器。

我放在一起的例子只是部分工作。这是一个有3个瓷砖的页面。第3个磁贴有一个控制器,它试图将ArrayList(通过@ModelAttribute注释)返回给客户端,但当视图作为磁贴包含时,ArrayList为空。

这是* -servlet.xml中的tile设置:

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
        <property name="order" value="0"/>
</bean>

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/tiles-config/tiles.xml</value>
            </list>
        </property>
</bean>

<bean id="viewResolver2" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="1" />
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
</bean>

这是我的tiles配置(tiles.xml):

<tiles-definitions>
    <definition name="parent" template="/WEB-INF/jsp/tiles/parent_layout.jsp">
        <put-attribute name="header" value="/WEB-INF/jsp/tiles/header.jsp"/>
        <put-attribute name="body" value=""/>
        <put-attribute name="recordsSection" value=""/>
        <put-attribute name="widgetsSection" value=""/>
    </definition>
        <definition name="_n/list.htm" extends="parent">
            <put-attribute name="recordsSection" value="/WEB-INF/jsp/_n/list.jsp"/>
            <put-attribute name="widgetsSection" value="/WEB-INF/jsp/_n/widgets.jsp"/>
        </definition>
</tiles-definitions>

这是相关磁贴背后的JSP代码。 “widgetsList”表达式是绑定到控制器方法的表达式,但当此视图作为tile包含时返回为空。

<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isELIgnored="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@taglib prefix="display" uri="http://displaytag.sf.net" %>

<h3>Widgets</h3>
<p>widgetsList=${widgetsList}</p>
<div id="displaylist">
    <display:table id="items" name="${widgetsList}" cellspacing="0" export="true">
        <display:column title="Widget ID" property="widgetId"/>
        <display:column title="Widget Name" property="widgetName"/>
        <display:column title="Widget State" property="widgetState"/>
    </display:table>
</div>

这是控制器:

@Controller
public class WidgetController {

    @Autowired
    private WidgetDaoImpl widgetDao = new WidgetDaoImpl();

    @RequestMapping("_n/widgets.htm")
    public String widgets() {
        return "_n/widgets.htm";
    }

    @ModelAttribute("widgetsList")
    public ArrayList<Widget> getWidgets() {
        System.out.println("executing getWidgets()");
        ArrayList<Widget> records = widgetDao.listWidgets();
        return records;
    }
}

当我直接访问视图“widgets.jsp”时,会填充“widgetsList”属性,只有当它被添加为tile时它才会返回任何内容。

2 个答案:

答案 0 :(得分:1)

Tiles只提供一个复合视图,使用Spring MVC,控制器只能返回一个视图,在这种情况下,整个tile定义的页面将由一个控制器返回。

我对tile配置没有太多经验,但是你想要实现的只有你可以将控制器映射的URL(而不是JSP)作为tile元素才能实现,这样tile处理器就会调用每个“组件”的弹簧控制器。

但是既然你在谈论组件并且你似乎在这里需要它们,为什么不从面向组件的框架开始(例如Wicket可以很容易地与Spring开箱即用)。

答案 1 :(得分:1)

我发现很好的模式,这是使用jQuery,ajax和json与tile。在您希望小部件的页面上包含一个标记div,如

<div id="displayWidgets"></> 

使用jQuery在页面加载时检查此div,如果存在,请对控制器执行json调用以获取此内容。 这种方法很棒,因为当您在下面包含javascript时,每个页面的控制器不需要知道除了它自己之外的任何模型信息。我使用它来填充动态的页眉和页脚等常见信息。

$.ready(){
    if($('div#displayWidgets')){
         $.getJSON('/widgetsList', function(data) {
             //loop over json and create your html, url below has great examples
         }
    }
}

http://api.jquery.com/jQuery.getJSON/ 来自Spring控制器的Json教程使用jackson http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/