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