застрял при попытке отобразить ответ gsp html из данных, а не из доменных объектов - PullRequest
0 голосов
/ 02 октября 2018
Сценарий

- я написал API, который начал свою жизнь как набор API ответов на запросы json, используя vertx модель db памяти.Работает нормально.

тогда кто-то хотел хороший дисплей HTML, чтобы увидеть часть содержимого в этом приложении.

Так что я создал приложение grails, чтобы попытаться сделать для меня простые представления лесов - ноКонечно, нет никакой доменной модели как таковой.

Я создал remoteRequestController - который вызывает службу, которая вызывает json, входит в мое «основное приложение» и преобразует данные в объекты.

, так что для моегоперечисление запросов - я делаю GET и возвращаю массив json.Я преобразовываю этот список в локальные объекты «не в домене» и строю график в объектах с результатом

Мой сервис возвращает список моему контроллеру, который пытается поместить карту в представление.

Я попытался следовать соглашению Грааля - мой контроллер называется RemoteServiceRequestController, который вызывает RemoteServiceRequestService (выполняет удаленное получение / ответ и форматирование в объекты) - и представление находится в «remoteServiceRequest / list» с использованием переменнойвот так 'remoteServiceRequestList'

в этом gsp я ссылаюсь на элемент из карты модели 'remoteServiceRequestList'

<!DOCTYPE html>
<html>
    <head>
        <meta name="layout" content="main" />
        <g:set var="entityName" value="${message(code: 'request.label', default: 'ServiceRequest')}" />
        <title><g:message code="default.list.label" args="[entityName]" /></title>
    </head>
    <body>
        <a href="#list-customer" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content&hellip;"/></a>
        <div class="nav" role="navigation">
            <ul>
                <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li>
                <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>
            </ul>
        </div>
        <div id="list-request" class="content scaffold-list" role="main">
            <h1><g:message code="default.list.label" args="[entityName]" /></h1>
            <g:if test="${flash.message}">
                <div class="message" role="status">${flash.message}</div>
            </g:if>
            <p> "got map as ${params}: and" + "list as ${remoteServiceRequestCount}"</p>
            <f:table collection="${remoteServiceRequestList}" />

            <div class="pagination">
                <g:paginate total="${remoteServiceRequestCount ?: 0}" />
            </div>
        </div>
    </body>
</html>

в моем контроллере я пытаюсь сделать ответ, подобный этому

def list () { 
.... 
   List<Request> rlist = remoteRequestService.bindJsonToServiceRequestList(json)

        //return either an empty list or result of query, view will convert list to
        println "remote list returned $rlist, size :${rlist.size()}"
        //response rlist, [model: [remoteServiceRequestCount: rlist.size()] ]
        //Map model =  [remoteServiceRequestList: rlist, remoteServiceRequestCount: rlist.size()]
        Map model = ["remoteServiceRequestList": ["will","marian"]]
        //render (view:'list', model:model )
        //response rlist, [model: [remoteServiceRequestInstanceCount: rlist.size(), remoteServiceRequestInstanceList: rlist]]
        ModelAndView mv = new ModelAndView()
        mv.addAllObjects(model)
        mv
    }

Как видно из комментариев, пробовал несколько способов с нулевым эффектом.представление не будет отображать ответ в виде HTML, так как я думаю, что представление автоматически предполагает, что переменная представляет собой список объектов домена.Список составлен нормально, и я получаю ожидаемые значения - но массив объектов, который я создаю, только из классов из src / main / groovy

Кажется, я не могу получить доступ к переменным карты модели в представлении GSP (если они не являются объектами предметной области), что здесь не то, что мне нужно.

метод ответа очень проницателен и пытается внутренне разобраться в типе и содержимом - и создает переменную в картеконкретное имя (логически что-то вроде List - я пытался установить это явно с моим удаленным списком результатов, но я не могу получить его для отображения данных в представлении GSP

Вопрос Могу ли яиспользовать GSP для рендеринга HTML для переменных, хранящихся в карте модели, где объекты данных не являются бинами (например, мой массив запросов), и если да, то как мне это сделать? (я мог бы превратить объекты в бины, но не уверен, что это происходитпомогать или нет)

в противном случае мне придется выполнить какую-то ужасную необработанную обработку html и просто использовать render, чтобы вернуть это в браузер -вместо того, чтобы использовать сантехнику GSP для выполнения большей части тяжелой работы за меня.

Я надеялся, что это будет прямо вперед и превратилось в кошмар, борющийся с рамками

Требуется советпрежде чем раствориться во фрустрации и неработающем коде -

Я на самом деле не гений HTML-презентации (поэтому скаффолдинг был бы достаточно хорош) - но застрял в этой неспособности визуализировать ответ от данных вкарта в представлении gsp.

Цените любые мысли о том, как это можно сделать - или альтернативу, которая будет достаточно хороша, если бы я мог заставить работать строительные леса.

1 Ответ

0 голосов
/ 02 октября 2018

Вопрос Могу ли я использовать GSP для рендеринга HTML для переменных, хранящихся на карте модели, где объекты данных не являются компонентами (такими как мой массив запросов), и если да, то как мне это сделать?

Да.

Проект на https://github.com/jeffbrown/williamwoodmansample показывает очень простой пример этого.

https://github.com/jeffbrown/williamwoodmansample/blob/master/grails-app/controllers/williamwoodmansample/WoodmanDemoController.groovy

package williamwoodmansample

class WoodmanDemoController {

    def index() {
        [remoteServiceRequestList: ['will', 'marian']]
    }
}

https://github.com/jeffbrown/williamwoodmansample/blob/master/grails-app/views/woodmanDemo/index.gsp

<html>
<head>
    <meta name="layout" content="main"/>
</head>

<body>
<h1>Names</h1>
<ul>
    <g:each var="name" in="${remoteServiceRequestList}">
        <li>${name}</li>
    </g:each>
</ul>
</body>
</html>
...