【问题标题】:Grails: Can't figure out why I'm getting a 404Grails:无法弄清楚为什么我会得到 404
【发布时间】:2011-06-29 13:22:33
【问题描述】:

我正在使用 Grails 1.3.6。我有这个文件...

grails-app/views/home/design/index.gsp

这是我的 HomeController 中定义的内容。可悲的是,每当我访问“http://localhost:port/context-path/design/”时,我都会收到 404 错误。服务器正常启动,日志中没有错误。我可以做些什么来获取我的页面而不是 404?

def index = {
    def folder = params.folder;
    def page = params.page;

    if (page) { 
        try { 
            def contents = IOService.getFileContents(folder, page)  
            response.setContentType("application/json")
            response << contents
        } catch (FileNotFoundException e) { 
            response.status = 404;
        }   // try
    } else { 
        render(view: "/home/${folder}/index") 
    }   // if
}

我的 URLMappings 文件包含...

static mappings = {
    "/$folder?/$page"{
        controller = "home"
        action = "index"
    }

    "/"(view:"/index")
    "500"(view:'/error')
}

谢谢,- 戴夫

【问题讨论】:

  • 您是要访问/context-path/home/design吗? (对于您当前的课程,这仍然是 404,但会使您的示例排列得更好)

标签: grails


【解决方案1】:

如果您希望能够访问

/context-path/home/design

你的动作需要命名为设计,即

class HomeController {
    def design = {

    }
}

Grails 约定始终为/context-path/controllerName/actionName(除非您在grails-app/conf/URLMappings.groovy 中映射不同)。

您的示例有点不清楚您要访问的路径。解决这两个问题:

  • 如果您想要/context-path/design,您需要一个带有index 操作的DesignController(因为如果URL 中没有提供任何操作,Grails 会查找index 操作)。
  • 如果你想要/context-path/home/design,你需要一个HomeController 和一个design 操作。

编辑

在 cmets 中,您表示希望能够将 /context-path/design 映射到 HomeController 索引操作。你可以通过grails-app/conf/URLMappings.groovy 做到这一点:

"/design"(controller: 'home', action: 'index')

【讨论】:

  • 嗨,我不希望 URL 是“/context-path/home/design”,我希望它是“/context-path/design”。我意识到我所要求的可能是非常规的,但如果可以从“HomeController”中做到这一点,那就是我们想要做的。谢谢,-
  • 嗨 Dave,请查看 UrlMappings 的文档:grails.org/doc/latest/guide/6.%20The%20Web%20Layer.html#6.4 URL Mappings
  • 我已经编辑了我的问题以显示我想要做什么。如果他们输入 URL“文件夹/页面”,我想提供静态 JSON 内容。否则,如果他们只是输入“文件夹/”,我想提供位于 grails-app/views/home/folder/index.gsp 中的视图。对进一步开展这项工作有何建议?
  • 你知道请求是否真的命中了动作吗?由于您在操作中以 404 响应,因此 404 可能是未找到控制器/操作,或者未找到文件夹。也许添加一个日志来验证?
  • 嗨 Rob,根据您的编辑,我不希望“/context-path/design/”点击 HomeController 索引操作,我希望它在“views/home/design”处呈现视图/index.gsp”。 “/context-path/photos/”与“views/home/photos/index.gsp”相同。 home 下的其他 25 个目录也是如此。遗憾的是,日志没有回答您的其他评论,但我感谢您的帮助,并希望我的澄清是有意义的。
【解决方案2】:

由于您似乎有两个不同的操作,所以我会设置一些不同的东西:

def indexWithPage = {
    def folder = params.folder;
    def page = params.page;

    try { 
        def contents = IOService.getFileContents(folder, page)  
        response.setContentType("application/json")
        response << contents
    } catch (FileNotFoundException e) {
        e.printStackTrace(); 
        response.status = 404;
    }   // try
}

def index
    def folder = params.folder;

    render(view: "/home/${folder}/index") 
}

具有以下 URL 映射:

static mappings = {
    "/$folder/$page"{
        controller = "home"
        action = "indexWithPage"
    }

    "/$folder"{
        controller = "home"
        action = "index"
    }

    "/"(view:"/index")
    "500"(view:'/error')
}

我还抛出了一个 e.printStackTrace();在那里帮助我们确定您是否收到了您的 404 或该操作确实没有被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多