eclipse下内置的编辑器以及一些其他插件插件的编辑器似乎都没有提供自动换行的功能。没有这个有时候真不方便,估计很多人都有这样的感受吧,所有终于有人开发了一个自动换行的插件,名为WordWrap,试用了一下,感觉还不错,拿出来和大家分享。插件地址:
http://ahtik.com/eclipse-update/
安装通过菜单help 下 install New Software来进行,具体细节就不多说了。安装好后在编辑器中右键菜单中有一项Word Wrap,选中就是自动换行,当然你可以绑定一个自己喜欢的快捷键,从而快速切换是否自动换行。
eclipse本身自带了很多快捷键,当然也允许用户修改或自定义。依次打开window –> preferences –> General –> Keys,可以看到设置快捷键的列表。一般情况下设置好了快捷键就可以立马使用了,但某些操作好像无法使用快捷键,例如配置了svn相关的操作,发现快捷键不起作用。究其原因,可能是在 “Command Groups Availability”中没有启用。可以在 windows –> Customize Perspective –> Command Groups Availability下找到对应在快捷键配置的category,并将其选中。如果没有选中,那么快捷键不启用。
mac os 下使用maven执行mvn eclipse:eclipse 时,看到命令行上输出的日志中有一条警告信息,信息如下:
[WARNING] Workspace defines a VM that does not contain a valid jre/lib/rt.jar:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
原因是mac os 下没有rt.jar文件,用classes.jar替代了,其完整路径是/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar,知道原因,解决这个问题也就很容易,只需要做一个软链接即可,操作如下:
cd /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
sudo mkdir -p jre/lib
sudo ln -s /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar jre/lib/rt.jar
如果是root用户,可以省略上述命令中的“sudo”
在tomcat 6.0版本后,如果没有apr natvie library,启动时候都会出现类似如下的警告信息
The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:...
在以前的一篇文章:Tomcat-6.0.33之APR based Apache Tomcat Native library 中介绍了如果在window和linux下解决这个问题。最近使用mac os,也遇到了同样的问题,解决的办法和linux下相似,唯一不同的是在configure时需要指定java home。
自己编译首要条件介绍已经安装了gcc,关于如果安装gcc,可以参考:mac os lion 安装gcc备忘,依赖的库似乎默认系统自带了,如果编译的时候提示缺少库,可以使用 port 方式来安装,顺便提一下 port 是一个和centos下的yum、ubuntu下的apt-get类似的包管理软件。我使用的configure参数设置如下:
./configure --with-apr=/usr/bin/apr-1-config --with-java-home=/System/Library/Frameworks/JavaVM.framework/ --with-os-type=Headers/
然后使用make、make install就编译完成。如果成功,在目录/usr/local/apr/lib/下会生成一个名为libtcnative-1.0.dylib的库文件,使用ln命令做一个软链接到上述警告信息中提到的一个目录即可,例如:
ln -s /usr/local/apr/lib/libtcnative-1.dylib /Library/Java/Extensions/
freemarker模板文件我一直使用jboss tools下提供的FreeMarker IDE,没有用过其他插件,也无法对比,个人觉得jboss提供的这个很好用。以前一直都是使用在线安装的,今天在最新版的eclipse(3.7)使用以前的安装地址,结果告诉我不可用,原来地址变化了,而且现在分版本了。
插件地址:http://download.jboss.org/jbosstools/updates/development/,在上面根据自己的版本选择一个正确地址,例如eclipse 3.7就用:http://download.jboss.org/jbosstools/updates/development/indigo/。在线安装的方法是:Help –> Install New Software 点击and,再出来的对话框中的Location中输入:http://download.jboss.org/jbosstools/updates/development/indigo/,name随便取一个即可。然后会列出来所有可用的插件,如果只需要安装FreeMarker IDE,可用在 JBoss Application Development 下找到并选中它,然后根据向导即可安装成功。
freemarker数字格式化可以在两个地方设置,一个是全局的,即在freemarker.properties文件中设置number_format,还有一个是使用string指令来控制数据的输出格式。例如:
${num?string('0.00')}
如果小数点后不足两位,用 0 代替
${num?string('#.##')}
如果小数点后多余两位,就只保留两位,否则输出实际值
输出为:1239765.46
${num?string(',###.00')}
输出为:1,239,765.46
整数部分每三位用 , 分割,并且保证小数点后保留两位,不足用 0 代替
${num?string(',###.##')}
输出为:1,239,765.46
整数部分每三位用 , 分割,并且小数点后多余两位就只保留两位,不足两位就取实际位数,可以不不包含小数点
${num?string('000.00')}
输出为:012.70
整数部分如果不足三位(000),前面用0补齐,否则取实际的整数位
${num?string('###.00')}
等价于
${num?string('#.00')}
输出为:12.70
整数取实际的位数
关于string指令的更多用法,可以访问官方文档:http://freemarker.sourceforge.net/docs/ref_builtins_number.html#ref_builtin_string_for_number
当访问某个链接时浏览器是直接把内容显示出来还是出现下载提示框,这个跟当前页面的content-type有关,例如文本、html、css、图片等会直接显示出来,rar、zip等会出现下载提示框。如果需要把文本、图片不直接显示在浏览器中,可以通过人为设置其content-type。tomcat中配置如下:
<mime-mapping>
<extension>txt</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jpg</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
对于如上配置,当访问扩展名txt或jpg的资源时就出现下载提示框,如果只需要对某些提到的资源让其出现下载提示框,上述配置就不行了,解决的方法是在资源的response头中设置content-type即可,例如:
php 中
header("Content-type:application/octet-stream");
header('Content-Disposition: attachment; filename="downloaded.txt"');
java 中
response.setContentType("application/octet-stream");
resp.setHeader("Content-Disposition", "attachment;filename="downloaded.txt");
如果需要为下载设置一个保存的名字,可以用Content-Disposition属性来指定。
在centos下,开机后会自动执行/etc/rc.local中的命令,平时启动tomcat的命令为tomcat_home/bin/startup.sh或tomcat_home/bin/catalina.sh start,当直接把他们任何一个加入到/etc/rc.local中,重启机器后发现tomcat并没有启动。原因是开机时java的环境还没有设置好,故自己写一个脚本,先设置java环境,然后在启动,脚本如下:
export JAVA_HOME=/usr/local/jdk1.6.0_30
export PATH=$JAVA_HOME/bin/:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH
export CATALINA_HOME=/usr/local/tomcat-6.0.35/
/usr/local/tomcat-6.0.35/bin/catalina.sh start
假设保存成一个名为auto-startup.sh的文件存放在/usr/local/tomcat-6.0.35/bin下,然后在/etc/rc.local加入/usr/local/tomcat-6.0.35/bin/auto-startup.sh即可。注意:需要设置auto-startup.sh有执行权限。
在java web 应用中使用dbcp做为连接池,当数据库重启或数据库连接超过设置的最大timemout时间,数据库会强行断开已有的链接,此时当web程序访问数据库时就会出现错误,大致的错误信息java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost,原因是数据库这边已有的连接强行断开,而连接池中不知道已经断开,还是从连接池取出数据库连接交给程序去执行数据库操作,所以导致出错。
mysql的默认最大timeout时间是8小时,对空闲超过8小时的数据库连接会强行断开。timeout有两种,一个是非交互式的最大等待时间wait_timeout,另一个是交互式的最大等待时间interactive_time,交互连接如mysql gui tool中的连接。一般情况下interactive_timeout的设置将要对你的web 应用没有多大的影响。wait_timeout的时间设置太小话会导致连接关闭很快,从而使一些持久连接不起作用,反之设置过大,容易造成连接打开时间过长,在show processlist时,能看到太多的sleep状态的连接,从而造成too many connections错误。修改wait_timeout可以在my.cnf的mysqld段中设置。
可以通过dbcp的配置来解决上述的报错。可以用两种方式。
方式一:通过设置validationQuery,例如:
<property name="validationQuery">
<value>select 1</value>
</property>
使用上述配置,连接池在返回数据库连接给申请者时会多执行一条sql语句来确保该连接的有效性。如果数据库方已经关闭了,连接池会重新建立连接并返回给申请者。通过测试似乎跟testWhileIdle没有关系,不管其是true或false都正常工作。
方式二:通过配置timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis,例如:
<property name="minEvictableIdleTimeMillis">
<value>60000</value>
</property>
<property name="timeBetweenEvictionRunsMillis">
<value>10000</value>
</property>
在构造GenericObjectPool [BasicDataSource在其createDataSource () 方法中也会使用GenericObjectPool]时,会生成一个内嵌类Evictor,实现自Runnable接口。如果timeBetweenEvictionRunsMillis大于0,每过 timeBetweenEvictionRunsMillis毫秒Evictor会调用evict()方法,检查连接池中的连接的闲置时间是否大于 minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0时则忽略,默认为30分钟),是则销毁此对象,然后调用ensureMinIdle方法检查确保池中对象个数不小于_minIdle。如果连接池的连接数小于最小空闲连接数,则创建数据库连接,同时检查连接池的连接是否小于maxIdle,是则把刚创建的连接放入连接池中,否则销毁此对象。
上述方式一能确保不出现本文开头提到的错误,但是不好的方面是每次执行sql时都会额外执行一条提供的validationQuery sql;第二种方式在数据库重启后minEvictableIdleTimeMillis毫秒前访问web应用,连接数据库使用的还是连接池中老的连接,所以还会出现上述的错误,timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis也不宜设置过小,会加重系统开销。根据具体情况来考虑使用哪种方式。对于数据库可能会经常重启,web应用和数据库机器的网络连接不稳定,可以采取第一种方式,否则使用第二种。由于mysql的默认最大空闲时间8小时,所以只要把minEvictableIdleTimeMillis设置小于此值即可。例如配置每十分钟检查超过空闲一个小时的连接
<property name="minEvictableIdleTimeMillis">
<value>3600000</value>
</property>
<property name="timeBetweenEvictionRunsMillis">
<value>600000</value>
</property>
freemarker的list指令遍历一个list集合中的每一个元素,例如:
<#list userLists as user>
${user.name}
...
</#list>
其实list指令还隐含了两个变量,
1、item_index 该变量将返回元素在集合里的索引值,从0开始计数;
2、item_has_next 该变量是boolean型,false表明该元素是Sequences里的最后一个元素。
上述例子中如果需要把序号打印出来,使用${user_index}即可,同时如果想判断是否是最后一个元素,使用 user_has_next就行了。