2011-05-16 115 views
1

预先感谢任何帮助,因为这让我难倒了。春季MVC,瓷砖,多个控制器

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

我已经把这个例子只是部分的工作。这是一个3瓦的页面。第三个tile有一个控制器试图将一个ArrayList(通过@ModelAttribute注释)返回给客户端,但当视图作为一个tile包含时,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”属性被填充,当它的加入,它返回一个瓦,这只是没有。

感谢这里的任何建议。

回答

1

瓷砖只给你一个复合视图,并与Spring MVC的控制器只能返回一个视图,在这种情况下,整个瓷砖定义的页面将被单独的控制器返回。

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

但因为你正在谈论的组件,你似乎在这里需要他们,为什么不与面向组件的框架开始(检票例如可以很容易地集成春季外的箱子)。

+0

感谢您的答复

$.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的教程。我想我正在试图将瓷砖变成不是的东西。看起来在这个时候将基于组件的框架集成到我的项目中可能会有点矫枉过正,因为我只需要做这种事情,可能会有六次。我想我的一些控制器类会因此而变得相当笨拙。再次感谢! – wannabecoder 2011-05-16 16:57:11

1

的模式,我发现很大的,而这样做,这是使用jQuery,AJAX和JSON瓷砖。在页面上,你希望你的部件包括标记的div像

<div id="displayWidgets"></> 

使用jQuery检查这个div在页面加载,如果它存在,做一个JSON呼叫控制器此内容。 这种方法非常棒,因为当您在下面包含javascript时,每个页面的控制器不需要知道除自己以外的任何模型信息。我使用它来填充常见的信息,例如动态的页眉和页脚。从春天控制器使用杰克逊 http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/