编辑: NaluLee | 2019-09-28 |
1 1.2 1.2.1 1.2.1.1 1.2.1.2 1.2.1.3 1.2.1.4 1.2.1.5 1.2.1.6 1.2.2 1.2.2.1 1.2.3 1.2.4 1.2.5 1.3 1.3.1 1.3.2 1.3.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.5 1.5.1 1.5.2 1.5.2.1 1.5.2.2 1.5.2.3 1.5.2.4 目录 痞子军团本部 软体开发 Java Hibernate JasperReport Java Web Start JAXB JVM ZK JS pixi.js Browser 图学 PHP 软体工程 Eclipse Git GitHub 杂七杂八 GitBook Jeff 大师语录 Markdown 3C 产品秘技 Portfolio 飞行纪录 桌游纪录 极品区 优质区 正常区 鸡肋区
1 1.5.2.5 1.5.3 1.5.4 死亡区 岛呼册店 军旅生涯
2 作品(?)们Alice &
PsMonkey:真的是 Home Page... XD Blog 们 痞子军团本部:评论、登山、杂谈 Don'
tCare Blog:正经地写一些软体开发的文章 PT2Club Blog:对於软体业界的随便乱写 Social Media Instagram:@ps_monkey Twitter:@PsMonkey9487 其他 Gitbook GWT Wiki 痞子军团本部
3 Modifier modifier class interface constructor method field private V V V V (default) V(1) V V V V protected V(1) V V V public V V V V V static V V abstract V V V final V V V native V strictfp V V V synchronized V transient V volatile V (1):只限於 inner class Java
4 Entity 的哏 资料库的栏位没办法直接 mapping 到 Java class,例如资料库储存的是「Y/N」实际上希望 对应到 boolean. 目前发现两招,第一招是挂 @Basic ,例如 @Basic private String enabled;
public Boolean getEnabled() { return TRUE .equalsIgnoreCase(enabled);
} public void setEnabled(Boolean enabled) { this.enabled = enabled ? TRUE : FALSE ;
} 第二招是挂 @Converter ,还没试过. reference 如果希望新增资料的时候,某个栏位直接使用 DB 预设值(而不是 entity field 当下的值), 在 @Column 里头加上 insertable = false : @Column(insertable = false) private Date createDate;
HQL 的哏 Session.createQuery() 里头的字串逻辑: 不是用 DB 的 table / column name,而是用 Java 的 class / field name parameter name 用 : 开头,实际参数不需要 : Sub Query 在 IN / NOT IN 使用 sub query 的时候,如果这样写 FROM foo WHERE id NOT IN (FROM wtf) foo.id 会比对的是 wtf.id .如果要作 NOT IN 的是 wtf.fooId ,要这样写 FROM foo WHERE id NOT IN (SELECT fooId FROM wtf) Hibernate
5 Hibernate
6 Subreport Subreport 也是对应到一个 .jrxml, 可以作到只切换 / 动态指定整个 report 其中一部分的需 求, 提高 report 的重用率、减少维护成本. 在 main report 当中加入 Subreport 之后, Subreport 的 Subreport Expression 指到一个 parameter,假设为 $P{SubReport} , $P{SubReport} 的 Parameter Class 是 net.sf.jasperreports.engine.JasperReport ;
Subreport 的 Data Source Expression 指到一 个 parameter,假设为 $P{ReportVO} , $P{ReportVO} 的 Parameter Class 要是 data source,个人习惯是用 JRBeanCollectionDataSource . 在 Java 当中: Map parameters = new HashMap();
parameters.put( ReportVO , new JRBeanCollectionDataSource(getSubreportData()) );
parameters.put( SubReport , JRLoader.loadObject( loader.getResourceAsStream(getJasperFile()) ) );
//把 parameters 丢进 main report 的 JasperFillManager.fillReport() 这样 Subreport 就会以 getJasperFile() 的 .jasper 档案 搭配 getSubreportData() 的内容值 产生报表. 只不过不是独立存在、而是 main report 的一部分. iReport Editor 注意 这里是 4.6.0 版的使用经验 官方在
2016 年就不再维护 iReport,要改用 Jaspersoft Studio 要切换到 Preview 才会产生 .jasper 档 如果修改 XML(尤其是 或是 ),最好存档之后关掉重新载入. 千万 不要直接切到 Designer,不然不但 Designer 没有载入修改后的 XML, 还有可能把之前改的 全部复原回去...... Orz JasperReport
7 JasperReport
8 现在大家都会忘记 JWS 是代表 Java Web Start,档名取 JNLP 又很点点点... .jnlp 档案会被 cache 起来(jar 档应该也有),在 client side 的作法是执行 javaws - uninstall 或是用 javaws -viewer 叫出 GUI 介面操作. 看起来比较正规的作法是 .jnlp 档案里头写 update element,例如 但是实测结果好像没啥鸟用... 不确定是少了什麽... == 目前最实在的方法是让 JNLP 中 的 version 值持续递增, 这样除了 Chrome 会有重 复下载的小问题外,Firefox 跟 IE 貌似都能正常运作. Maven 大概也只有 Webstart Maven Plugin 这个可以用,以下简称 MWebStart . 它的文件写的不是 很好,实务上建议直接跳 JnlpDownloadServlet Example 这页. MWebStart 可以: 把 Maven Project 产出的 jar,包进 web 的 Maven Project 当中 以先 gen 好的 key 自动 sign jar gen version.xml 失败 case 假设 Foo 这个专案是由几个 Maven Project 组成的: /Foo /FooJWS /FooModel /FooWeb 原本的设计是在 Foo/pom.xml 当中挂进 FooJWS 、 FooModel 、 FooWeb 的 module, 如此就 能确保 FooWeb 在 build 之前就先 build FooJWS . 但实际上却会发现 JWS 出现无法顺利载 入的状况, 最终发现原因是出在 MWebStart 产生的 version.xml 不正确. 假设 FooWeb 中设定使用 FooJWS 9.7.8 版, version.xml 预期是长这样: Java Web Start
9 pattern>
name>
FooJWS.jar version-id>
9.7.8 pattern>
file>
FooJWS-9.7.8.jar 但是实际上产生的 值却是 FooJWS.jar ,没有带版号 (但是 FooJWS-9.7.8.jar 还是 会 sign、会复制到 webstart 目录). 更有趣的是,是对 Foo 作 maven install 才会错, 如 果对 FooWeb 作 maven install 就会正常...... (就是这样所以 debug 了老半天,还以为是 JNLP Download Servlet 出了啥问题 == ) 所以,在不知道 MWebStart 用了啥神奇逻辑的情况下, 就是移除 Foo/pom.xml 的 FooJWS ,一切事情就没事啦...... 至於 Jenkins 连动 build 的事情就是另一个故事了 [远目] 参考资料 1. http://stackoverflow.com/questions/8828643/java-web-start-how-to-clear-cache-or- update-the-app-from-users-perspective 2. http://docs.oracle.com/javase/7/docs/technotes/guides/javaws/developersguide/syntax.h tml#update Java Web Start
10 从 XSD 产生 VO XML ←→ VO Todo list @XmlSeeAlso 与 @XmlElementRef 的差别与使用时机. child element 有 attribute 的解法 通则 挂 @XmlRootElement 必须要有 empty constructor(不论哪种 modifier) Marshal(XML→Java) 还没有测试过用 XSD 产生 entity 档案,以下是手动写 entity 的心得. class 挂 @XmlRootElement ,如果 class name 跟 XML root name 不一样,加 name = foo 来 指定. field 挂 @XmlElement ,如果 field name 跟 XML tag name 不一样,加 name = foo 来指定. 如果该 field 有 setter,field 就不能挂 @XmlElement 、setter 也不用挂. 如果 setter 名字跟 tag name 不一样的解决招数相同. 如果 field 的 data type 需要参考到 Foo 这个 class, Foo 必须有挂 @XmlRootElement . 至於 @XmlSeeAlso 的写法: @XmlSeeAlso(Foo.class) public class Wtf { private Foo foo;
public Foo getFoo() {} public void setFoo(Foo foo) {} } 跟 @XmlElementRef 的写法: JAXB
11 public class Wtf { private Foo foo;
public Foo getFoo() {} @XmlElementRef public void setFoo(Foo foo) {} } 好像都不需要... 也不确定哪个比较好 / 使用时机. field / setter 如果挂 @XmlAttribute ,则视为 root element 的 attribute. (所以看起来如果 child element 有 attribute,就只能用 @XmlSeeAlso 的方法另外开一个 class?) 例外状况 目前测试的结果,只有 @XmlRootElement 的设定值跟 XML 对不上才会炸 exception, 如果 root 相同,其他 field 都对不上也不会怎样,顶多值都是 null. Unmarshal(Java→XML) marshal 得到的 XML 未必可以成功 unmarshal 回 entity.例如: @XmlRootElement class Foo { private String str;
public String getStr() { return str;
} @XmlElement(name= str+ ) public void setStr1(String str) { this.str = str;
} } 在 marshal 的时候可以正常吐出 XML String 但是拿这个 output 去 unmarshal 就会炸 SAXParseException . 因为 XML 标准中,element 的名称不允许 + . 这似乎也表示 JAXB 在做 marshal 的时候,基本上就是单纯的组字串...... == JAXB
12 JAXB
13 记忆体 初始 heap 大小(Xms):实体记忆体的 1/64. 最大 heap 大小(Xmx):实体记忆体的 1/4. 资料来源: http://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html 显示目前设定值(Windows) java -XX:+PrintFlagsFinal -version | findstr HeapSize JVM
14 还有一些诘谯成份居多的散记在 blameZK 上. ZUL Coding Style 使用 ........