Grails 开发手册

16、探索Grails:现代Web开发的利器 本文介绍了Grails这一现代Web框架的基本概念、安装步骤及快速创建应用的完整流程。Grails基于Spring和Hibernate,采用‘约定优于配置’原则,极大地简化了Web开发任务。文章还详细描述了Grails的核心功能、目录结构、运行机制以及其在Web开发中的显著优势,帮助开发者快速上手并高效构建Web应用。 阅读详情

Grails 开发手册

1. 简介 1

2. 安装 Grails 1

3. 基本命令 1

4. 目录结构 2

5. Domain 2

6. Controller 5

7. Service 7

8. Filter 8

9. Plugin 10

10. 整合前端框架 JQuery EasyUI 11

11. 配置说明 11

12. 碰到的问题 14

1. 简介

Grails 是根据约定优于配置的原则来搭建,整个框架其实也是对java比较流行的框架进行了封装,MVC部分是用的Spring MVC,持久层则是用的Hibernate。但整个开发的模式还有很大的变化,它的开发语言是Groovy,并且不需要自己去写数据访问层来实现基本CRUD功能,这些都已经包含在Domain里。

2. 安装 Grails

a) 下载 http://grails.org/download

b) 创建一个GRAILS_HOME的环境变量

c) 将 $GRAILS_HOME/bin 添加到PATH中

安装完成后可以输入grails –version进行检查。

3. 基本命令

d) 创建项目

grails create-app [appName]

生成一个基础的Grails项目目录。

e) grails create-domain-class [className]

创建一个Domain类

f) grails create-controller [controllerName]

创建一个Controller类

g) grails create-service [serviceName]

创建一个service类

h) grails compile

编译Groovy 及 Java 源码

i) clean

清除编译文件,在idea下开发Grails项目时新加jar包后可能会出现项目启动缺少jar包的情况,需要clean一下。

j) grails list-plugins

列出所有可用的插件

k) grails install-plugin [pluginName]

安装插件

l) grails uninstall-plugin  [pluginName]

删除已安装的插件

m) grails war

将项目打成war包,方便部署到web应用服务器

 

4. 目录结构

l grails-app 项目源码的顶级目录

l conf 配置文件

l controllers 控制器文件

l domain 域文件

l i18n 国际化支持

l services 服务层文件

l taglib 页面自定义标签库

l views 视图层文件

l lib   jar包

l scripts 脚本文件

l src  Groovy与Java源文件

l test 单元测试文件

5. Domain

n) 定义属性

i. 例子

class Person {      

        String name

        Integer age

        Date lastVisit

}

 

o) CRUD操作

i. Create新增

def p=new Person(name:"Fred", age:40, lastVisit:new Date())

p.save()

 

ii. Read读取

Grails 是为domain类默认一个id属性。

def p = Person.get(1)

加载一个只读的对象

def p = Person.read(1)

iii. Update更新

def p = Person.get(1)

p.name = "Bob"

p.save()

iv. Delete删除

def p = Person.get(1)

p.delete()

p) 关联

i. one-to-one

class Face {

    Nose nose

}

class Nose {       

        Face face

}

 

ii. one-to-many

class Author {                              

static hasMany = [ books : Book ]

String name

}

class Book {

String title

 }

对于 hasMany 设置,Grails将自动注入一个java.util.Set类型的属性到domain类。 用于迭代集合:

def a = Author.get(1)

a.books.each { println it.title }

默认的级联行为是级联保存和更新,但不删除,除非 belongsTo 被指定:

class Author {    

static hasMany = [ books : Book ]

String name

}

class Book {

static belongsTo = [author:Author]

String title

}

iii. many-to-many

 

通过在关联双方定义 hasMany ,并在关联拥有方定义 belongsTo

 

 

class Book {  

 static belongsTo = Author

 static hasMany = [authors:Author]   

 String title

}

class Author {   

static hasMany = [books:Book]   

String name

}

 

 

在这种情况下,Author 负责持久化关联,并且是唯一可以级联保存另一端的一方 。例如,下面这个可以进行正常级联保存工作:

 

 

new Author(name:"Stephen King").addToBooks(new Book(title:"The Stand")).addToBooks(new Book(title:"The Shining")).save()

 

 

iv. domain 映射配置

static mapping = {

        id column:'goods_id'  //id字段与数据库goods_id字段关联

        goodsSuppCode column: 'goodssuppcode'

        goodsSuppName column: 'goodssuppname'

        goodsSuppLink column: 'goodssupplink'

        table 'who_goods'  //表名(默认是类名)

        version false //是否加version字段,用于乐观锁

        datasources(['brand','home']) //数据源配置

}

 

v. domain 数据验证

在domain中对属性设置一些验证规则,在执行save操作时会进行验证。如:

static constraints = {

        tmallId(unique: true) //唯一性

        goodsSn(blank: true) //可否为空

  login(size:5..15, blank:false, unique:true)

  password(size:5..15, blank:false)

  email(email:true, blank:false) age(min:18, nullable:false)    

}

 

vi. 基于domain的查询

1) 使用Hibernate CriteriaBuilder 进行查询,例子如下:

def searchClosure = {

if (params.qStatus) {

       eq('status',Integer.parseInt(params.qStatus))

             }         

}//过滤条件status  = 传入的qStatus

def c = GoodsTmallInfo.createCriteria()

def relates = c.list(params, searchClosure)

2) 使用domain中的find进行查询

 

GoodsTmallRelate.findAllByIsAvaliableAndUpdateTimeLessThanEquals(1,time,[offset:0,max:20,sort:"updateTime",order: "desc"])

6. Controller

控制器处理请求并返回响应,调用业务逻辑返回视图或者文本。控制器位于 grails-app/controllers 目录下,创建控制器的命令是 grails create-controller User,这就创建了一个控制器类UserController

class UserController {

    def index() { }

}

一个控制器里可以定义多个操作,用于处理不同的请求url。默认情况下,一个控制器名和一个操作名组合而成的url,对应了相应的控制器和处理方法,比如 /user/list对应的处理类就是UserController和处理方法list。也可以通过修改配置文件grails-app/conf/UrlMappings.groovy来修改默认的映射关系。默认情况下,每次请求都会新建一个Controller实例,也可以修改默认的生命周期。

3) 控制器中可用的变量

a) request – http请求对象

b) response – http响应对象

c) session – 会话对象

d) servletContext -  ServletContext 对象,整个应用共享的对象

e) flash – flash对象,该对象的生命周期是两次请求,下次请求到来后即消失

f) params – 请求参数对象,可以从中获取参数

g) actionName – 当前正在被调用的操作名

h) controllerName – 当前正在被调用的控制器名

i) grailsApplication – 当前正在运行的应用对象,可以从中获取application.properties文件中的配置

j) applicationContext – Spring上下文对象

4) 请求转发渲染render

a) 直接返回文本 : renders “Hello”

b) 转发到一个视图,并且传入model参数。render(view: "viewName", model: [book: theShining])

c) 转发到一个视图,并且以当前控制器作为model参数。render(view: "viewName")

d) 返回json格式的文本。render Book.list(params) as JSON

e) 返回xml格式的文本。render Book.get(params.id) as XML

5) 重定向redirect

a) 重定向到当前控制器的一个操作 :redirect(action: "show"),表示重定向到当前控制器的show方法

b) 重定向到某个控制器的某个方法:redirect(controller: "book", action: "list")

c) 带参数的重定向:redirect(action: "show", id: 4, params: [author: "Stephen King"])

d) 重定向到uri:redirect(uri: "book/list")

e) 重定向到其他域名:redirect(url: "http://www.baidu.com")

6) URL映射

默认情况下一个url:/controller/action/id对应了处理的控制器和处理方法,以及传入的id参数。通过修改grails-app/conf/UrlMappings.groovy文件来修改默认配置。

a) 映射到控制器和操作:"/product"(controller: "product", action: "list")

b) 映射到uri:"/hello"(uri: "/hello.dispatch")

c) 映射到视图:"/hello"(uri: "/hello.dispatch"),直接映射到GSP文件grails-app/views/index.gsp 

d) 映射到响应码:

static mappings = {

   "403"(view: "/errors/forbidden")

   "404"(view: "/errors/notFound")

   "500"(view: "/errors/serverError")

}

当http响应码为不同的数字时,对应不同的gsp页面。

e) 映射到http方法:

static mappings = {

   "/product/$id"(controller:"product") {

       action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]

   }

}

当请求方法为GET时对应的处理方法为show,PUT对应的处理方法是update,以此类推。

 

 

7. Service

一般复杂的业务逻辑处理放在服务层,在Controller中调用。

创建服务的命令是grails create-service user

该命令在目录grails-app/services/下创建一个服务Class,UserService.groovy

默认情况下,grails只创建一个实例,并且调用方法是非同步的。grails自动定义一个bean,实例名即是将类名首字母小写的字符串。可以定义scope变量来设置Service的生命周期。

· prototype – 每次调用都创建一个新的实例

· request –每一个请求创建一个新的实例

· flash – 只有当前请求和下次请求对以一个实例

· flow – 同一个webflow对以一个实例

· conversation – 同一个webflow会话对以一个实例

· session – 同一个用户会话对应一个实例

· singleton (default) – 整个应用公用一个实例,默认

事务处理:默认情况下,Service中的每一个方法都在同一个事务管理之下,默认事务的传播级别是PROPAGATION_REQUIRED。可以通过设置变量

static transactional = false 取消事务。

注意事项:

l 只有通过依赖注入的Service才有事务处理,即只有通过def userService这种方式获取才有事务处理,如果是通过New UserService()新建的Service对象没有事务处理。

l Service中的方法只有抛出java.lang.RuntimeException,事务才会回滚。即Service中抛出的异常必须是java.lang.RuntimeException的子类,而不能是java.lang. Exception子类,否则事务将失效。

Service调用:可以直接在Controller中引用Service

class UserController {

    def userService

    …

}

也可以在其他的Servcie或者Domain中直接引用。

也可以在java中引用Service bean,通过grails-app/conf/spring/resources.xml中依赖注入

<bean id="bookConsumer" class="bookstore.BookConsumer">

    <property name="userStore" ref="userService" />

</bean>

 

groovy sql事务:

def sql = new Sql(dataSource_brand)

sql.withTransaction {

            sql.executeUpdate("update who_goods_stock g set g.num = g.num - :outNum where g.num - g.lock_num >= :outNum and g.id = :stockid",[outNum:params.outNum,stockid:params.stockId])

        

        }

抛出异常时回滚

 

 

 

 

8. Filter

过滤器即servlet中的Filter,通过设置规则来限定某些url请求和响应必须经过Filter的拦截,一般用于登陆验证、编码转换或者日志处理等。过滤器是位于grails-app/conf 目录下的groovy类。Grails中创建过滤器的命令是

grails create-filters Security

class SecurityFilters {

    def filters = {

        loginCheck(controller: '*', action: '*') {

            before = {

                if (!session.user && !actionName.equals('login')) {

                    redirect(action: 'login')

                    return false

                }

            }

        }

    }

}

控制器Controller能使用的内置变量,在Filter中都可以使用。

过滤器匹配规则可以是按照controller名字或者action名字,也可以根据uri匹配

a) 根据控制器名和操作名:

all(controller: '*', action: '*') {

}

匹配所有的控制器和操作

b) 只匹配控制器:

justBook(controller: 'book', action: '*') {

}

只要控制器名为book即匹配

c) 使用反转关键字

notBook(controller: 'book', invert: true) {

}

只要控制器名不是book即匹配

d) 根据操作名匹配

saveInActionName(action: '*save*', find: true) {

}

只要操作名包含save即匹配

e) 组合匹配

actionBeginningWithBButNotBad(action: 'b*', actionExclude: 'bad*', find: true) {

}

操作名以b开头,但是不能以bad开头

f) 根据uri匹配

someURIs(uri: '/book/**') {

}

以book开头的uri即可

g) 匹配所有的uri

allURIs(uri: '/**') {

}

h) 排除部分uri

all(controller:'*', action:'*',uriExclude:'/tbAuth/*') {

}

排出了以/tbAuth/开头的uri

 

关键字说明:

controller :控制器名,*表示所有控制器

controllerExclude:排出的控制器名

action:匹配的操作名

actionExclude :排除的操作名

regex :是否启用正则表达式,true或者false,默认true

uri :匹配的uri,如 /user/list

uriExclude:排除的uri,等价于uri:/user/list,invert:true

invert:是否反转规则,默认false

find :是否按照正则表达式匹配,默认true

注意:全部用*,不要用.*

 

过滤器可以在请求处理过程中多个不同位置进行拦截处理

拦截器类型:

before:请求到来后,操作执行之前执行

after:操作执行后,视图渲染之前执行,可以修改model参数

afterView:视图渲染之后,布局之前执行,可以处理异常参数

9. Plugin

q) 插件机制是Grails的一个重要特性,它提供了大量的插件可以对项目方便的进行扩展。

r) 关于插件的命令:

i. grails list-plugins 查看可用的插件

ii. grails install-plugin [插件名] 安装插件

iii. grails uninstall-plugin [插件名]  删除插件

s) 实例 使用Quartz定时插件

i. 首先安装Quartz 插件

ii. 安装完后会在grails-app目录下生成jobs目录

iii. 创建定时任务,grails create-job [任务名]

iv. 定义执行时间规则

1) 定义间隔时间:static triggers = {simple repeatInterval: 28800000l // 执行间隔 8小时}

2) 或用Cron表达式更灵活的配置:

static triggers = {cron name: 'myTrigger', cronExpression: "0 0/1 * * * ?"}

推荐一下Cron表达式在线生成器:

http://www.becron.com/

 

10. 整合前端框架 JQuery EasyUI

t) 在GSP页面引入 EasyUI的js包。

u) 在不修改Easy UI js包的前提下,修改Easy UI关于分页的参数与GSP页面默认的分页参数进行结合。

//分页参数

Integer num = params.rows as Integer//每页记录数

params.max = Math.min(num, 100) //限制每页最大100条

params.offset =  page == 1?0:(page-1)*num //开始条数

v) 返回json格式的数据,并调整为适应Easy UI的格式

render(contentType: "text/json") {

            rows = array { //列表内容

                for (GoodsTmallRelate b in relates) {

                    tmallInfo id:b.id,

                            goodsId: b.goodsId ,

                           

                }

            }

            total = relates.totalCount  //总记录数

        }

11. 配置说明

w) Config.groovy

i. 配置GSP页面修改实时生效,可区分环境进行分别配置

environments {

    development {

        grails.logging.jul.usebridge = true

        //使修改的页面实时生效

        grails.gsp.enable.reload = true

        def  classpath = "${appName}/WEB-INF/grails-app";

        grails.reload.location=classpath

    }

    production {

        grails.logging.jul.usebridge = false

    }

}

ii. log4j的相关配置

log4j = {

   appenders {

        rollingFile name:"file", maxFileSize:1024, file:"web-app/log/info.log"

        console name: 'stdout'  ,layout: pattern(conversionPattern: "%d [%p] %l%n%m%n%n")

        appender new DailyRollingFileAppender(

                name: "dailyFile",

                file: "web-app/log/info.log",

               datePattern: "'.'yyyy-MM-dd",

              layout: pattern(

                        conversionPattern:

                                "%d [%p] %l%n%m%n%n"

                )

        )

    }

    environments {

        development { //开发环境

            root {

                info  'stdout'

                additivity = true

            }

        }

        production {  //生产环境

            root {

                info 'stdout','dailyFile'

                additivity = true

            }

        }

        test {    //测试环境

            root {

                debug 'dailyFile'

                additivity = true

            }

        }

    }

error  'org.codehaus.groovy.grails.web.servlet',        // controllers

            'org.codehaus.groovy.grails.web.pages',          // GSP

            'org.codehaus.groovy.grails.web.sitemesh',       // layouts

            'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping

            'org.codehaus.groovy.grails.web.mapping',        // URL mapping

            'org.codehaus.groovy.grails.commons',            // core / classloading

            'org.codehaus.groovy.grails.plugins',            // plugins

            'org.codehaus.groovy.grails.orm.hibernate',      // hibernate integration

            'org.springframework',

            'org.hibernate',

            'net.sf.ehcache.hibernate'

}

iii. hibernate 缓存配置

grails.hibernate.cache.queries = false

默认不使用缓存,但可在重要需要缓存的查询后面加上 cache: true 进行缓存

x) DataSource.groovy  数据源配置文件

1.可以把数据库地址用户名等配置到一个properties文件中,方便部署后的更改。

def dataConf = PropertiesLoaderUtils.loadProperties(new ClassPathResource('application.properties'))

 

2. 可以分为开发环境,生产环境,测试环境分别配置相应的数据源。

 

3. 一个环境可以配置多个数据源,在domain类中声明可用于哪几个数据源。持久化操作时可以选择相应的数据源进行操作。

static mapping = {

        datasources(['brand','home']) //在domain中进行多数据源的配置

}

 

Goods.brand.get(id)  //使用时可以选择不同的数据源进行操作

4. 数据源配置可以开启使用连接池,默认使用DBCP连接池。

  pooled = true  //开启连接池

            properties{   //连接池相关配置

                maxActive = 50

                maxIdle = 25

                minIdle = 5

                initialSize = 5

                minEvictableIdleTimeMillis = 60000

                timeBetweenEvictionRunsMillis = 60000

                maxWait = 10000

                validationQuery = "/* ping */"

            }

 

y) UrlMappings.groovy

i. 配置访问连接与资源的映射。

默认为 http://domain/controller/action/param

z) resources.groovy

i. 定义一些需要spring控制的bean

 

12. 碰到的问题

aa) 不通过domain直接操作数据库

i. 直接在service里定义def dataSource变量,Grails会自动注入。

ii. 然后获取数据库链接 def conn = dataSource.getConnection()

iii. 通过jdbc操作数据库

1) PreparedStatement ps = conn.prepareStatement("SELECT s.shipping_id,s.`shipping_code`,s.`shipping_remark`,s.`logo_image`,s.`calc_rule`,s.`weight_limit`,s.`lenth_limit`,s.`first`,s.`additional`,sa.shipping_area_id,sa.first_price,s.shipping_name FROM `who_shipping` s RIGHT JOIN (SELECT * FROM `who_shipping_area` sa WHERE sa.`enabled`=1 AND sa.`shipping_area_id` IN (SELECT ar.`shipping_area_id` FROM `who_shipping_area_region` ar WHERE ar.`region_id` = ?)) AS sa ON s.shipping_id = sa.`shipping_id` ORDER BY s.`sort`");

2) ResultSet rs = ps.executeQuery();

ab) 定时任务重复执行

i. 通过自动部署工具部署Grails时,会发生Grails定时插件Quartz定时任务重复执行两次的情况。

1) 手工部署就没有这个问题

2) 修改tomcat的server.xml

a) <Host name="localhost" debug="0" appBase="" unpackWARs="true" autoDeploy="true">将 appBase留空。

13. 其它

a) 修改groovy代码后自动编译生效

i. 在Idea的Edit configurations 中配置VM options 如下:

 

-server

-javaagent:/opt/local/share/java/grails/lib/org.springsource.springloaded/springloaded-core/jars/springloaded-core-1.1.1.jar

-noverify

-Dspringloaded=profile=grails

 

黄色部分路径根据实际情况修改

 

Grails框架的敏捷开发详解与实践 本文还有配套的精品资源,点击获取 简介:Grails框架基于Groovy语言,借鉴Ruby on Rails的理念,提供了强大的Web应用开发能力。它集成了GORM进行数据库操作,并使用GSP作为视图技术。本文将指导读者完成Grails的安装、应用程序创建、核心概念理解、安全性配置、插件使用以及服务部署等敏捷开发关键步骤。通过实践学习Grails,开发者能够快速提高Web开... 阅读详情

相关推荐

Grails中文API文档:掌握高效Web开发

Grails是一个基于Groovy语言的全栈Java框架,广泛用于开发动态Web应用程序。它基于MVC架构模式,通过约定优于配置的理念,简化了配置和代码生成。Grails框架集成了Spring、Hibernate等强大的后端技术,为开发者提供了快速、高效的应用开发解决方案。本章将介绍Grails的基本架构和特点,以及如何搭建Grails开发环境,为后续深入了解领域模型、服务层、控制器和视图层等内容打下基础。在安装和配置Grails之前,请确保您的开发环境已安装JDK 8或更高版本,并配置好环境变量。

weixin_36289742的博客 688

Grails框架使用教程

第一章 grails框架简介 1.1 简介 Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。 第二章 grails使用 2.1 教程环境介绍 ▲系统:windows10 ▲grails框架:2.4.4 ▲jdk版本: java version "1.8...

冰羽IOX的专栏 1万+

Grails超全操作手册(中文版)

Grails超全中文操作手册,无论是大神还是初学者都很适用的操作文档。很全很详细,希望能帮到学习grails框架的你。

安全基础--29--Grails开发基础操作与配置

本篇介绍了: 1、Grails安装 2、Grails项目的创建与运行 3、以指定环境运行Grails项目 4、Grails项目数据库搭建与配置

武天旭的博客 2023

grails 中文手册

grails 中文手册,grails应该不用说明是啥东西了吧,流行的脚本语言groovy应用框架。

ks-快手滑块验证码-Js逆向

本文分析了快手滑块验证码的破解过程。首先通过抓包找到验证码背景图接口,发现需要动态获取captchaSession参数。然后深入分析验证流程,发现verifyParam参数被加密处理,需要追踪其生成逻辑。文章详细解析了加密参数c的构成,包括captchaSn、滑动距离、轨迹信息等,并指出轨迹验证较为严格。最后通过对比浏览器和本地生成的加密值,确认加密逻辑正确,但指出轨迹生成仍需优化。作者建议参考相关文章深入分析轨迹逻辑,并提供了验证成功的截图作为参考。

2302_76420666的博客 1875

The+Definitive+Guide+to+Grails+Second+Edition.pdf

Grails开发手册第二版

lixor 135

Rocky Linux 9 离线环境Docker部署实战:从依赖打包到服务启动

本文提供了一份详尽的Rocky Linux 9离线环境Docker部署实战指南。针对无法访问外网的生产或内网服务器,文章详细讲解了如何在联网跳板机上下载Docker二进制包及所有系统依赖RPM包,并完成打包。随后,手把手指导在离线服务器上进行依赖安装、二进制文件部署、systemd服务配置、SELinux与防火墙调优,最终实现Docker服务的成功启动与验证。

weixin_28363123的博客 136

将Grails应用程序转换为插件,反之亦然

上周我和家人一起去伦敦度假,很幸运在我访问期间举行了伦敦GGUG聚会。 David Dawson讨论了将Grails应用程序重构为多个插件的过程(您可以在此处查看他的演讲视频)。 他提到的一件事是可以像独立应用程序一样运行插件的想法,因为Grails应用程序和插件的结构是如此相似,我认为研究将应用程序转换为插件或插件的过程会很有趣。应用程序插件。 我将在这里讨论的方法包括很多关于我喜欢如...

686

SAP Ariba Procurement_Catalogs

SAP Ariba Procurement_Catalogs Search Functionality PunchOut Catalogs Spot Buy catalog

CZxx1的博客 1011

【实战】——零代码玩转Supervisely人像分割:从标注到模型训练的数据流水线搭建

本文详细介绍了如何零代码使用Supervisely平台搭建人像分割数据流水线,从智能标注到数据集格式转换,再到模型训练与优化。Supervisely的智能标注工具和协作功能大幅提升了人像分割项目的效率,特别适合视频会议背景虚化、虚拟试衣等应用场景。

weixin_30694389的博客 413

Grails 1.2 文档引擎速记

Grails 1.2中新增了文档引擎,通过这个引擎,我们也可以产生如Grails参考文档般的项目手册。因此,现在的Grails1.2工程可以产生3种文档:gapi、api和manual。前两种分别对应Groovy和Java的文档注释,而Manual则对应项目的参考文档。对于文档注释,应该没什么可说的了,这是任何Java和Groovy开发者都非常熟悉的内容。这里我们只关心Manual的创

mousehu的专栏 327

避坑指南:C#调用CodeSoft打印标签时常见的5个错误及解决方法

本文总结了C#调用CodeSoft打印标签时常见的5个核心错误及解决方案,涵盖环境配置、模板加载、变量赋值、打印机切换和资源管理。重点解析了如何避免COM对象创建失败、模板路径错误、变量名不匹配、打印机切换异常及内存泄漏等问题,帮助开发者实现稳定高效的标签打印集成。

weixin_29215815的博客 222

常用技术手册汇总

各种技术参考手册汇总!0.Grails中文参考手册下载http://wiki.redsaga.com/confluence/pages/viewpage.action?pageId=24581.MySQL5.1参考手册http://dev.mysql.com/doc/refman/5.1/zh/index.html2.Seam2.0 GA 中文参考手册http://www.

240

基于ESP32的智能停车场管理系统开发

智能停车场管理系统通过引入物联网(IoT)技术,实现对停车场内车辆的实时监控、空闲车位的管理、车辆的入场与出场控制等功能,大大提高了停车场的利用率和管理效率。通过集成物联网技术、云平台以及先进的传感器和执行器,系统不仅能实时监控停车场的车位状态,还能提供更好的用户体验。本文将介绍如何基于ESP32开发一个智能停车场管理系统,涵盖系统架构、硬件选择、软件开发以及最新技术的应用,帮助开发者实现高效的智能停车管理。ESP32的代码主要负责处理车位传感器的数据,控制LED指示灯的状态,以及与云平台进行数据交互。

2201_76125393的博客 910

SPAD IMX479规格_VOP

对于VOP的定义,很多人可能是不理解这一路的供电,实际上这一路供电是非常重要的,这是给器件SPAD供电,决定SPAD是否work,在大部分的paper以及大部分公司,基本都是叫VOP,名称是SPAD breakdown voltage power supply,严格意义上叫Operating Voltage,工作电压。当然有些公司也有一些其他叫法就不提了。其实大家可以明显的看出,典型值-20.5没有发生变化,市面上绝大多数VOP的典型值也都是在-20V这边。

致力于lidar应用开发 701

Grails环境部署开发

 1       内容简介该部分主要介绍了Grails的开发环境配置,开发第一个简单的web服务,将应用部署到发布平台. 2       开发平台搭建2.1    组件Eclipse:业界广泛采用的java开发环境,开源的,最优秀的开发软件之一Groovy的Eclipse插件: Groovy 的 Eclipse 插件能够编辑,编译以及运行 groovy 脚本和类,这个插

百事乐 7602

LDRA Testbed(TBrun)软件单元测试_实例讲解(对多次调用的函数打桩)

在之前的文章《LDRA Testbed(TBrun)软件单元测试_操作指南》中,已经讲解了如何使用TBrun进行软件单元测试的基本操作步骤。本篇文章将结合实例进一步讲解被测函数中包含多次调用其他函数时,如何对其打桩来实现测试目的(详细的操作流程本文不再重述,若有不清楚的,可以结合之前的操作指南一起来看)。本文以一个被测函数作为示例,讲解了如何使用Testbed(TBrun)对涉及到多次调用其他函数的被测函数进行单元测试。本文的示例可能比较简单,但是思路、方法和流程都是通用的,希望对大家有所帮助。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1461

在Eclipse中开发Grails项目

在Eclipse中开发Grails项目  1、环境变量:配置GRAILS_HOME,GRAILS_HOME所指的目录是Grail的根目录.用Grails命令行创建项目:grails create-app提示输入项目名,假设输入GrailsTest为项目名。2、Eclipse装上Groovy-Eclipse插件,可以使用link方式。3、导入Grails工程,如果工程

Colin的专栏 4094

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

grails 框架学习

GRAILS 学习笔记-netdevgirl                 Grails采用动态方法减小了Java平台上进行Web开发的复杂度,不过与其它框架不同的是,Grails是构建在Spring和Hibernate等Java已有的技术之上的。         Grails是一个full-stack框架,它借助于核心技术与相关的插件(plug-in)来解决Web开发中方方面面

netdevgirl的专栏 5254

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Groovy,Grails,Netbeans安装配置手册

http://tech.ddvip.com/2008-08/121964507057746.html         本文针对Groovy和Grails的新人编写,如果你已经很熟悉,就请打住,以免耽误你的时间,如果你有闲情,请对本文提出批评并指正。  Groovy,运行在JVM上的动态语言,语法与Java语法类似,大受Java程序员喜爱,而且直接支持Java语法。Grails,基于

yuanjing1815的专栏 644

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

groovy+grails+gradle开发

近期进了一家新公司,所用的技术栈就是:groovy+grails+gradle 技术介绍网上还是比较少的,我也是第一次接触; groovy: Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy也可以使用其他非Java语言编写的库(百度百科) 详细介绍&&教程:https://www.w3cscho

qq_40297463的博客 1238

在Eclipse中配置Grails工程

在Eclipse中配置Grails工程OK,有点麻烦,闲话少叙。1、环境变量:配置GRAILS_HOME,注意一定要配置到build.xml所在的文件夹: 2、Eclipse装上Groovy-Eclipse插件,可以使用link方式。3、导入Grails工程,并选中"Copy projects into workspace"4、工程的属性中,选中:这样就阻止了g

四火专栏 6600

Grails的controller开发

1.建立Controller ①建立一个空的Controller,输入框里输入名称(系统自动在其名字后加上Controller) ②生成一个普通增删改的controller,不带GSP,输入框里输入domain的类全名 ③生成增删改查的controller,带gsp,输入框里输入domain的类全名。     若选①,则生成出这样一个Controller:   package ...

像树懒一样写程序 509

Grails 简介

Grails   Groovy 是基于Java的动态语言,完全兼容Java语法,Grails 是基于Groovy的开发框架。简单说就是,Groovy是语言,Grails是框架。   Grails - 简介   Grails 是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。   ...

博客颜色 650
上一篇: grails命令备忘录
下一篇: Grails框架优劣势分析及同类比较
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值