我正在尝试使用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时它才会返回任何内容。
答案 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/