邮件发博客不能发图片吗
2018年11月29日星期四
独自带闺女的一个周末
不想发朋友圈,是因为不是想别人看到,只是记录一下, 所以写在这里
还有一个是2014去韩国的照片
我还能抱着她,没找到
现在已经抱不动了
也羞于让我抱她
她会跟你讲条件
她会问这问那
她会说一路平安,早点回来
她会跟你一样把刚说的话忘光
还没能晓得 就快要老了
这货也很快抱不动了
她长大了
他也很快
无知的索求,羞耻于求救
上一次谁给过拥抱,在什么时候
她突然问,某某同学的爸爸是卖茶叶的吗?
我说,不是,实在茶叶公司上班吧!
她说,挺好啊,不像你,啥用没有
我一时语塞
回忆这些
更不适合听李宗盛
越过山丘,却发现无人等候
太扎心
想得却不可得,你乃人生何
太扎心
2018年5月3日星期四
宝贝长得真快
就要二年级毕业了
我:
昨天你闺女主动写了10页口算
我:
是什么动力呢?
:
无聊?
:
口算简单?
我:
越逼越不写
我:
好深奥
:
我闺女将来肯定是个出色的人
我:
难易 都一样啊
我:
我想想明白,然后改变方式方法
2017年3月15日星期三
2016年5月6日星期五
2016年4月6日星期三
2016年3月30日星期三
2016年3月27日星期日
2016年3月24日星期四
2016年3月16日星期三
2015年8月24日星期一
简单介绍一下国产框架nutz
介绍一下国产框架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,官方都有手把手说明,感兴趣的同学可以去看看
用它的确可以事半功倍的快速建立一个项目并实现功能
用它的确可以事半功倍的快速建立一个项目并实现功能
订阅:
博文 (Atom)