Skip to content

Commit c839f3c

Browse files
committed
Merge branch 'master' of github.com:nutzam/nutz
2 parents c195726 + f7b4bcb commit c839f3c

21 files changed

Lines changed: 995 additions & 711 deletions
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#title: 版本升级
2+
#author:wendal(wendal1985@gmail.com)
3+
#index:0,1
4+
--------------------------------------------------------------------------------------
5+
为啥升级版本?
6+
7+
无非就3个原因吧
8+
9+
* 为了fix bug
10+
* 为了新特性
11+
* 为了爱,就是要追新
12+
13+
从1.a.38开始的版本,升级到最新版的成本都不大.
14+
15+
做到100%兼容是不现实的,但可以肯定的是, 遇到的问题的均有解决的办法.
16+
17+
有些兼容性问题,属于"错误"得到修正,老版本能这样写是"bug", ^_^
18+
19+
这是一个汇总帖子,随时更新, 也会按版本的增长继续增长....
20+
21+
请先浏览当前版本到最新版的发行注记,然后再看本列表
22+
23+
--------------------------------------------------------------------------------------
24+
IE下ajax变json
25+
26+
属于Mvc范畴的问题, IE下ajax变下载,eval json结果出问题. 请查看 [../mvc/questions.man MVC常见问题]
27+
28+
--------------------------------------------------------------------------------------
29+
Ioc路径规则变化
30+
31+
JsonLoader填路径的时候,如果是目录,老版本不需要反斜杠,新版需要
32+
33+
{{{<JAVA>
34+
// 原本兼容的写法
35+
@IocBy("*js", "ioc", "*anno", "net.wendal.nutzbook")
36+
// 正确的写法,留意ioc后面的斜杠
37+
@IocBy("*js", "ioc/", "*anno", "net.wendal.nutzbook")
38+
}}}
39+
40+
---------------------------------------------------------------------------------------
41+
jdk6使用1.r.61启动失败
42+
43+
请更换为 1.r.61.r2
44+
45+
--------------------------------------------------------------------------------------
46+
Mvc下报FastClass错误
47+
48+
版本涉及 1.r.60, 升级到1.r.61.r2即可解决
49+
50+
如果是1.r.61.r2但报错,通常原因是某种自定义的热加载机制吧,可以通过下列代码禁用, 建议放在MainSetup的init方法内.
51+
52+
{{{<JAVA>
53+
NutConf.USE_FASTCLASS = false;
54+
}}}
55+
56+
--------------------------------------------------------------------------------------
57+
dao无sql日志
58+
59+
升级1.r.58或之后的版本,且使用daocache时会遇到的, 需要修改daocache的ioc配置,请参考[daocache https://github.com/nutzam/nutzmore/tree/master/nutz-plugins-daocache]
60+
61+

doc/manual/index.xml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<doc path="encoding.man"></doc>
99
<doc path="support.man"></doc>
1010
<doc path="logging.man"></doc>
11+
<doc path="version_upgrade.man"></doc>
1112
</doc>
1213
<doc path="mvc" title="Mvc 手册">
1314
<doc path="overview.man"/>
@@ -73,13 +74,14 @@
7374
<doc path="loader_annotation.man"/>
7475
<doc path="loader_combo.man"/>
7576
<doc path="ioc_annos.man"/>
77+
<doc path="ioc_factory.man"></doc>
7678
<doc path="ioc_by_hand.man"/>
77-
<doc path="scope.man"/>
7879
<doc path="inner_object.man"/>
79-
<doc path="xml_ioc_loader.man"/>
8080
<doc path="ioc_properties.man"></doc>
81-
<doc path="ioc_and_java.man"></doc>
8281
<doc path="alias.man"></doc>
82+
<doc path="scope.man"/>
83+
<doc path="ioc_and_java.man"></doc>
84+
<doc path="xml_ioc_loader.man"/>
8385
<doc path="questions.man"></doc>
8486
</doc>
8587
<doc path="aop" title="Aop 手册">

doc/manual/ioc/ioc_factory.man

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#title: 工厂方法
2+
#author:wendal(wendal1985@gmail.com)
3+
#index:0,1
4+
--------------------------------------------------------------------------------------------------------
5+
什么是工厂方法?
6+
7+
工厂方法,就是通过一个"虚拟"构造方法,供调用者获取特定的实例. 至于返回的是什么实例, 得看环境和传入的参数,及
8+
方法内的业务逻辑了.
9+
10+
例如, 希望在生产环境用Product目录下的配置文件,开发环境用dev目录下的配置文件
11+
12+
--------------------------------------------------------------------------------------------------------
13+
使用Iocbean的factory
14+
15+
通过IocBean注解内的factory参数,可以自定义工厂类及工厂method
16+
17+
factory参数的规则是, 以井号分隔,井号之前的是类名或ioc bean名称, 后面是方法名称.
18+
19+
{{{<Java>
20+
@IocBean(factory="net.wendal.mqtt.MqttAbcServiceFactory#create", args={"refer:dao"})
21+
public class AbcService extends Service {
22+
...
23+
24+
}
25+
26+
// 无任何注解
27+
public class MqttAbcServiceFactory {
28+
public static AbcService create(Dao dao) {
29+
return new XXXXAbcService(dao);
30+
}
31+
}
32+
}}}
33+
34+
通过其他bean生成此bean, 区别就是用`$对象名称` 代替 上一个例子的类名
35+
36+
{{{<Java>
37+
@IocBean(factory="$snakerConfigure#build")
38+
public class SnakerService{}
39+
40+
41+
@IocBean(name="snakerConfigure")
42+
public class SnakerConfigure {
43+
public SnakerService build() {
44+
return ....;
45+
}
46+
}
47+
}}}
48+
49+
--------------------------------------------------------------------------------------------------------
50+
使用IocBean实例方法
51+
52+
先看示例. 这个功能是1.r.62新增.
53+
54+
相比@IocBean的factory参数, 这种方式是声明"其他"bean的生成, 而不是自身.
55+
56+
{{{<JAVA>
57+
@IocBean // 首先,它自己必须加@IocBean, 可以使用@IocBean/@Inject的全部功能.
58+
public class MyBeanFactory {
59+
60+
//@Inject
61+
//public PropertiesProxy conf; // 像普通对象那么注入任何你需要的东西,这个conf也可是其他IocBean类,但不能是这个类了,否则死循环了
62+
@IocBean
63+
public PropertiesProxy getConf() {
64+
if ("product".equals(System.getProperty("nutz.runmode"))) {
65+
return new PropertiesProxy("/etc/nutz/custom");
66+
} else {
67+
return new PropertiesProxy("custom/");
68+
}
69+
}
70+
71+
// 生成一个名为dataSource的bean. 命名规则是: IocBean(name=XXX) > 方法名去掉get/build后首字母小写.
72+
@IocBean
73+
public SimpleDataSource getDataSource(PropertiesProxy conf) {
74+
SimpleDataSource ds = new SimpleDataSource();
75+
ds.setJdbcUrl(conf.get("db.url", "jdbc:h2:mem:nutztest"));
76+
return ds;
77+
}
78+
79+
@IocBean
80+
public Dao buildDao(DataSource dataSource) { // 带参数, 默认是按类型注入
81+
return new NutDao(dataSource);
82+
}
83+
84+
85+
@IocBean(name="dao2") // 自定义bean的名字,这样方法名就随便起了
86+
public Dao xxxgetDao2(DataSource dataSource) {
87+
return new NutDao(dataSource);
88+
}
89+
90+
91+
@IocBean(name="dao3")
92+
public Dao xxyyy(@Inject("refer:dataSource")DataSource ds) { // 参数加@Inject,可以像属性加上@Inject一样注入值
93+
return new NutDao(ds);
94+
}
95+
96+
@IocBean(name="dao3", create="init", depose="depose") // 事件也是支持的
97+
public UserService makeUserService(Dao dao) {
98+
return new UserServiceImpl(dao);
99+
}
100+
}
101+
}}}
102+
103+
优缺点
104+
105+
* 可以完全不使用js进行ioc配置
106+
* 可以更灵活地根据配置信息生成对象
107+
* 通过这种方式生成的对象,暂不支持Aop注入

doc/manual/ioc/ioc_loader.man

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
--------------------------------------------------------------------------------------------------------
66
使用Json
77

8-
NutIoc 包含一个 JsonLoader,通常同学们*不*会这么用!!!
8+
NutIoc 包含一个 JsonLoader或者N个IocLoader或者一个ComboIocLoader
99

1010
{{{<JAVA>
11-
Ioc ioc = new NutIoc(new JsonLoader("path/to/mybeans.js"));
11+
Ioc ioc = new NutIoc(new JsonLoader("path/to/mybeans.js")); //示意
1212
}}}
1313

1414
JsonLoader 从一个 JS 文件中加载一组 IocBean 的配置信息,这个JS文件的格式通常为

doc/manual/ioc/ioc_properties.man

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
type : "org.nutz.ioc.impl.PropertiesProxy",
9292
fields : {
9393
paths : ["myapp.properties"]
94+
//paths : ["custom/"]
9495
}
9596
},
9697
// 数据源

doc/manual/ioc/loader_annotation.man

Lines changed: 2 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -215,85 +215,7 @@
215215
字符串,或者布尔值怎么办? 呵呵,抱歉,截止到现在,我们还没有解决这个问题,不过很快我们会给出一个设计,
216216
并且我可以负责的说,给出新的设计一定会兼容现在的这个用法的。
217217

218-
--------------------------------------------------------------------------------------------------------
218+
-------------------------------------------------------------------------------------------------------
219219
工厂方法
220220

221-
{{{<Java>
222-
@IocBean(factory="net.wendal.mqtt.MqttAbcServiceFactory#create", args={"refer:dao"})
223-
public class AbcService extends Service {
224-
...
225-
226-
}
227-
228-
// 无任何注解
229-
public class MqttAbcServiceFactory {
230-
public static AbcService create(Dao dao) {
231-
return new XXXXAbcService(dao);
232-
}
233-
}
234-
}}}
235-
236-
通过其他bean生成此bean, 类似于spring的factory-bean功能
237-
238-
{{{<Java>
239-
@IocBean(factory="$snakerConfigure#build")
240-
public class SnakerService{}
241-
242-
243-
@IocBean(name="snakerConfigure")
244-
public class SnakerConfigure {
245-
public SnakerService build() {
246-
return ....;
247-
}
248-
}
249-
}}}
250-
251-
--------------------------------------------------------------------------------------------------------
252-
基于方法注解的工厂方法
253-
254-
先看示例. 这个功能是1.r.62新增.
255-
256-
{{{<JAVA>
257-
@IocBean // 首先,它自己必须加@IocBean, 可以使用@IocBean/@Inject的全部功能.
258-
public class MyBeanFactory {
259-
260-
@Inject
261-
public PropertiesProxy conf; // 像普通对象那么注入任何你需要的东西
262-
263-
// 生成一个名为dataSource的bean. 命名规则是: IocBean(name=XXX) > 方法名去掉get/build后首字母小写.
264-
@IocBean
265-
public DataSource getDataSource() {
266-
SimpleDataSource ds = new SimpleDataSource();
267-
ds.setJdbcUrl(conf.get("db.url", "jdbc:h2:mem:nutztest"));
268-
return ds;
269-
}
270-
271-
@IocBean
272-
public Dao buildDao(DataSource dataSource) { // 带参数, 默认是按类型注入
273-
return new NutDao(dataSource);
274-
}
275-
276-
277-
@IocBean(name="dao2") // 自定义bean的名字,这样方法名就随便起了
278-
public Dao xxxgetDao2(DataSource dataSource) {
279-
return new NutDao(dataSource);
280-
}
281-
282-
283-
@IocBean(name="dao3")
284-
public Dao xxyyy(@Inject("refer:dataSource")DataSource ds) { // 参数加@Inject,可以像属性加上@Inject一样注入值
285-
return new NutDao(ds);
286-
}
287-
288-
@IocBean(name="dao3", create="init", depose="depose") // 事件也是支持的
289-
public UserService makeUserService(Dao dao) {
290-
return new UserServiceImpl(dao);
291-
}
292-
}
293-
}}}
294-
295-
优缺点
296-
297-
* 可以完全不使用js进行ioc配置
298-
* 可以更灵活地根据配置信息生成对象
299-
* 通过这种方式生成的对象,暂不支持Aop注入
221+
工厂方法已经移入独立的章节

doc/manual/lang/segment.man

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
{{{
1313
String.format("XXXXXXXX %s XXXXXX %s XXXXXX %s XXXXX", "TxtA","TxtB","TxtA");
1414
}}}
15-
并且你不设值,会被无情抛错。
15+
或者用位置参数
16+
{{{
17+
String.format("XXXXXXXX %1$s XXXXXX %2$s XXXXXX %1$s XXXXX", "TxtA","TxtB");
18+
}}}
19+
并且你不设值,或者设置的值少于声明的数量, 会被无情抛错。
1620
-----------------------------------------------------------------------------
1721
Nutz 的代码模板
1822

doc/manual/mvc/questions.man

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,16 @@ java.io.EOFException
4242

4343
{{{
4444
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/urandom"
45-
}}}
45+
}}}
46+
47+
--------------------------------------------------------------------------------------
48+
IE下ajax当下载
49+
50+
51+
原因: 新版的@Ok("json")的Content-Type设置为"application/json", 在IE下会有毛病.
52+
53+
解决版本: 在MainModule添加@SetupBy(MainSetup.class), 然后MainSetup类实现Setup接口,在init方法内内添加下列代码
54+
55+
{{{<JAVA>
56+
UTF8JsonView.CT = "text/plain";
57+
}}}

0 commit comments

Comments
 (0)