Spring MVC, плитка, несколько контроллеров - PullRequest
2 голосов
/ 16 мая 2011

Я экспериментирую с Spring MVC для будущего проекта.Мне понадобятся веб-страницы в приложении, чтобы отобразить несколько повторно используемых «компонентов», и решил, что Tiles должен помочь мне в этом?Каждый компонент будет иметь свой собственный контроллер.

Пример, который я собрал, работает только частично.Это страница с 3 плитками.Третья плитка имеет контроллер, который пытается вернуть клиенту ArrayList (через аннотацию @ModelAttribute), но ArrayList пуст, когда представление включено в качестве плитки.

Вот настройка плиток в * -сервлете.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>

Вот мой конфиг плиток (tile.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» - это то, что привязано к методу контроллера, но возвращается пустым, когда это представление включено в виде плитки.

<%@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» заполняется, только когда он добавляется как тайл, он ничего не возвращает.

Ответы [ 2 ]

1 голос
/ 23 июня 2013

Шаблон, который я нашел великолепным, при этом использует 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 от контроллера Spring с использованием Jackson http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

1 голос
/ 16 мая 2011

Плитки дают только составное представление, а в Spring MVC контроллер может вернуть только одно представление, в этом случае одна страница, определенная плиткой, будет возвращена одним контроллером.

У меня нетБольшой опыт работы с конфигурацией плиток, но то, что вы пытаетесь достичь, возможно только в том случае, если вы можете иметь сопоставленные с контроллером URL (а не JSP) в качестве элементов плиток, так что процессор плиток будет вызывать пружинные контроллеры для каждого из компонентов".

Но так как вы говорите о компонентах и, похоже, они вам здесь нужны, почему бы не начать с компонентно-ориентированной среды (например, Wicket можно легко интегрировать с Spring из коробки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...