Archive for the 'Dev' Category

Page 2 of 7

解决Maven Jetty Plugin在Windows下的“文件锁定”问题

使用Maven进行Java的web开发,Jetty Plugin是必不可缺的插件,可以极大的提到开发效率。但在Windows环境下会遇到静态文件(html、css、js)被锁定、无法即时更新的问题。要想更新这些文件,只能先停掉Jetty,保存修改,再启动Jetty,非常不方便。
解决办法是这样的:
1、从jetty.jar中解出webdefault.xml(位于org.mortbay.jetty.webapp包下)这个文件,把这个useFileMappedBuffer参数设为false

<init-param>
 <param-name>useFileMappedBuffer</param-name>
 <!-- change to false -->
 <param-value>true</param-value>
</init-param>

2、把修改后的webdefault.xml文件跟pom.xml放在一起
3、修改pom.xml里的Jetty Plugin的配置,加入webdefault.xml

...
<plugin>
   <groupId>org.mortbay.jetty</groupId>
   <artifactId>maven-jetty-plugin</artifactId>
   <version>6.1.7</version>
   <configuration>
     <contextPath>/</contextPath>
     <webDefaultXml>webdefault.xml</webDefaultXml>
     ...
    </configuration>
    ...
</plugin>
...

Web页面自动打印PDF文件的实现

借助iText和Adobe Acrobat的Javascript支持,可以实现PDF文档的自动打印(可以做到不显示打印对话框)

  1. ......
  2.  
  3. PdfReader reader = new PdfReader(pdfStream); [1]
  4.  
  5. StringBuffer script = new StringBuffer(); [2]
  6. script.append("this.print({bUI: false,bSilent: true,bShrinkToFit: false});")
  7.   .append("\r\nthis.closeDoc();");
  8.  
  9. ByteArrayOutputStream bos = new ByteArrayOutputStream(pdfStream.length);
  10. try {
  11.   PdfStamper stamp = new PdfStamper(reader, bos); [3]
  12.   stamp.setViewerPreferences(PdfWriter.HideMenubar 
  13.     | PdfWriter.HideToolbar | PdfWriter.HideWindowUI);
  14.   stamp.addJavaScript(script.toString());
  15.   stamp.close();
  16. } catch (DocumentException e) {
  17.   logger.error(e.getMessage(), e.getCause());
  18. }
  19.  
  20. return new StreamingResolution("application/pdf"
  21.   new BufferedInputStream(new ByteArrayInputStream(bos.toByteArray()))) ;
  22.  
  23. ......

代码说明:
1、pdfStream是用iText生成的PDF文档字节流
2、script是要加入到PDF文档里的Javascript代码。这段Javascript代码先调用PDF文档对象的print方法,然后用closeDoc方法关闭文档。print方法的参数指定了不要显示打印对话框,参数含义参考Acrobat JavaScript Scripting Reference
3、bos用来保存加入Javascript后的PDF文档字节流,它作为PdfStamper对象的输出流。PdfStamper对象调用addJavaScript方法将Javascript代码加入到PDF文档中。

Web页面嵌入PDF文档:

  1. <embed type="application/pdf" src="/PrintPdf.action" width="1" height="1"></embed>

发布jar包到自己设立的Maven Repository

使用Artifactiry为自己的开发团队设立了repository镜像。有时需要把本地的一些第三方的jar包发布到服务器,使用maven-deploy-plugin的deploy:deploy-file目标可以完成这个任务。

比如,要发布jta的jar包jta-1.0.1B.jar

$ mvn deploy:deploy-file -DgroupId=javax.transaction \
   -DartifactId=jta \
   -Dversion=1.0.1B \
   -Dpackaging=jar \
   -Dfile=~/.m2/repository/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar \
   -DrepositoryId=central \
   -Durl=http://host.of.your.repository[:port]/artifactory/ibiblio@repo

说明:

  • repositoryId在工程的pom文件里设置
  • url由Artifactiry的配置决定,注意不能使用virtual repository的地址
  • 如果远程repository需要身份验证,用户名和密码需要在maven的settings.xml里设置

参考:

TurboGears开发笔记 (1)

1. 使用MySQL数据库

1.1 使用UTF-8字符集

sqlobject.dburi="mysql://root:@localhost:3306/dbname?sqlobject_encoding=utf-8&read_default_file=my.cnf"

同时,my.cnf里在client一节加入 default-character-set = utf8

1.2 使用InnoDB类型的表
修改my.cnf,mysqld一节加入 default-storage-engine=INNODB

1.3 自身外键关联
使用InnoDB类型的表,tg-admin sql drop 时会遇到由于外键约束而无法删除的问题,可以改用MyISAM类型的表。tg-admin sql create时会有警告:

Warning: a circular reference was detected in the model. Unable to sort the classes by dependency: they will be treated in alphabetic order. This may or may not work depending on your database backend. The error was:
Found a circular reference: ......

2. SQLObject

2.1 MultipleJoin最好指定joinColumn

3. Kid模板

3.1 用defined(varname) 可以判断一个变量是否存在于模板中,value_of则可以指定变量不存在时的默认值

3.2 results.count()可以得到查询结果集的大小

3.3 根据条件输出不同的内容 ${condition and ‘a’ or ‘b’}
比如交替表格中行的背景色

<tr py:for="i, row in enumerate(rows)" class="${i%2==0 and 'odd' or 'even'}">
...
</tr>

在select的option标签里输入selected属性

...
<option value="..." selected="${condition and 'selected' or None}">... </option>
...

Windows下mysql命令行工具插入和显示中文数据

my.ini里client和mysqld都设置了default-character-set=utf8
数据库和表的默认字符集也都是utf8,用MySQL Query Browser工具插入和查询中文输入没有问题,但直接在命令提示符里用mysql工具插入和查询有中文乱码。

www.javaworld.com.tw/jute/post/view?bid=21&id=1285… 里说的一样,好像win下mysql命令行工具不认。

解决办法:
插入数据前,set names utf8;
执行查询前,set name gbk;




This work by wolfg is licensed under a Attribution-Noncommercial-Share Alike 2.5 China Mainland.