2015年8月24日星期一

简单介绍一下国产框架nutz

介绍一下国产框架nutz
除了高大上的明星,spring hibrnate,在javaeye,csdn经常见到许多号称短小精悍(相比spring)简单的框架
Jfinal,我们现在这个bbs是用Jfinal做的,Jfinal号称在oschina上年度最活跃的项目,这次不介绍。
nutz,跟Jfinal有些类似
都号称自己:轻,简单,强大,快速
选择nutz的原因是:1、它的文档写的很好,很全面,让人一看就明白
2、它那测试覆盖率的图,让人看着踏实
开始一个简单的web项目来说认识nutz
1、添加jar
  1. <dependency>
  2. <groupId>org.nutz</groupId>
  3. <artifactId>nutz</artifactId>
  4. <version>1.b.52</version>
  5. </dependency>
2、nutz没有像spring那样的xml配置文件,它的配置文件都以json格式保存在js文件中(刚开始是有点不适应)
像所有框架一下,首先在web.xml中配置一个入口,一个过滤器,用来加载nutz
  1. <filter>
  2. <filter-name>nutz</filter-name>
  3. <filter-class>com.capinfo.zlzy.examapp.mvc.ExamappNutFilter</filter-class>
  4. <init-param>
  5. <param-name>modules</param-name>
  6. <param-value>com.capinfo.zlzy.examapp.MainModule</param-value>
  7. </init-param>
  8. </filter>
MainModule就像这样,用来指定配置文件,要扫描的包,事物拦截器,统一的错误页面,入口类,默认视图
其中MainSetup中有个init方法,用来初始化一些数据,比如可以像hibernate那样根据pojo初始化数据库表
  1. Daos.createTablesInPackage(dao, "com.capinfo.zlzy.examapp", false);
根据制定的sql文件初始化数据
  1. FileSqlManager fm = new FileSqlManager("init_system_mysql.sql");
  1. @SetupBy(value=MainSetup.class)
  2. @Modules(scanPackage=true)
  3. //ComboIocProvider的args参数, 星号开头的是类名或内置缩写,剩余的是各加载器的参数
  4. // *js 是JsonIocLoader,负责加载js/json结尾的ioc配置文件
  5. // *anno 是AnnotationIocLoader,负责处理注解式Ioc, 例如@IocBean
  6. //*tx 是TransIocLoader,负责加载内置的事务拦截器定义, 1.b.52开始自带
  7. @IocBy(type=ComboIocProvider.class, args={"*js", "ioc/",
  8. "*anno", "com.capinfo.zlzy.examapp",
  9. "*tx"})
  10. @ChainBy(args="mvc/examapp-mvc-chain.js")
  11. @Ok("json:full")
  12. @Fail("jsp:views.error.500")
  13. public class MainModule {
  14. }
3、初始化工作做好后,现在从DAO开始
为Dao配置数据源,新建一个dao.js放在resource下
  1. var ioc = {
  2. dataSource : {
  3. type : "com.alibaba.druid.pool.DruidDataSource",
  4. events : {
  5. create : "init",
  6. depose : 'close'
  7. },
  8. fields : {
  9. url : "jdbc:mysql://127.0.0.1:3306/test",
  10. username : "root",
  11. password : "root",
  12. testWhileIdle : true,
  13. validationQuery : "select 1" ,
  14. maxActive : 100
  15. }
  16. },
  17. dao : {
  18. type : "org.nutz.dao.impl.NutDao",
  19. args : [{refer:"dataSource"}]
  20. }
  21. };
建立pojo类,跟hibernate一样,基于注解配置表名,字段名,字段长度
  1. @Table("t_acct_user")
  2. public class UserGeneralInfo {
  3. /**
  4. * 会员标识
  5. */
  6. @Id
  7. @Column("id")
  8. private Integer id;
  9. /**
  10. * 用户名
  11. */
  12. @Column("login_name")
  13. private String loginName;
  14. /**
  15. * 密码
  16. */
  17. @Column("password")
  18. @ColDefine(width=128)
  19. private String password;
  20. ...................................
OK,这样,在项目启动时就会在数据库创建这个t_acct_user表
4、现在可以写Action了,跟springmvc很像,只是人家叫Module,管它Action,Controller,Module 就是个类名儿
  1. //就像@RequestMapping,制定url前缀
  2. @At("/manager")
  3. @IocBean // 声明为Ioc容器中的一个Bean 就像 @Controller
  4. public class UserModule {
  5. //注入service
  6. @Inject
  7. protected UserService userService;
  8. //就像@RequestMapping,制定url前缀
  9. @At({"/user"})
  10. //执行GET方式
  11. @GET
  12. //制定方法返回后,访问的页面,含义是返回jsp视图,路径是views/user.jsp
  13. @Ok("jsp:views.user")
  14. public void main() {
  15. }
  16. /**
  17. * 修改密码
  18. * @param oldpassword
  19. * @param password
  20. * @param password2
  21. * @param me
  22. * @return
  23. */
  24. //就像@RequestMapping,制定url前缀,未指定name,取方法名
  25. //方法返回值可以是任意类型,nutz会将返回值放在一个key为obj的map中,就像model.addAttribute("obj",Object);
  26. //@Param标识从页面传过来的值,这个注解不写也可以
  27. //@Attr("me")UserGeneralInfo me 是去登录用户的session
  28. //未指定@Ok,默认是返回json视图(MainModule中指定的)
  29. @At
  30. public Object updatepwd(@Param("oldpassword")String oldpassword, @Param("password")String password,@Param("password2")String password2,
  31. @Attr("me")UserGeneralInfo me) {
  32. if (Strings.isBlank(password) || password.length() < 6)
  33. return new NutMap().setv("ok", false).setv("msg", "密码不符合要求");
  34. if (!password.equals(password2))
  35. return new NutMap().setv("ok", false).setv("msg", "两次密码输入不一致");
  36. if(!(new Sha256Hash(oldpassword, me.getSalt()).toHex().equals(me.getPassword())))
  37. return new NutMap().setv("ok", false).setv("msg", "旧密码输入不正确");
  38. userService.updatePassword(me.getId(), password);
  39. return new NutMap().setv("ok", true);
  40. }
  41. }
5、这样配个页面,就可以实现修改密码功能了
用它确认减少了工作量
1、没有复杂的xml配置文件
2、mvc像springmvc一样好用
3、dao有很多便捷的方法:
比如:
1、取PersonInfo一条记录,只查询制定的字段,sql会执行select id,usedTime from person_info where id = ?

PersonInfo personInfo = Daos.ext(dao, FieldFilter.create(PersonInfo.class, "^id|usedTime")).fetch(PersonInfo.class,id);

2、只更新制定的字段,sql会执行update person_info set usedTime = ? where id = ?

Daos.ext(dao, FieldFilter.create(PersonInfo.class, "usedTime")).update(personInfo);

3、按条件查询并排序,sql会执行select * from person_info where person_id = ? order by q_id asc;

PersonInfo personInfoList = dao.query(PersonInfo.class,
Cnd.NEW().where("person_id","=",me.getId())

.orderBy("q_id","asc"));
6、其它,像集成log4j,集成shiro,集成redis,官方都有手把手说明,感兴趣的同学可以去看看
用它的确可以事半功倍的快速建立一个项目并实现功能

没有评论:

发表评论