2

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

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

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

<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.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”属性被填充,只有当它作为一个平铺添加时它才返回任何内容。

4

2 回答 2

1

我在这样做时发现一个很棒的模式是使用 jQuery、ajax 和 json 和瓷砖。在您希望小部件的页面上包含一个标记 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/ 使用jackson的spring控制器的Json教程 http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

于 2013-06-23T11:40:24.647 回答
1

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

我对切片配置没有太多经验,但是只有当您可以将控制器映射的 URL(而不是 JSP)作为切片元素时,您才能尝试实现,以便切片处理器将调用弹簧控制器每个“组件”。

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

于 2011-05-16T15:38:24.430 回答