使用Ninja马上两年了,之前多多少少的都是跟着项目模仿着写,今年上半年准备从一个小项目开始从始至终走一遍;

首先官网:http://www.ninjaframework.org;

github:  https://github.com/ninjaframework/ninja

微信公众号:

aaarticlea/jpeg;base64,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IpGXJ69q/layPSgBAMmv6pwc0h5BGaAMHrQA6ikJxQDmgD+VgDNf1TZzmv5WhwelKeBjH50AJ61/VN1phHPev5XCeelACV/VOe9fysV/VOe9AH8rB60UHrRQAAZNf1Tg5oIJBGaQLg0AKSB1oByKaw5z7dK/lbPXpQB/VPX8q/XFf1T5r+VrGKAG4oIwa/qlOev6V/K2Rz0/KgD+qeiiigAooooAKKKKAE71/KxX9U/ev5WKAP6pzzQBiv5WKKAP6p8ewox7Cv5WKKAP6pySBnGa/lZIxg+9IDg0ZJNAH9U46UtIOlLQB/KvmlBJpKB1oAdjvmmng9a/qnxmv5WCc0AKOvWv6pFPP9acRkUYAFADSxB6V/K2QPWj1r+qbpQB/KwOT1p2O+aaDiv6p8YoA/lZ6V/VMBiv5WfWv6p6AEI46V/K12z61/VKRkYNAGKAP5WxyK/qjHTpS96/lY60ALgetf1SbsnGPxpxGRRtHpQB/K1tHX3ppGDX9U5Ar+VgnNAH9U9FfysUUAf1TMecYpQOOlfysA1/VOBigD+Vkdetf1SA896cRkUYAFACYz1pQMdq/lYPWigD+qiiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k=" alt="" width="178" height="178" />

---------------------------------------------------------------------------------------------------

1:准备:jdk1.8(环境变量配置)等;IDEA(开发工具);GIT(版本控制器);maven(项目构建工具);PostgreSQL(数据库);

安装过程略(如果感兴趣可以加Ninja的QQ新群:262296156或者2群:560927314)

访问ninja官网实在太慢了,于是我把整个网站抓下来了,已经分享到群里了,需要的可以直接下载

--------------------------------------------------------------------------------------------------

2:直接创建一个Ninja项目官网位置:www.ninjaframework.org/documentation/getting_started/create_your_first_application.html

------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------

直接进行maven构建;

mvn archetype:generate -DarchetypeGroupId=org.ninjaframework -DarchetypeArtifactId=ninja-servlet-archetype-simple

解释一下这句话:我们使用maven构建项目,那就用它构建一个ninja原型--maven原型构建;

在你的某个目录下使用git窗口执行上面的代码,项目自动构建完毕(交互部分窝用中文解释一下);

$ mvn archetype:generate -DarchetypeGroupId=org.ninjaframework -DarchetypeArtif
actId=ninja-servlet-archetype-simple
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources
@ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources
@ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom --
-
[INFO] Generating project in Interactive mode
[INFO] Archetype [org.ninjaframework:ninja-servlet-archetype-simple:6.0.0-rc1] f
ound in catalog remote
Downloading: https://repo.maven.apache.org/maven2/org/ninjaframework/ninja-servl
et-archetype-simple/6.0.0-rc1/ninja-servlet-archetype-simple-6.0.0-rc1.jar
Downloaded: https://repo.maven.apache.org/maven2/org/ninjaframework/ninja-servle
t-archetype-simple/6.0.0-rc1/ninja-servlet-archetype-simple-6.0.0-rc1.jar (13 KB
 at 2.8 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/ninjaframework/ninja-servl
et-archetype-simple/6.0.0-rc1/ninja-servlet-archetype-simple-6.0.0-rc1.pom
Downloaded: https://repo.maven.apache.org/maven2/org/ninjaframework/ninja-servle
t-archetype-simple/6.0.0-rc1/ninja-servlet-archetype-simple-6.0.0-rc1.pom (3 KB
at 5.1 KB/sec)
Define value for property 'groupId': : Define value for property 'artifactId': : Define value for property 'version':
1.0-SNAPSHOT: : Define value for property 'package':  : : [WARNING] Archetype is
 not fully configured
Define value for property 'groupId': : Define value for property 'artifactId': :
 [INFO] Using property: version = 1.0-SNAPSHOT
Define value for property 'package':  : : cmy //这里是packeage的名字,你可以自己定义
[WARNING] Archetype is not fully configured
Define value for property 'groupId': : cmy    
 <!-- 构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;
在某个 特定的group ID下,artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西,
Maven为项目产生的构件包括:JARs,源 码,二进制发布和WARs等。--> 
Define value for property 'artifactId': : cmy
[INFO] Using property: version = 1.0-SNAPSHOT //这里是 打包后的版本
[INFO] Using property: package = cmy          //这里是packeage的名字,你可以自己定义
Confirm properties configuration:
groupId: cmy
artifactId: cmy
version: 1.0-SNAPSHOT
package: cmy
 Y: : y
[INFO] -------------------------------------------------------------------------
---
[INFO] Using following parameters for creating project from Archetype: ninja-ser
vlet-archetype-simple:6.0.0-rc1
[INFO] -------------------------------------------------------------------------
---
[INFO] Parameter: groupId, Value: cmy
[INFO] Parameter: artifactId, Value: cmy
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: cmy
[INFO] Parameter: packageInPathFormat, Value: cmy
[INFO] Parameter: package, Value: cmy
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: groupId, Value: cmy
[INFO] Parameter: artifactId, Value: cmy
[INFO] project created from Archetype in dir: e:\_My_File_____\_work\MyCode\myCo
de\javaworkspace\A_myproject\cmy
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 09:57 min
[INFO] Finished at: 2017-03-13T15:44:03+08:00
[INFO] Final Memory: 16M/273M
[INFO] ------------------------------------------------------------------------

进入项目,安装一下maven依赖包:

cd cmy
mvn clean install // to generate the compiled classes the first time
mvn ninja:run // to start Ninja's SuperDevMode 运行项目

构建完毕:

我接手新项目习惯性研究一下包目录结构,那Ninja也有介绍,官方地址http://www.ninjaframework.org/documentation/getting_started/the_anatomy_of_a_ninja_application.html

如果有必要等抽空解释一下目录结构,暂时先放在这里如下:

 ├── pom.xml                                     // Instructions about dependencies and the build (Maven)
└── src
├── main
│ ├── java
│ │ ├── META-INF
│ │ │ └── persistence.xml // Contains informations how to access databases via JPA
│ │ ├── assets // Static assets of your application
│ │ │ └── css
│ │ │ └── custom.css
│ │ ├── conf
│ │ │ ├── Module.java // Dependency injection definitions via Guice (Optional)
│ │ │ ├── Routes.java // Contains all routes of your application in one location
│ │ │ ├── ServletModule.java // Integration of arbitrary servlet filters and mappings (Optional)
│ │ │ ├── StartupActions.java // Customization of application startup (Optional)
│ │ │ ├── application.conf // Configuration for test dev and production mode
│ │ │ ├── messages.properties // 18n messages
│ │ │ └── messages_de.properties
│ │ ├── controllers // Controllers will handle the actual request and do something
│ │ │ ├── ApiController.java
│ │ │ ├── ApplicationController.java
│ │ │ ├── ArticleController.java
│ │ │ └── LoginLogoutController.java
│ │ ├── dao // Database access via DAO objects and not in the controller
│ │ │ ├── ArticleDao.java
│ │ │ ├── SetupDao.java
│ │ │ └── UserDao.java
│ │ ├── db // Database migrations when dealing with RDBMS (Flyway)
│ │ │ └── migration
│ │ │ ├── V1__.sql
│ │ │ └── V2__.sql
│ │ ├── ehcache.xml // Configuration for ehcache
│ │ ├── etc
│ │ │ ├── LoggedInUser.java
│ │ │ └── LoggedInUserExtractor.java // Argument extractors for controller methods
│ │ ├── filters
│ │ │ └── LoggerFilter.java // Filter to filter the request in the controller
│ │ ├── logback.xml // Logging configuration via logback / slf4j
│ │ ├── models // Some models that map to your relational database
│ │ │ ├── Article.java
│ │ │ ├── ArticleDto.java
│ │ │ ├── ArticlesDto.java
│ │ │ └── User.java
│ │ └── views // html views - always map to a controller and a method
│ │ ├── ApplicationController
│ │ │ ├── index.ftl.html // Maps to controller "ApplicationController" and method "index"
│ │ │ └── setup.ftl.html
│ │ ├── ArticleController
│ │ │ ├── articleNew.ftl.html
│ │ │ └── articleShow.ftl.html
│ │ ├── LoginLogoutController
│ │ │ ├── login.ftl.html
│ │ │ └── logout.ftl.html
│ │ ├── layout
│ │ │ ├── defaultLayout.ftl.html
│ │ │ ├── footer.ftl.html
│ │ │ └── header.ftl.html
│ │ └── system // Error html views. Can be customized to output custom error pages
│ │ ├── 403forbidden.ftl.html
│ │ └── 404notFound.ftl.html
│ ├── resources
│ └── webapp
│ └── WEB-INF
│ └── web.xml // Needed for servlet containers to start up Ninja
└── test
├── java
│ └── controllers // Different tests for your application
│ ├── ApiControllerDocTest.java
│ ├── ApiControllerDocTesterTest.java
│ ├── ApiControllerMockTest.java
│ ├── ApiControllerTest.java
│ ├── ApplicationControllerFluentLeniumTest.java
│ ├── ApplicationControllerTest.java
│ ├── LoginLogoutControllerTest.java
│ └── RoutesTest.java
└── resources
└── test_for_upload.txt

好了,接下来就开始配置项目了:

我要开发的是一个简单的博客系统,运行在互联网上的项目,因此一个配置或者布局构架等等和业务系统有所区别;

项目分析:

前台:需要文章列表就可以,我希望最好有个主页进入

后台:管理页面(我初步设置两三种权限,系统管理员,博主后台,运营后台)

--------------------------------------------------------------------------

开始配置application.conf 文件:

java_Ninja实战过程的更多相关文章

  1. MySQL数据库主从同步实战过程

       Linux系统MySQL数据库主从同步实战过程 安装环境说明 系统环境: [root@~]# cat /etc/redhat-release CentOS release 6.5 (Final) ...

  2. ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程

    1.副总裁需要裸恢复的严峻现实 集团总部的信息部负责人给我打电话说为了找一年前的记录,所以需要对一年前2015年5月1日的数据进行恢复.而2016年初因为进行迁移,所以有些文件可能丢失,手上只有rma ...

  3. s11 Docker+DevOps实战--过程和工具

    开发人员本地提交代码,本地使用容器模拟生产环境测试,测试通过提交到git master 分支,就会触发pipeline执行集成构建.集成工具: gitlab-vi,travis,或Jenkins.自动 ...

  4. 基于redis排行榜的实战总结

    前言: 之前写过排行榜的设计和实现, 不同需求其背后的架构和设计模型也不一样. 平台差异, 有的立足于游戏平台, 为多个应用提供服务, 有的仅限于单个游戏.排名范围差异, 有的面向全局排名, 有的只做 ...

  5. swift项目实战FoodPin目录

    好吧,据说写博客能够找到好工作,那我也来分享一个项目吧! 自己自学iOS开发也有半年多了,现在就来分享一个swift的小项目吧!这个项目的来源是<Beginning iOS8 programmi ...

  6. pxe网络安装操作系统 原理与详细过程

    摘要:在实际工作中,我们经常会遇到这样的情况:想要安装Linux但是计算机不带光驱或软驱,或者是笔记本配置的非标准的软驱和光驱,如1394接口,USB接口等,在Linux安装时所引导的Linux内核一 ...

  7. 实战经验丨CTF中文件包含的技巧总结

    站在巨人的肩头才会看见更远的世界,这是一篇技术牛人对CTF比赛中文件包含的内容总结,主要是对一些包含点的原理和特征进行归纳分析,并结合实际的例子来讲解如何绕过,全面细致,通俗易懂,掌握这个新技能定会让 ...

  8. ProxySQL+Mysql实现数据库读写分离实战

    ProxySQL介绍 ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.具有以下特性:http://www.proxysql.com/ 1.连接池,而且是multiplexing 2 ...

  9. Mongodb 集群实战

    该实战过程完全跟着官网一步一步实现 ,官网教程:https://docs.mongodb.com/manual/tutorial/atlas-free-tier-setup/ 使用Mongo Shel ...

随机推荐

  1. EffectiveJava(4)通过私有构造器强化不可实例化的能力

    通过私有构造器强化不可实例化的能力 原理:只有当类不包含显式的构造器时,编译器才会生成缺省的构造器,因此只要让这个类包含私有构造器,他就不能被实例化 这种方式下,子类没有可访问的超类构造器可调用 // ...

  2. S1:适配器 Adapter

    将一个类的接口转换为用户期望的另外一个接口.适配器使得原本由于接口不兼容而不能一起工作的类可以一起工作   UML: 一.类适配器: class A { public function methodA ...

  3. 打造你的前端神器-webstorm11

    说起前端编辑器,用过dw,sublime,hbuilder,webstorm也不陌生,之前的版本8有用过一下,但是觉得比sublime重量太多,但是随着后来用node的开始,发现需要打造个web前端神 ...

  4. apache环境下禁止某文件夹内运行PHP脚本、禁止访问文件或目录执行权限的设置方法

    apache环境下禁止某文件夹内运行PHP脚本.禁止访问文件或目录执行权限的设置方法   首先我们来看两段对上传目录设置无权限的列子,配置如下: <Directory "要去掉PHP执 ...

  5. Git提交时提示‘The file will have its original line endings in your working directory’

    Git提交时提示'The file will have its original line endings in your working directory' Git出现错误 git add -A ...

  6. 使用ByteRef加速String类型DocValues的载入

    眼下商户索引DocValues很大,warmup时花费70-80秒(在beta环境),有62秒在载入DocValues,发现当中有54秒时间在载入string docvalues,string doc ...

  7. Python的Django框架中的Cookie相关处理

    Python的Django框架中的Cookie相关处理 浏览器的开发人员在非常早的时候就已经意识到. HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生. coo ...

  8. Nginx:handler模块按处理阶段挂载原理

    参考资料<深入理解Nginx>(陶辉) 在Nginx中,handler模块真正的处理函数通过两种方式挂载到处理过程中,一种方式就是按处理阶段挂载;另外一种挂载方式就是按需挂载. 本次我们将 ...

  9. 【LoadRunner】安装LoadRunner

    LoadRunner安装 下载好LoadRunner安装包,点击运行 在点击安装后,会提示需要安装一下程序,直接点击[确定]安装即可. 上述程序安装完毕后,会自动弹出下面的窗口,点击[下一步] 选择[ ...

  10. 工作总结 1 sql写法 insert into select from 2 vs中 obj文件和bin文件 3 npoi 模板copy CopySheet 最好先全部Copy完后 再根据生成sheet写数据 4 sheet.CopyRow(rowsindex, rowsindex + x); 5 npoi 复制模板如果出现单元格显示问题

    我们可以从一个表中复制所有的列插入到另一个已存在的表中: INSERT INTO table2SELECT * FROM table1; 或者我们可以只复制希望的列插入到另一个已存在的表中: INSE ...