使用Spring Roo构建项目

  • 使用Spring Roo构建项目

    • 结构概述 Architectural Overview
    • 关键技术 Critical Technologies
    • 实体层 Entity Layer
      • 1 初始化项目
      • 2 安装持久化工具
      • 3 创建实体
      • 4 创建字段
    • 网络层 Web Layer
      • 1 建立Web层
      • 2 创建控制器
    • 服务层 Services Layer
    • 库层 Repository Layer
    • Maven
    • JSON Add-On

使用Spring Roo构建项目

1. 结构概述 Architectural Overview

Spring Roo专注于Java企业应用的开发。在当前的应用版本2.0.0.M1中,构建的应用将以关系数据库为基础,采用JPA标准对数据持久化,并大量使用了Spring框架中的依赖注入和事务管理,以及JUnit测试,利用Maven进行项目的配置,以Spring MVC为基础将JSP作为视图。

使用Roo创建的项目和传统项目相比,Roo创建的项目去掉了一些不必要的的抽象层。大多数的Java企业应用都包含DAO层、domain层和controller层。而在一个使用Roo构建的典型项目中,你将只会用到entity层(这有点类似于domain层,但似乎又结合了DAO层和Services层)和web。当然,如果你的应用的确需要,你可以添加一个services层,但是,几乎是不会添加DAO层的。

2. 关键技术 Critical Technologies

2.1. AscpectJ

2.2. Spring

3. 实体层 Entity Layer

大家在使用Roo时,都应该遵循如下的几个步骤:

3.1. 初始化项目

3.2. 安装持久化工具

3.3. 创建实体和字段

3.1. 初始化项目

> mkdir demo
> cd demo
roo> project setup --topLevelPackage cn.edu.cqupt.demo

3.2. 安装持久化工具

roo> jpa setup --database MYSQL --provider HIBERNATE
roo> database properties set --key database.url --value jdbc:mysql://localhost:3306/cblog?useUnicode=true&characterEncoding=utf-8
roo> database properties set --key database.username --value root
roo> database properties set --key database.password --value root

打印信息(仅列出一部分信息)

Updated SPRING_CONFIG_ROOT\applicationContext.xml
Created SRC_MAIN_RESOURCES\META-INF\persistence.xml
Updated SPRING_CONFIG_ROOT\database.properties

路径常量:

SPRING_CONFIG_ROOT -> src\main\resources\META-INF\spring

SRC_MAIN_RESOURCES -> src\main\resources\META-INF

jpa setup命令指定了使用MYSQL数据库、HIBERNATE映射工具。database properties命令修改的是database.properties文件中的信息。数据源的相关配置是在applicationContext.xml文件中,使用的是dbcpHIBERNATE的配置是在persistence.xml文件中。

3.3. 创建实体

entity jpa --class ~.domain.Admin

打印信息(部分)

Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\domain\Admin.java
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\domain\Admin_Roo_Configurable.aj
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\domain\Admin_Roo_Jpa_Entity.aj
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\domain\Admin_Roo_Jpa_ActiveRecord.aj
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\domain\Admin_Roo_ToString.aj

路径常量:

SRC_MAIN_JAVA\cn -> src\main\java

从打印的信息中可以看出,有创建如下几个文件:

- Admin.java 基础类文件

- Admin_Roo_Configurable.aj 不知道干嘛用的

- Admin_Roo_Jpa_Entity.aj 包含实体的versionid属性,注意,versionid属性是和@RooJpaActiveRecord有关,而不是@RooJavaBean

- Admin_Roo_Jpa_ActiveRecord.aj 主要是实体的CRUD操作,对应实体中@RooJpaActiveRecord注解

- Admin_Roo_ToString.aj 实体的toString()方法,对应实体类中@RooToString注解

The generated method takes care to avoid circular references that are commonly seen in bidirectional relationships involving collections

这个方法(toString)需要注意避免循环引用,尤其是在涉及集合的双向关系时。

3.4. 创建字段

roo> field string --fieldName username --class ~.domain.Admin --notNull --sizeMax 30 --unique
roo> field string --fieldName passwd --class ~.domain.Admin --notNull --sizeMax 60 --sizeMin 6

打印信息

Updated SRC_MAIN_JAVA\cn\edu\cqupt\demo\domain\Admin.java
Updated SRC_MAIN_JAVA\cn\edu\cqupt\demo\domain\Admin_Roo_Jpa_ActiveRecord.aj
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\domain\Admin_Roo_JavaBean.aj

创建文件Admin_Roo_JavaBean.aj,包含实体的settergetter,对应实体类中@RooJavaBean注解。

创建的这些实体将会采用JPA注解的标准一一映射到数据库中的表,而你无需关心具体使用了哪些注解。

The first time you use one of these Roo field commands, Roo will add required JavaBean Validation API libraries to your project (i.e. these libraries will not be in your project until you decide to first use JavaBean Validation).

尚未读到JavaBean Validation

这些AscpectJ ITDs中声明的方法将会添加到Admin.class内。

所以,总结一下

注解名称 作用
@RooJpaActiveRecord 实体的versionid属性、CRUD操作
@RooToString 实体的toString()方法
@RooJavaBean 实体的settergetter

Admin_Roo_Jpa_ActiveRecord.aj中方法概览:

方法名称 描述
entityManager() 获取entityManager
countAdmins() 获取admin的记录总数
findAllAdmins() 查询所有的admin记录
findAllAdmins(String sortFieldName, String sortOrder) 查询admin记录,sortFieldName为排序属性,sortOrder为升序或降序
findAdmin(Long id) 通过id查找admin
findAdminEntries(int firstResult, int maxResults) firstResult指定查找的第一个记录,maxResult指定查找的最大记录
findAdminEntries(int firstResult, int maxResults, String sortFieldName, String sortOrder) 同上,分页并排序
persist() 持久化某实体
remove() 移除某实体
flush() 将持久化的上下文内容同步到底层数据库
clear() 清除持久化上下文内容,是所有管理的实体都处于游离状态
merge() 合并给定的实体的状态到当前的持久化上下文

4. 网络层 Web Layer

Scaffolded web controllers always delegate directly to methods provided on an @RooJpaActiveRecord class.

网络层的控制器总是直接将操作委派给@RooJpaActiveRecord标注的类。接下来生成的AdminController内部的方法都是直接调用Admin中持久化的方法。

If you write a web controller by hand (perhaps with the assistance of the web mvc controller command), it is recommended you also use the methods directly exposed on entities.

所以当你自己需要定义一个controller时,也建议直接使用实体中持久化的方法。

Most Roo applications will place their business logic between the entities and web controllers, with only occasional use of services layers.

大多数的Roo应用将他们的业务逻辑放在Entity层和Controller层之间,因此偶尔会使用到Service层。

4.1. 建立Web

命令:

roo> web mvc setup

打印信息(部分):

Created ROOT\src\main\webapp\WEB-INF\spring\webmvc-config.xml
Created ROOT\src\main\webapp\WEB-INF\web.xml
Created ROOT\src\main\webapp\WEB-INF\i18n\messages.properties

这个命令将一个普通的Java项目转变成了一个Web项目,同时为项目添加了必要的依赖。

4.2. 创建控制器

命令:

roo> web mvc all --package ~.web

打印信息(部分):

Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\web\AdminController.java
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\web\ApplicationConversionServiceFactoryBean.java
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\web\AdminController_Roo_Controller.aj
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\web\ApplicationConversionServiceFactoryBean_Roo_ConversionService.aj

这个命令会自动检测项目中的实体,为每个实体创建控制器。ApplicationConversionServiceFactoryBean是定义的各种转换器。

AdminController_Roo_Controller.aj中定义的请求映射:

方法名 URL 参数 参数说明 请求方式 返回的视图
create /admins admin 待创建实体的属性 POST 参数错误:admins/create 创建成功:redirect:/admins/{id}
createForm /admins?form GET admins/create
show /admins/{id} GET admins/show
list /admins page size sortFieldName sortOrder roo 自动生成分页参数 均非必需 GET admins/list
update /admins admin 待修改实体的属性 PUT 参数错误:admin/update 修改成功:redirect:/admins/{id}
updateForm admin/{id}?form GET admins/update
delete /admins/{id} page size 需删除的页数和页宽 均非必需 DELETE redirect:/admins

5. 服务层 Services Layer

大多数Roo构建的应用很少需要Services层的,因为大多数的逻辑都可以放在web层或实体的方法中。但像如下的几种情况可能会用到services层:

- 业务逻辑跨越了多个实体

- 你需要调用web请求之外的业务逻辑,如定时器任务

- 远程客户端访问,通过一个远程协议直接提供方法(这个我还没读到)

- 降低web层的耦合,使web层只用于HTTP相关的管理,而services层只处理业务逻辑

- 需将事务边界和安全认证的元数据放在services

命令:

roo> service all --interfacePackage cn.edu.cqupt.demo.service

打印信息(部分):

Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\service\AdminService.java
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\service\AdminServiceImpl.java
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\service\AdminService_Roo_Service.aj
Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\service\AdminServiceImpl_Roo_Service.aj

AdminService_Roo_Service.aj中定义了接口,AdminServiceImpl_Roo_Service.aj是接口中方法的实现。

方法概览:

Services层中的方法 调用了实体层的方法
countAllAdmins() Admin.countAdmins()
deleteAdmin(Admin admin) admin.remove()
findAdmin(Long id) Admin.findAdmin(id)
findAllAdmins() Admin.findAllAdmins()
findAdminEntries(int firstResult, int maxResults) Admin.findAdminEntries(firstResult, maxResults)
saveAdmin(Admin admin) admin.persist()
updateAdmin(Admin admin) admin.merge()

6. 库层 Repository Layer

在当前版本,Roo暂不支持不同的库层。

7. Maven

这一层的东东也不太会使。还是用工具导吧,shell容易报错。

8. JSON Add-On

命令:

> json all

打印信息:

Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\domain\Admin_Roo_Json.aj

Roo是使用FlexJSON实现实体与JSON格式的数据之间的转换的。

Admin_Roo_Json.aj中方法概览:

方法名称 描述
toJson() admin转为JSON字符串,去除*.class属性
toJson(String[] fields) 同上,包含属性fields,去除*.class属性
fromJsonToAdmin(String json) JSON字符串转为admin
toJsonArray(Collection<Admin> collection) admin集合转为JSON字符串,去除*.class属性
toJsonArray(Collection<Admin> collection, String[] fields) 同上,包含属性fields,去除*.class属性
fromJsonArrayToAdmins(String json) JSON格式字符串转为admin集合

命令:

> web mvc json all

打印信息:

> Created SRC_MAIN_JAVA\cn\edu\cqupt\demo\web\AdminController_Roo_Controller_Json.aj

AdminController_Roo_Controller_Json.aj中定义的请求映射,请求头均包含Accept=application/json

方法名 URL 参数 参数说明 请求方式 返回的结果
showJson /admins/{id} GET ResponseEntity<String>
listJson /admins GET ResponseEntity<String>
createFromJson /admins admin JSON格式的admin POST ResponseEntity<String>
createFromJsonArray /admins/jsonArray admins JSON格式的admin数组 POST ResponseEntity<String>
updateFromJson /admins/{id} admin JSON格式的admin PUT ResponseEntity<String>
deleteFromJson /admins/{id} DELETE ResponseEntity<String>

对第三个新建admin的这个接口我测试了一下,不返回任何结果表示成功创建了:

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://localhost:8080/cblog/admins");
httpPost.addHeader("Accept", "application/json");

try {
    StringEntity entityParam=new StringEntity("{\"passwd\":\"123456\",\"username\":\"xiaofeig\"}");
    httpPost.setEntity(entityParam);
} catch (UnsupportedEncodingException e1) {
    e1.printStackTrace();
}

CloseableHttpResponse response=null;
InputStream instream=null;
try {
    response = httpclient.execute(httpPost);
    HttpEntity entity = response.getEntity();
    if (entity != null) {
        instream = entity.getContent();
        byte[] b = new byte[200];
        int len = -1;
        StringBuilder strBuilder = new StringBuilder();
        while ((len = instream.read(b)) > 0) {
            strBuilder.append(new String(b, 0, len));
        }
        System.out.println(strBuilder.toString());
    }
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}finally{

    if(instream!=null){
        try {
            instream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    if(response!=null){
        try {
            response.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    if(httpclient!=null){
        try {
            httpclient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

由于adminusername属性是unique,所以当我再次运行上面的代码时,返回了如下的结果:

{"ERROR":org.hibernate.exception.ConstraintViolationException: could not execute statement; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement"}

大家仔细看,就会发现上面的信息JSON格式有点不标准,value部分左边少了个引号,回到Roo自动生成的代码部分,的确是少写了一个引号。

return new ResponseEntity<String>("{\"ERROR\":"+e.getMessage()+"\"}", headers, HttpStatus.INTERNAL_SERVER_ERROR);
时间: 2024-10-26 20:14:47

使用Spring Roo构建项目的相关文章

Spring Boot 构建项目时报错:You need to run build with JDK or have tools.jar on the classpath.If this occures during eclipse build make sure you run eclipse under JDK as well (com.mysema.maven:apt-maven-plugi

You need to run build with JDK or have tools.jar on the classpath.If this occures during eclipse build make sure you run eclipse under JDK as well (com.mysema.maven:apt-maven-plugin:1.1.3:process:default:generate-sources) 1. 仔细的看看自己的电脑的环境变量有没有配置错误,我的

springmvc+spring+mybatis+maven项目构建

1.首先在myeclipse10中安装maven的插件,将插件放入D:\Program Files (x86)\myEclipse10\MyEclipse Blue Edition 10\dropins\maven中, 2. 新建文件:maven.link填入如下内容:path=D:/Program Files (x86)/myEclipse10/MyEclipse Blue Edition 10/dropins/maven 3.重启myeclipse插件安装成功. 4.在myeclipse10

使用http://start.spring.io/构建maven微服务项目的几个坑及eclipse构建spring boot微服务项目

一,使用http://start.spring.io/构建maven微服务项目 本来嘛,直接构建的项目导入时没有任何问题的导入就可以运行,可是最近构建好项目,然后导入,种种报错 1.导入之后POM报错 将parent版本更改下,将2.1.6改为2.0.1就可以消除错误 2.启动报错,直接退出 pom中导入此依赖,问题就解决了 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g

Spring Boot构建的Web项目如何在服务端校验表单输入

本文首发于个人网站:Spring Boot构建的Web项目如何在服务端校验表单输入 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC应用,来读取用户输入并使用validation注解来检查,并且当用户输入错误时,应用需要再屏幕上显示错误信息提示用户重新输入. 首先构建Maven项目,该项目的pom文件内容如下: <?xml version="1.0" encoding="UTF-8"?>

第三章 Maven构建 Java Spring Boot Web项目

3.1   认识Srping Boot Spring Boot是一个框架,是一种全新的编程规范,它的产生简化了对框架的使用,简化了Spring众多的框架中大量的繁琐的配置文件,所以说Spring Boot是一个服务于框架的框架,服务范围是简化文件的配置. Spring Boot的核心功能: 独立运行的spring项目:可以以jar包的形式独立运行,通过Java -jar xx.jar来运行. 内嵌的servlet容器:可以选择内嵌的Tomcat.Jetty或者Undertow. 提供starte

Spring Roo

Spring Roo 是SpringSource新的开放源码技术,该技术主要面向企业中的Java开发者,使之更富有成效和愉快的进行开发工作,而不会牺牲工程完整或灵活性.无论你是一个新的Java开发人员或经验丰富的架构师,Spring Roo 都可以在短短几分钟内构建一个全面的工作应用. Spring Roo是创建Spring工程的小工具,通过一些命令可以快捷的建立Spring的项目,可以选择性的增加Spring的大部分特性. Spring 框架于 2002 年年底发布,目的在于简化 J2EE(目

MyBatis源码解析【2】构建项目

有了之前的准备,今天就要开始构建学习使用的项目了.废话不多说.开始吧. 首先我用IDEA构建了一个空的maven项目,然后加入了Mybatis的依赖. <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.4</version> </dependenc

利用Spring Roo搭建spring/springMVC/jpa(hibernate)

之前看spring实战的时候,书中提到spring roo工具,一直没有来得及尝试. 这次十一,我和女友一致认为前两天人太挤出去是受罪,于是就窝在了家里,就有了点时间来研究一下技术. 好了,言归正传 ,我比较懒,所以一直在寻找最简单的办法去完成一些事情. 对于框架集成也是如此 ,已经尝试过各种方法了,就是为了寻找更简单,实用. 本次是利用Spring Roo进行搭建,认为是目前最简单的了,并且Roo的配置几乎都是最佳实践. -------------------------------PART1

spring mvc构建WEB应用程序入门例子

在使用spring mvc 构建web应用程序之前,需要了解spring mvc 的请求过程是怎样的,然后记录下如何搭建一个超简单的spring mvc例子. 1) spring mvc的请求经历 请求由DispatcherServlet分配给控制器(根据处理器映射),在控制器完成处理后,请求会被发送到一个视图(根据viewController解析逻辑视图) 来呈现输出结果. 整理成下图所示: 2)搭建一个简单的spring mvc例子 ①创建一个maven工程,其中pom中要有spring相关