- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 WebApplication 中有一个 User 类和一个 Driver 类,它是 User 的子类。这是代码:
elektrova 包
class User {
String username
String password
String firstName
String lastName
UserRole role
static belongsTo = [
hauler:Hauler
]
static hasMany = [
createdJobs:Job,
activities:UserActivityHistory
]
static mappedBy = [
createdJobs:'creationUser'
]
static mapping = { tablePerHierarchy false }
static constraints = {
username(blank:false, size:4..15,matches:/[\S]+/, unique:true)
password(blank:false, size:4..15,matches:/[\S]+/)
firstName(blank:false, nullable:false)
lastName(blank:false, nullable:false)
role(blank:false, nullable:false)
}
@Override
def encodeAsHTML(){
firstName + " " + lastName
}
}
class Driver extends User{
UserRole role = UserRole.DRIVER
static hasMany = [
assignedJobs:Job
]
static mappedBy = [assignedJobs:'assignedUser']
static constraints = {
}
}
这是在 Bootstrap 中创建tesdata:
User dispo = new Driver(hauler: hauler, firstName: "Dis", lastName: "Po", password: "dispo", role: UserRole.ADMIN, username: "dispo" ).save(failOnError: true)
Driver driver = new Driver(hauler: hauler, firstName: "Kai", lastName: "Uwe", password: "kauw", role: UserRole.DRIVER, username: "kauw" ).save(failOnError: true)
Driver driver2 = new Driver(hauler: hauler, firstName: "Hans", lastName: "Juergen", password: "haju", role: UserRole.DRIVER, username: "haju" ).save(failOnError: true)
User admin = new User(hauler: hauler, firstName: "Ad", lastName: "Min", password: "admin", role: UserRole.ADMIN, username: "admin" ).save(failOnError: true)
User admin2 = new User(hauler: hauler, firstName: "Ad", lastName: "Min", password: "admin", role: UserRole.ADMIN, username: "admin2" ).save(failOnError: true)
还有 show.gsp:
<%@ page import="elektrova.User"%>
<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="main">
<g:set var="entityName"
value="${message(code: 'user.label', default: 'User')}" />
<title><g:message code="default.show.label" args="[entityName]" /></title>
</head>
<body>
<g:render template="/navi/navbar" />
<a href="#show-user" class="skip" tabindex="-1"><g:message
code="default.link.skip.label" default="Skip to content…" /></a>
<div class="nav" role="navigation">
<ul>
<li><g:link class="list" action="index">
<g:message code="view.user.button.label.list" args="[entityName]" />
</g:link></li>
<li><g:link class="create" action="create">
<g:message code="view.user.button.label.create" args="[entityName]" />
</g:link></li>
</ul>
</div>
<div id="show-user" class="scaffold-show" role="main">
<h1>
<g:message code="default.show.label" args="[entityName]" />${userInstance.toString() }
</h1>
<g:if test="${flash.message}">
<div class="message" role="status">
${flash.message}
</div>
</g:if>
<ol class="property-list user">
<% System.out.println "user : " + userInstance %>
<g:if test="${userInstance?.hauler}">
<li class="fieldcontain"><span id="hauler-label"
class="property-label"><g:message code="hauler.label"
default="Hauler" /></span> <span class="property-value"
aria-labelledby="hauler-label"><g:link controller="hauler"
action="show" id="${userInstance?.hauler?.id}">
${userInstance?.hauler?.encodeAsHTML()}
</g:link></span></li>
</g:if>
<g:if test="${userInstance?.username}">
<li class="fieldcontain"><span id="username-label"
class="property-label"><g:message code="user.username.label"
default="Username" /></span> <span class="property-value"
aria-labelledby="username-label"><g:fieldValue
bean="${userInstance}" field="username" /></span></li>
</g:if>
<g:if test="${userInstance?.password}">
<li class="fieldcontain"><span id="password-label"
class="property-label"><g:message code="user.password.label"
default="Password" /></span> <span class="property-value"
aria-labelledby="password-label"><g:fieldValue
bean="${userInstance}" field="password" /></span></li>
</g:if>
<g:if test="${userInstance?.firstName}">
<li class="fieldcontain"><span id="firstName-label"
class="property-label"><g:message
code="user.firstName.label" default="First Name" /></span> <span
class="property-value" aria-labelledby="firstName-label"><g:fieldValue
bean="${userInstance}" field="firstName" /></span></li>
</g:if>
<g:if test="${userInstance?.lastName}">
<li class="fieldcontain"><span id="lastName-label"
class="property-label"><g:message code="user.lastName.label"
default="Last Name" /></span> <span class="property-value"
aria-labelledby="lastName-label"><g:fieldValue
bean="${userInstance}" field="lastName" /></span></li>
</g:if>
<g:if test="${userInstance?.role}">
<li class="fieldcontain"><span id="role-label"
class="property-label"><g:message code="user.role.label"
default="Role" /></span> <span class="property-value"
aria-labelledby="role-label"><g:fieldValue
bean="${userInstance}" field="role" /></span></li>
</g:if>
<g:if test="${userInstance?.createdJobs}">
<li class="fieldcontain"><span id="createdJobs-label"
class="property-label"><g:message
code="user.createdJobs.label" default="Created Jobs" /></span> <g:each
in="${userInstance.createdJobs}" var="c">
<span class="property-value" aria-labelledby="createdJobs-label"><g:link
controller="job" action="show" id="${c.id}">
${c?.encodeAsHTML()}
</g:link></span>
</g:each></li>
</g:if>
<g:if test="${userInstance?.createdJobs}">
<li class="fieldcontain"><span id="createdJobs-label"
class="property-label"><g:message
code="user.createdJobs.label" default="Created Jobs" /></span> <g:each
in="${userInstance.createdJobs}" var="c">
<span class="property-value" aria-labelledby="createdJobs-label"><g:link
controller="job" action="show" id="${c.id}">
${c?.encodeAsHTML()}
</g:link></span>
</g:each></li>
</g:if>
</ol>
<g:form url="[resource:userInstance, action:'delete']" method="DELETE">
<fieldset class="buttons">
<g:link class="edit" action="edit" resource="${userInstance}">
<g:message code="default.button.edit.label" default="Edit" />
</g:link>
<g:actionSubmit class="delete" action="delete"
value="${message(code: 'default.button.delete.label', default: 'Delete')}"
onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" />
</fieldset>
</g:form>
</div>
Controller :
import static org.springframework.http.HttpStatus.*
import grails.transaction.Transactional
@Transactional(readOnly = true)
class UserController {
def beforeInterceptor = [action: this.&auth]
def auth = {
if(!session.user) {
redirect(controller:"login", action: "index")
}
}
static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]
boolean isAdmin
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
model:[userInstanceList: User.list(params),userInstanceCount: User.count()]
}
def show(User userInstance) {
println 'User: ' + userInstance
respond userInstance
}
def create() {
respond new User(params)
}
@Transactional
def save(User userInstance) {
if (userInstance == null) {
notFound()
return
}
if (userInstance.hasErrors()) {
respond userInstance.errors, view:'create'
return
}
userInstance.save flush:true
request.withFormat {
form {
flash.message = message(code: 'default.created.message', args: [message(code: 'userInstance.label', default: 'User'), userInstance.id])
redirect userInstance
}
'*' { respond userInstance, [status: CREATED] }
}
}
def edit(User userInstance) {
respond userInstance
}
@Transactional
def update(User userInstance) {
if (userInstance == null) {
notFound()
return
}
if (userInstance.hasErrors()) {
respond userInstance.errors, view:'edit'
return
}
userInstance.save flush:true
request.withFormat {
form {
flash.message = message(code: 'default.updated.message', args: [message(code: 'User.label', default: 'User'), userInstance.id])
redirect userInstance
}
'*'{ respond userInstance, [status: OK] }
}
}
@Transactional
def delete(User userInstance) {
if (userInstance == null) {
notFound()
return
}
userInstance.delete flush:true
request.withFormat {
form {
flash.message = message(code: 'default.deleted.message', args: [message(code: 'User.label', default: 'User'), userInstance.id])
redirect action:"index", method:"GET"
}
'*'{ render status: NO_CONTENT }
}
}
protected void notFound() {
request.withFormat {
form {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'userInstance.label', default: 'User'), params.id])
redirect action: "index", method: "GET"
}
'*'{ render status: NOT_FOUND }
}
}
}
现在 UserController 中一切正常,正确的 User 实例始终传递到 View 。但是 gsp 对于所有对象都接收 null,除了两个管理员之外,它们都被正确渲染。起初我认为这是因为 View 无法处理子类,但 Dispo User 也没有显示。更改其他实例的角色仍然不会显示它们。 有什么建议吗?
最佳答案
这是一个老问题,但我刚刚遇到了同样的问题,并通过向 respond
语句添加模型参数来“修复”它:
def show(User userInstance) {
println 'User: ' + userInstance
respond userInstance, model:[userInstance:userInstance]
}
就我而言,“User”类是一个基类,而我实际上是在基类 Controller 中处理它的继承类。 respond
对此完全感到困惑。
关于Grails View (show.gsp) 不处理预期类的实例,而是获取 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629521/
假设我有以下类(class) class Genre { static hasMany=[author:Author] } class Author{ static hasMany=[
我需要创建一个自定义gsp,其域模型设计如下 class Question { SortedSet choiceCollection; static hasMany = [choice
我想摆脱 create.gsp 和 save.gsp 并将所有内容都放在同一页面上。 我所做的是将所有这些字段移到 list.gsp 中列表的第一行 但现在我不知道如何将它与其余数据连接起来并使其工作
我在 weblogic 中使用 grails,需要更改展开的部署文件夹中的类文件。但这个类实际上是一个gsp编译的文件。 那么,问题是:GSP 文件 (.class) 在 war 中处于什么位置? 注
我是 Grails 新手。我正在尝试为站点中的每个产品显示图像缩略图,如下所示: /* 1 */ 这里的问题是我想在数据库中保存图片链接,并通过以下方式获取链接: ${fieldValue(bean:
希望我的问题非常简单。 我有两个不同的域以及相应的 Controller / View 文件夹等。 我想从第一个 _form.gsp 调用第二个 _form.gsp(在 g:each 中,因为会有多个
从gsp页(或类型库)是否可以中止html页的生成并回调到 Controller 方法以输出403 header ? 我们有一组用于管理页面的脚手架页面,并对其进行了修改,以测试访问该页面的用户是否具
这是在我的gsp中,它不起作用 我认为主要原因是我嵌套$ {}。我该怎么做。 $ {variable}是从 Controller 传递的字符串。 谢谢! 最佳答案 您不需要嵌套的$ {} 应该管用
当您编译 grails war 时,我知道 .groovy 代码被编译为字节码类文件,但我不明白容器(例如 tomcat)如何在请求 GSP 时知道如何编译它们。容器了解 GSP 吗?安装在服务器上的
在 GSP 中,是否可以创建到另一个 GSP 的直接链接?我知道我可以使用: 并在 UserController 中定义 foo 操作以仅显示相应的 GSP class UserController
我有一个域名 class Node { String nodeId String label Node parent } 在 GSP 页面中,我想从根开始并打印其所有
我有一个 grails 应用程序,在执行加载某些数据表的操作后,我单击数据表上的链接,重新执行相同的操作并再次加载相同的页面 - 所以,当它第二次加载时(单击链接后)看起来浏览器没有处理我页面上的任何
我创建了一个本地驱动器中的word文档,应该使用grails gsp页面在浏览器中打开它。 用于创建是创建链接还是使用脚本的选项有哪些。 在此先感谢您的帮助。 最佳答案 要打开或下载,有很多选择 是使
我想将域类中设置的所有值检索到客户端(gsp或Javascript) 假设我有一个名为GeneralSetting的域类。我使用的方法有效,但并非完全符合我的要求。 gsp文件 s console.
我是grails的新手,正在尝试访问索引页面。删除grails的默认主页后,出现以下错误 404 App1 / WEB-INF / grails-app / views / index.jsp des
在我的GSP中,我有一个选择标签 产生HTML -Select- USA UK 但是我需要从1开始有一个整数值(即,美国将具有值1和英国2) 我该怎么做 最佳答案 一种解决方案是,在将列表返
所以我想在一定时间后调用某个 gsp def index() { //code here //after 30secs r
我们正在使用 run-app 运行 grails 项目。第一次请求页面时,会出现延迟。然而,此后每次页面加载速度都会很快。 我能想到的最明显的解释是该页面尚未编译。有没有办法诱导编译或其他导致延迟的原
我有以下代码 Cart is Empty ${cart.size()} items 但是第一次访问该网站时(当购物车为空时)我收到“无法在空对象上调用方法 isEmpty(
我的域中有一个名为 status 的属性,它是 String 类型,可以具有两个值之一 Applied 、 NotApplied 我有两个复选框来输入该值。在我的编辑页面中,我想显示这两个复选框。 如
我是一名优秀的程序员,十分优秀!