如果您已熟悉标准HTML表单标签,那么在Grails中使用g:textField的原因是什么?
如果我理解正确,以下两个标记替代方案是等效的:
<input type="text" name="name" value="${params.name}" id="name" />
<g:textField name="name" value="${params.name}" />
Run Code Online (Sandbox Code Playgroud)
在任何情况下使用g:textField会增加价值吗?我错过了什么吗?
<g:each in="${business}" status="i" var="businessInstance">
<tr class="${(i % 2) == 0 ? 'odd' : 'even' }">
<td>${fieldValue(bean: businessInstance, field: "id") }</td>
<td>${businessInstance.id}</td>
</tr>
</g:each>
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,第一和第二表数据都得到相同的值.这两个案件有什么不同吗?
Grails 2.4.5在这里.我正在尝试为我的GSP实现以下UX行为:
要确定用户是否具有所需权限,我可以从Groovy和GSP/taglib层访问功能.
从Groovy/controller层:
SecurityUtils.hasPermission(String permission)
Ex: SecurityUtils.hasPermission('UPDATE_BUZZ')
Run Code Online (Sandbox Code Playgroud)
从GSP/taglib层:
<sec:hasPermission permission="<permission name>">???</sec:hasPermission>
Ex: <sec:hasPermission permission="UPDATE_BUZZ">???</sec:hasPermission>
Run Code Online (Sandbox Code Playgroud)
因此,给定这两种可用的访问检查机制,并给出以下控制器:
class FizzController {
BuzzService BuzzService
def buzz() {
SomeData dataModel = buzzService.getModel(params)
render(view: 'buzz', model: [ dataModel: dataModel ])
}
}
Run Code Online (Sandbox Code Playgroud)
......在哪里buzz.gsp:
<!-- Lots of HTML/GSP here -->
<g:submitButton name="update" value="Update" />
<!-- Lots more HTML/GSP down here -->
Run Code Online (Sandbox Code Playgroud)
鉴于这一切,我的问题是:我应该如何/在哪里:(1)响应' update'按钮的点击处理程序,(2)执行访问检查,以及(3)呈现错误/横幅/ flash消息?代码示例(甚至伪代码)将是最棒的!
在我的Grails控制器中,我正在响应一个AJAX调用并使用render返回文本:
def ajaxRandomPersonName = {
def person = get a random person ...
render "Name: ${person.name}"
}
Run Code Online (Sandbox Code Playgroud)
问题是render呈现整个模板.因此,它不是仅渲染"Name:John",而是呈现模板中定义的所有图标,导航等.如何在render没有模板的情况下进行渲染?
我几乎使用Grails 1.1.1来关注"Grails in Action"(第28页)的第1章.
跟进:根据Rhysyngsun的建议返回错误没有影响.我也尝试将模板设置为null但它仍然呈现模板:
def ajaxRandomPersonName = {
def person = get a random person ...
render (template:null, text:"Name: ${person.name}")
}
Run Code Online (Sandbox Code Playgroud)
render 无论我做什么,都会全心全意地通过模板渲染它.
后续2:关于grails-user邮件列表的并行讨论.
后续3:示例代码:我将我的代码配对最低限度,它仍然展示了不需要的模板渲染.
控制器/ PersonController.groovy:
class PersonController {
def index = { }
def home = { [message:"Hello"] }
def ajaxTest = {
println "ajaxTest called"
render text: …Run Code Online (Sandbox Code Playgroud) 使用标签,您可以在gsp中执行此操作:
<g:if test="${someBean?.aCondition}">
<div class="aSection">
...
</div>
</g:if>
Run Code Online (Sandbox Code Playgroud)
我真正想做的是添加第二个'类',它包含'display:none'或'display:block'属性,基于'$ {someBean?.aCondition}'的值.
最终的HTML会这样:
<div class="aSection hiddenItem">
...
</div>
Run Code Online (Sandbox Code Playgroud)
(如果$ {someBean?.aCondition}为真,div将为其类设置'shownItem')
相应的css:
.shownItem
{
display: block;
}
.hiddenItem
{
display: none;
}
Run Code Online (Sandbox Code Playgroud)
有什么好办法实现这个目标?
也许我只是在问google&co.错误的问题,但这是我想要完成的:
我有一个带有嵌套模板的GSP模板.外部实体可以访问域类实例的成员.而不是像所有域名成员一样传递
<g:render template="/image/alternativeTemplate" model="${[member1: member1, member2: member2]}"/>
Run Code Online (Sandbox Code Playgroud)
或使用迭代器之类的
<g:render template="/image/alternativeTemplate" model="${[it: it]}"/>
Run Code Online (Sandbox Code Playgroud)
我想在内部使用外部GSP模型.
我错过了什么吗?
问候,smon
我有一个Grails 2.4.5 GSP页面,它加载了两个iFrame:
<iframe scrolling="no"
src="${createLink(controller:'admin', action:'page1', id: serviceCard.id)}"></iframe>
<iframe scrolling="no"
src="${createLink(controller:'admin', action:'page2', id: serviceCard.id)}"></iframe>
Run Code Online (Sandbox Code Playgroud)
每两次重新加载后,我有以下问题.请注意,这不会一直发生.
在我的GSP上,我看到错误500.控制台显示以下错误:
2015-08-01 21:41:11,530 [http-nio-8080-exec-3] ERROR errors.GrailsExceptionResolver - ConcurrentModificationException occurred when processing request: [GET] /test/adminServiceCard/previewCard/4b6dc4730fd3acd80a
Stacktrace follows:
Message: Error processing GroovyPageView: Error executing tag <asset:stylesheet>: null
Line | Method
->> 527 | doFilter in /grails-app/views/adminServiceCard/previewCard.gsp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - …Run Code Online (Sandbox Code Playgroud) 我想在一个普通的Spring MVC应用程序中使用GSP视图而不是JSP/JSTL视图.我已经将groovy.servlet.TemplateServlet添加到web.xml,如下所示:
<servlet>
<servlet-name>GroovyTemplate</servlet-name>
<servlet-class>groovy.servlet.TemplateServlet</servlet-class>
<init-param>
<param-name>template.engine</param-name>
<param-value>groovy.text.GStringTemplateEngine</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>GroovyTemplate</servlet-name>
<url-pattern>*.gsp</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
并设置一个Spring InternalResourceViewResolver来加载GPS文件.到目前为止一切正常,但是为了将模型中的值暴露给模板,我必须做一些技巧(继承TemplateServlet并将它们添加到ServletBinding中).
现在我的下一个障碍是默认情况下JSTL在使用c:out标记时转义XML,Grails有编解码器的概念来自动转义GSP中使用的值.默认情况下,上述模板方法不会逃脱,这需要开发人员非常小心地避免XSS漏洞.
是否有另一种(更好的)使用GSP的方法,包括在不使用Grails的普通Spring MVC应用程序中自动转义?
如何在GSP中声明一个函数?我需要像taglib这样的东西,但在GSP中声明 - 外面没关系
我试图在GSP中使用groovy函数.请帮忙,因为我要把头发弄到这里.
在我的GSP的顶部,我有 <%@ page import = company.ConstantsFile %>
在我的GSP里面我有
<p>
I have been in the heating and cooling business for <%(ConstantsFile.daysBetween())%>
</p>
Run Code Online (Sandbox Code Playgroud)
和我的ConstantsFile.groovy
package company
import static java.util.Calendar.*
class ConstantsFile {
def daysBetween() {
def startDate = Calendar.instance
def m = [:]
m[YEAR] = 2004
m[MONTH] = "JUNE"
m[DATE] = 26
startDate.set(m)
def today = Calendar.instance
render today - startDate
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试将renter更改为puts,system.out等,但这不是我的主要问题.
Error 500: Internal Server Error
URI
/company/
Class
java.lang.NullPointerException
Message
Cannot invoke method daysBetween() on null object …Run Code Online (Sandbox Code Playgroud)