zoukankan      html  css  js  c++  java
  • 一步一步学grails:7 MVC

    资源下载

    通过前面的工作,我们知道,Grails中,模型-视图-控制器(MVC)分别由域、gsp页面和控制器担当。

    其中模型(Model)就是域类,负责业务实体的存储,主要是通过GORM在实现的,GORM屏蔽了底层数据库的细节,程序员不再关心数据库去怎么实现,甚至不用自己建表、建库。程序员通过oo(面向对象)来操作数据库,无疑加大了产出,提高了工作效率。

    而视图(View)表现为gsp页面,gsp类似以往的jsp,负责页面呈现。这一部分程序员需要注意的就是gsp语法和gsp标签的熟练使用,对于有过jsp使用经验的程序员来说,这也不是什么大的问题。

    最后,是控制器(Controller)。在grails中,控制器的作用无疑被大大加强了,在其中封装了绝大部分的业务逻辑。

    后面你将发现,当我们在grails的脚手架代码进行工作时,实际上基本的MVC架构已经具备,我们的大部分工作,都是围绕着对这三个组件的修改进行的。

    下面的我们用一个小例子进行演示。

    1、              现在,我们在产品编号列表页面中,需要用户点击“产品编号”列的链接时,显示的是“生产计划”细节页面,而不是“产品编号”细节页面:

    当然,并不是每个产品编号都已经编制过生产计划。但用户点击的产品编号并没有关联的生产计划时,我们要在页面上显示对应的信息:

    2、              这就要修改“产品编号”控制器的show闭包:

    打开grails-app/ProductionNoController.groovy,编辑show闭包:

    def show = {

    //显示产品编号关联的生产计划

    def productionNoInstance = ProductionNo.get( params.id )

    //根据请求参数中的id取得产品编号实例

    if(!productionNoInstance) {

    //若找不到匹配的产品编号

    flash.message = "/u627E/u4E0D/u5230id/u4E3A${params.id}/u7684/u4EA7/u54C1/u7F16/u53F7"

    //显示错误信息

    redirect(action:search)

    //转向到search页面

    }

     

    else {

    //若找到匹配的产品编号

    def planning=Planning.findByProductNo(productionNoInstance)

    //根据产品编号找生产计划

    if(planning)

    //若找到

    redirect(controller:"planning",action:"show",id:planning.id)

    //转向生产计划细节页面,并带上生产计划id

    else {

    //若找不到

    flash.message = "/u4EA7/u54C1/u8BA1/u5212/u4E0D/u5B58/u5728/uFF0C/u8BF7/u5148/u7F16/u5236/u4EA7/u54C1/u8BA1/u5212/uFF01"

    //显示错误信息

    redirect(action:search)

    //转向到search页面

    }

     

    //return [ productionNoInstance : productionNoInstance ]

     

    }

     

    }

     

    3、              同时,我们在“产品编号”列表页面,再增加几个有用的菜单按钮:

    <span class="menuButton"><g:link class="create" action="create" >编制产品编号</g:link></span>

                <span class="menuButton"><g:link class="list" action="list" controller="planning">已编生产计划</g:link></span>

    现在,菜单栏多了两个按钮:

     

    4、              虽然我们通过在页面上显示消息的方式提示用户一个产品编号是否已经编制了生产计划,然而这毕竟不太直观。现在我们想用一种更直观的方式:

    对于已经有生产计划的产品,我们显示了“浏览”按钮,从而使用户可以查看对应产品的生产计划;反之,我们显示了“编制”按钮,使用户能为该产品制订一个生产计划。

    5、              需要对域ProductionNo进行一点修改:

    增加一个方法:

    Planning findPlan(){

        Planning.findByProductNo(this)

    }

    这样,通过调用这个方法,我们可以查找到该产品对应的生产计划,如果该产品还没有生产计划,则返回null

    6、              grails-app/views/list.gsp页面加入这句:

    <g:if test="${productionNoInstance.findPlan()}">

    <td>${productionNoInstance}&nbsp;&nbsp;>><g:link action="show" id="${productionNoInstance.id}">浏览</g:link></td>

     

    </g:if>

    <g:else>

    <td>${productionNoInstance}&nbsp;&nbsp;>><g:link action="create_2" controller="planning"

    params="['productNo.id':productionNoInstance.id]" style="color:#ff6633">编制</g:link></td>

    </g:else>

    这段代码通过调用findPlanning方法查找产品的对应生产计划,如果对应生产计划为空,显示兰色的“浏览”按钮,否则显示红色的“编制”按钮。

    7、               

  • 相关阅读:
    fis3解决web网站缓存问题
    C# 计算每周和每月固定日期
    移动端web页面上滑加载更多功能
    常见三种字符编码的区别:ASCII、Unicode、UTF-8
    ef AddDays报错
    .NET语言的编译过程:中间语言(IL)和即时编译器(JIT)
    ajax 传递数组类型参数后台接收不到的问题
    sql server 作业没跑、开启sql 代理服务、新建作业
    在javascript中NodeList和Array的区别及转换方法
    我经历的几种开发模式和心理
  • 原文地址:https://www.cnblogs.com/encounter/p/2188551.html
Copyright © 2011-2022 走看看