【问题标题】:Spring MVC, Tiles, Multiple ControllersSpring MVC、Tiles、多个控制器
【发布时间】:2011-08-26 11:42:27
【问题描述】:

我正在为即将到来的项目试验 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”属性会被填充,只有当它被添加为图块时它才会返回任何内容。

【问题讨论】:

    标签: spring-mvc controller tiles modelattribute


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。我想我正试图把瓷砖做成它不是的东西。似乎此时将基于组件的框架集成到我的项目中可能有点矫枉过正,因为我只需要做这种事情大概六次。我想我的一些控制器类会因此变得非常笨拙。再次感谢!
    【解决方案2】:

    我发现这样做的一个很好的模式是使用 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/ 使用杰克逊的弹簧控制器的Json教程 http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多