grails - 试图从不是来自域对象的数据中呈现 gsp HTML 响应
问题描述
我编写了一个 API,它最初是一堆 json 请求响应 api,使用 vertx 一个内存数据库模型。工作正常。
然后有人想要漂亮的 HTML 显示来查看该应用程序中的一些内容。
所以我创建了一个 Grails 应用程序来尝试为我做简单的脚手架视图 - 但当然没有域模型本身。
我创建了一个 remoteRequestController - 它调用一个服务,该服务在我的“核心应用程序”上执行 JSON 获取并将数据转换为对象。
因此,对于我的列表请求 - 我执行 GET 并返回一个 json 数组。我将其转换为本地“非域”对象列表,并在结果对象中构造一个图形。
我的服务将列表返回给我的控制器——它试图将地图放到视图中。
我尝试遵循 grails 约定-我的控制器称为“RemoteServiceRequestController”,它调用 RemoteServiceRequestService(远程获取/响应,并格式化为对象)-视图位于“remoteServiceRequest/list”中,使用像这样的变量'远程服务请求列表'
在那个 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…"/></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 视图中的模型映射变量(除非它们是域对象),这不是我在这里需要的。
响应方法非常挑剔,并试图在内部查看类型和内容变得聪明 - 并在特定名称的映射中构建一个变量(逻辑上类似于<domainClass>List
- 我试图用我的远程结果列表显式设置它,但我无法让它在 GSP 视图中呈现数据。
我可以使用 GSP 为模型映射中保存的数据对象不是 bean(例如我的请求数组)中的变量呈现 HTML,如果可以,我该怎么做?(我可以将对象变成豆子,但不确定这是否会有所帮助)。
否则,我将不得不进行一些可怕的原始 html 处理,然后使用渲染将其返回给浏览器——而不是使用 GSP 管道为我完成大部分艰苦的工作。
我希望这将是直截了当的,它变成了与框架战斗的噩梦。
我并不是一个真正的 HTML 演示天才(这就是脚手架足够好的原因)——但我坚持无法在 gsp 视图中呈现来自地图中数据的响应。
这如何才能发挥作用 - 或者如果我可以让脚手架工作,是否有足够好的替代方案?
解决方案
问题我可以使用 GSP 为模型映射中保存的变量呈现 HTML,其中数据对象不是 bean(例如我的请求数组),如果可以,我该怎么做?
是的。
https://github.com/jeffbrown/williamwoodmansample上的项目显示了一个非常简单的示例。
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>
推荐阅读
- flutter - 如何在 Flutter 中实现搜索过滤器内联?
- symfony - 如何在编辑表单 EasyAdmin 3 上格式化 DateTimeField 值
- linux - 一致地访问 CPanel 上的节点和纱线
- apache-nifi - 我无法启动 Apache Nifi
- python - 加快 np.searchsorted 或提高 Python 中的速度性能
- python - 训练时如何预测?
- python - 试图在 tkinter 中关闭窗口但显示以下错误
- docker - 无法让芹菜在 docker compose 中运行
- python - 使用 django send_mass_mail 发送电子邮件
- javascript - 如何将'网络套接字(Socket.Io)传递到某些屏幕(不是聊天应用程序)