Q:什麼是Nutz。java
A:相似於SSH的一個框架。官網http://www.nutzam.com/web
Q:Nutz怎麼讀。shell
A:讀做 「納特Z(Z發重音)」。Nutz 的 Nut 是由於霍金的《果殼中的宇宙》是 zozoh 最喜歡的一本書之一。 Z 是 zozoh 小時,動畫片《佐羅》給他很深的印象,尤爲是每次轉場的中間動畫都是 佐羅的劍在黑色的空中 唰唰唰 三下劃出鋒利的 Z 字,好像三道閃電,酷的要命。 同時 zozoh 本人姓張,因此他很高興在 Nut 後面 唰唰唰 的來一個 Z。數據庫
Q:Nutz能夠作什麼編程
A:Dao --針對 JDBC 的薄封裝,事務模板,無緩存json
Ioc -- JSON 風格的配置文件,聲明時切片支持緩存
Mvc -- 註解風格的配置,內置多文件上傳功能mvc
Json -- 解析和渲染app
Castors -- Java 對象類型轉換框架
Lang -- 更簡潔的 Java 函數以及更豐富的反射支持
Aop -- 輕便快速的切面編程支持
Plugin -- 輕便的插件機制
Resource -- 資源掃描
它全部的功能均不依賴第三方 jar 包
這就意味着:
若是一個 Web 應用,你在 WEB-INF/lib 下只 須要放置一個 nutz.jar 就夠了
固然你要使用鏈接池,數據庫驅動等功能,還須要自行添置 jar 包。
最近的兩三個小項目,別人搭了Nutz框架開發,階段整理下。
首先正如上面所說Nutz真的很輕。一個nutz.jar 搞定。固然爲了整個系統我引入了另外兩個jar。和一些程序自帶的jar。
druid-1.0.7.jar 是 阿里巴巴推出的國產數據庫鏈接池;
h2-1.3.178.jar 是 h2內存數據庫
這個demo例子 是 簡單的swt開發的。官網的例子是MVCweb項目。最後總結區別。
項目代碼結構圖。
貼代碼:
package demo.biz; import org.nutz.dao.entity.annotation.Column; import org.nutz.dao.entity.annotation.Id; import org.nutz.dao.entity.annotation.Name; import org.nutz.dao.entity.annotation.Table; @Table("t_person") public class Person { @Id private int id; @Name private String name; @Column private String age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
package demo.dao; import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import demo.biz.Person; @IocBean(name = "personDao") public class PersonDao { @Inject private Dao dao; public void newPerson(Person person){ dao.insert(person); } }
package demo.service; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import demo.biz.Person; import demo.dao.PersonDao; @IocBean(name = "personService") public class PersonService { @Inject PersonDao personDao; public void newPerson(Person person){ personDao.newPerson(person); } }
package demo; import org.nutz.ioc.Ioc; import org.nutz.ioc.impl.NutIoc; import org.nutz.ioc.loader.combo.ComboIocLoader; import org.nutz.log.Log; import org.nutz.log.Logs; /** * As you see... * */ public class IocMaster { private static final Log log = Logs.get(); private static Ioc ioc = null; public static Ioc getInstance() { if (null != ioc) { return ioc; } try { ioc = new NutIoc((new ComboIocLoader( "*org.nutz.ioc.loader.json.JsonLoader", "beans.js", "*org.nutz.ioc.loader.annotation.AnnotationIocLoader","demo" ))); } catch (ClassNotFoundException e) { String msg = "create ioc failed..."; log.error(msg); log.error(e.getMessage()); throw new RuntimeException(e); } return ioc; } }
下面這個是主頁面。我是經過SWT開發的簡單頁面。
package demo; import org.eclipse.swt.SWT; @IocBean public class Main { protected Shell shell; private Text txtName1; private Text txtAge1; private Text txtName2; private Text txtAge2; private Table table; static PersonService personService; static PersonDao personDao; /** * Launch the application. * @param args */ public static void main(String[] args) { Ioc ioc = IocMaster.getInstance(); personService = ioc.get(PersonService.class); //personDao = ioc.get(PersonDao.class); try { Main window = new Main(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window. */ public void open() { Display display = Display.getDefault(); createContents(); shell.open(); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } /** * Create contents of the window. */ protected void createContents() { shell = new Shell(); shell.setSize(856, 624); shell.setText("SWT Application"); Group group = new Group(shell, SWT.NONE); group.setText("\u65B0\u589E"); group.setBounds(10, 0, 820, 121); Label label = new Label(group, SWT.NONE); label.setBounds(20, 51, 61, 17); label.setText("\u540D\u79F0"); txtName1 = new Text(group, SWT.BORDER); txtName1.setBounds(99, 45, 111, 23); Label label_1 = new Label(group, SWT.NONE); label_1.setText("\u5E74\u9F84"); label_1.setBounds(255, 51, 61, 17); txtAge1 = new Text(group, SWT.BORDER); txtAge1.setBounds(334, 45, 111, 23); Button btnNew = new Button(group, SWT.NONE); btnNew.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { String name = txtName1.getText(); String age = txtAge1.getText(); Person person = new Person(); person.setAge(age); person.setName(name); personService.newPerson(person); } }); btnNew.setBounds(594, 45, 80, 27); btnNew.setText("\u65B0\u589E"); Group group_1 = new Group(shell, SWT.NONE); group_1.setText("\u67E5\u8BE2"); group_1.setBounds(10, 127, 820, 449); Label label_2 = new Label(group_1, SWT.NONE); label_2.setText("\u540D\u79F0"); label_2.setBounds(20, 30, 61, 17); txtName2 = new Text(group_1, SWT.BORDER); txtName2.setBounds(99, 24, 111, 23); Label label_3 = new Label(group_1, SWT.NONE); label_3.setText("\u5E74\u9F84"); label_3.setBounds(255, 30, 61, 17); txtAge2 = new Text(group_1, SWT.BORDER); txtAge2.setBounds(334, 24, 111, 23); Button btnQuery = new Button(group_1, SWT.NONE); btnQuery.setText("\u67E5\u8BE2"); btnQuery.setBounds(596, 20, 80, 27); table = new Table(group_1, SWT.BORDER | SWT.FULL_SELECTION); table.setBounds(10, 87, 800, 352); table.setHeaderVisible(true); table.setLinesVisible(true); TableColumn tableColumn = new TableColumn(table, SWT.NONE); tableColumn.setWidth(354); tableColumn.setText("\u540D\u79F0"); TableColumn tableColumn_1 = new TableColumn(table, SWT.NONE); tableColumn_1.setWidth(334); tableColumn_1.setText("\u5E74\u9F84"); } }
效果圖(很醜- - 就是爲了跑通親測可用):
下面這個是建立數據庫的運行一次便可.
package demo; import org.nutz.dao.Dao; import org.nutz.ioc.Ioc; import demo.biz.Person; public class MainCreareTable { public static void main(String[] args) { Ioc ioc = IocMaster.getInstance(); Dao dao = ioc.get(Dao.class); dao.create(Person.class,true); } }
bean.js配置文件
var ioc = { config : { type : "org.nutz.ioc.impl.PropertiesProxy", fields : { paths : ["beans.properties"] } }, dataSource: { type: "com.alibaba.druid.pool.DruidDataSource", events: { depose: 'close' }, fields: { driverClassName: {java :"$config.get('db-driver')"}, url : {java :"$config.get('db-url')"}, username : {java :"$config.get('db-username')"}, password : {java :"$config.get('db-password')"}, initialSize: 1, minIdle: 1, maxActive: 2, maxWait: 60000, timeBetweenEvictionRunsMillis: 60000, minEvictableIdleTimeMillis: 300000, poolPreparedStatements: true, maxPoolPreparedStatementPerConnectionSize: 20, testWhileIdle:true } }, dao: { type: "org.nutz.dao.impl.NutDao", args: [ {refer: "dataSource"} ] } };
beans.properties配置文件
db-driver=org.h2.Driver db-url=jdbc:h2:tcp://localhost/D:/gss/db/dbs/dbf --須要手動啓動h2數據庫模式 #db-url=jdbc:h2:D:/gss/db/dbs/dbf --內嵌數據庫隨着項目啓動自行啓動 db-username=gss db-password=gss
代碼解釋:
項目使用了 h2內存數據庫爲了方便測試,以避免小夥伴機器上沒有這個或者那個數據庫啥的。
功能主要是一個新增數據。
bean.js和beans.properties配置文件主要是配置數據庫鏈接池使用
其餘類文件不贅述 你們都懂的
錯誤精讀:錯了錯了錯了 錯在哪兒 爲何錯 怎麼錯了 nutz框架 啓動的入口是哪兒他憑什麼神奇的註釋哪兒哪兒就能用
在寫這個demo 的時候,我以前作的web的項目 ioc容器是自動啓動的,而在這個demo中須要手動啓動,而我選擇的加載文件夾給我形成了誤解。我認爲我在得到實例的時候個人文件夾下被我註釋 @Inject的類都是能夠直接使用使用的.相似這種概念:
@Inject private PersonService personService; 在下面的方法中... .... public void demo(){ personService.setXXX(); //事實證實這處的personService是空的 }
其實否則。
在web項目中 你會在 web.xml裏面配置一個filter來指向你的mainmodule類。而mainmodule的註解是這樣的
import org.nutz.mvc.annotation.Encoding; import org.nutz.mvc.annotation.IocBy; import org.nutz.mvc.annotation.Modules; import org.nutz.mvc.annotation.SetupBy; import org.nutz.mvc.ioc.provider.ComboIocProvider; @Encoding(input = "UTF-8", output = "UTF-8") @IocBy(type = ComboIocProvider.class, args = { "*org.nutz.ioc.loader.json.JsonLoader", "nutz/", "*org.nutz.ioc.loader.annotation.AnnotationIocLoader", "com.sgi.cari" }) @Modules(scanPackage = true) @SetupBy(value = MainSetup.class) public class MainModule { }
而後隨着web容器的啓動,該類加載進了ioc裏面。
可是在java的項目中沒有容器的配置,須要自行啓動(IocMaster.java)的這個類被實例以後,仍是須要
personService= ioc.get(PersonService.class);
來本身添加類進ioc對象來使用。
我的留存