我刚刚开始使用Grails中的服务,我在尝试从服务内部渲染页面时遇到问题,我尝试了一些方法,如下所示,没有运气:
服务电话1:
GroupCheckService.isEnabled(userObjects.group.notenabled)
服务尝试1:
import grails.gsp.PageRenderer
class GroupCheckService {
PageRenderer groovyPgeRenderer
static transactional = false
def isEnabled(boolean notenabled) {
if(notenabled == true){
groovyPgeRenderer.render(view: '/locked')
}else{
return
}
}
}
服务电话2:
GroupCheckService.isEnabled(render, userObjects.group.notenabled)
服务尝试2:
class GroupCheckService {
PageRenderer groovyPgeRenderer
static transactional = false
def isEnabled(Closure render, boolean notenabled) {
if(notenabled == true){
render.call view:"/locked"
}else{
return
}
}
}
现在当我尝试方法1时,我没有收到错误但是当IF满足时页面没有呈现,方法2我得到以下错误:
no such property render
我非常感谢有关如何实现这一目标的建议或帮助,在此先感谢:)
答案 0 :(得分:4)
您不应该从服务渲染视图 - 这是控制器的一部分。
将该服务用于业务逻辑和/或(事务)数据库操作。
来自grails docs:
Grails中的服务是将大部分逻辑放在应用程序中的地方,让控制器负责处理具有重定向的请求流等等。
如果您真的希望通过服务呈现视图,mrhaki has blogged关于使用服务中的PageRenderer
。
import grails.gsp.PageRenderer
class GroupCheckService {
PageRenderer groovyPageRenderer
def isEnabled(Closure render, boolean notenabled) {
if(notenabled == true){
groovyPageRenderer.render view: "/locked"
}else{
return
}
}
}
请注意,由于Sitemesh
在请求范围之外工作,您无法使用PageRenderer
布局。
最好的方法是重新设计您的应用程序,将渲染内容留在控制器中。
答案 1 :(得分:1)
首先 - 从服务中呈现HTTP响应是非常糟糕的做法。
关于您的代码 - 您必须使用groovyPgeRenderer.render
的第一种方法。但是你没有使用这个电话的结果。这是一种返回String
(请参阅docs)
因此,您需要手动将该字符串放入HTTP响应中。您可以从Controller或RequestContextHolder.currentRequestAttributes()
获取HttpServlet响应(请参阅docs)。像:
String html = groovyPageRenderer.render(view: '/locked')
def response = RequestContextHolder.currentRequestAttributes().response
response.setStatus(200)
response.setContentType('text/html')
response.writer.write(html)