作者存档

centos下设置时区

2011年12月13日 没有评论

对于中国用户,如果centos默认使用UTC时区,那时间相差八个小时,其实可以通过简单的设置,变为中国时区,这时候机器上的时间和本地手表上的时间就是一致的。执行如下命令:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

就可以了,如果没有看到/Asia/Shanghai文件,手动执行以下 tzselect ,按照提示选择即可。

jquery对象的position和offset方法理解

2011年12月9日 没有评论

jquery提供了两个方法来获取页面的位置信息,offset方法能够得到元素的绝对位置,position方法是取原始的相对信息,方法返回是一个map对象,key分别是left和top。例如,$(‘#test’).offset().left 得到是id为test的元素距页面左边的像素。

何为绝对位置,何为相对位置呢?不管相对还是绝对,都有一个参照点,对于绝对位置比较简单,它的参照点永远是页面的左上角(注意:body默认是margin值的,如果没有手工修改此值,参照点不是正左上角,会有几个像素的偏移);相对位置的参照点就比较麻烦,很多地方都说相对父元素左上角,那究竟哪个算父元素呢?这个父元素并不一定是该元素的直接父元素,有可能是父元素的父元素,甚至可能的参考点是页面的左上角,父元素的定义是它的所有上层元素中第一个(距离本元素最近)css style中设置了position属性的元素,如果所有上级元素都没有设置该属性,那么参照点就是页面的左上角,跟offset一致了。

例如代码:

<div style="padding: 10px;border:1px solid; position: relative;width:180px;">
	<div style="padding: 10px;position: relative;border:1px solid;">
		<div id="test" style="background-color: #000;width: 20px;height: 20px;"></div>
	</div>
</div>

这时id为test的div的相对位置的参照点就是他直接父元素,所以得到的left,top都为10,而下面的代码

<div style="padding: 10px;border:1px solid; position: relative;width:180px;">
	<div style="padding: 10px;border:1px solid;"><!-- 注意没有设置position -->
		<div id="test" style="background-color: #000;width: 20px;height: 20px;"></div>
	</div>
</div>

此时参照点就是最外层的div,因此left、top的值为21px,即10 + 1 + 10,10是padding,1是border的

解决firefox下输入框为只读时背景成灰色的问题

2011年12月8日 没有评论

firefox(版本3.6)下当input框或者textarea的属性设置为readonly,在html控件在页面显示中就有一个灰色的底色,如果不喜欢,可以通过css来解决它。例如定义一个readonly的class,input框设置class为readonly,即可。firefox查看效果,代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>firefox输入框</title>
<style>
.readonly {
	background-color:#fff;
	border:1px solid #7f9db9;
	padding:1px;
}
</style>
</head>
<body>
	<div style="width:400px;margin: 50px auto">
		<input name="txt" readonly="readonly" value="默认情况" />
		<br /><br />
		<input name="txt" readonly="readonly" value="使用了自定义css" class="readonly"/>
	</div>
</body>
</html>

MyBatis的mapper接口中方法的多参数问题

2011年12月8日 2 条评论

MyBatis的mapper接口不需要自己实现,框架会自动帮我们实现,到时候直接调用就可以了。定义的mapper接口中的方法可以有多个参数吗?答案是肯定。在Ibatis时代是自己通过代码实现如何调用xml中定义的statement,接受的参数只能是一个,所以处理的办法通常是用Map的方式。当然这个也能使用在MyBatis上,不过MyBatis提供更加简单的方法。下面就通过例子来说明。

Mapper接口

public interface TestMapper {

	Object meth1(String para1, String para2);

	/**
	 * p1、p2可以是任何合法的java命名方式
	 * xml中可以根据此标示来获取到具体传入的值
	 */
	Object meth2(@Param("p1")String para1, @Param("p2")String para2);
}

mapper.xml

     <select id="meth1" resultType="int">
     	select count(*) from test
     	where col1 = #{0}
     	and clo2 = #{1}
     </select>

     <select id="meth2" resultType="int">
     	select count(*) from test
     	where col1 = #{p1}
     	and clo2 = #{p2}
     </select>

上述两种方法都行的通,上述statement中不需要指定parameterType。如果不使用@Param注解方式,那么可以通过#{0}、#{1}的方式来获取参数的值,注意function中的第一个参数是0;使用了注解就按注解中定义的名字来取。推荐使用注解的方式。在方法重构时,例如增加、减少或调整参数的顺序,如果使用非注解的方式,在修改xml时就显得比较麻烦,可能里面的${0}、${1}、${2}都需要调整,而且不明确,特别是参数较多的情况下。

Struts2接受枚举类型参数

2011年12月6日 没有评论

strtus2的版本为2.2.3.1,默认是支持转换枚举型参数。有一个问题,例如在action中声明了一个枚举类型的变量testEnum,在action中有该变量对应的get、set方法,如果页面传入的值不是枚举类型中指定的值,这时action中的testEnum为null,但在前端的freemarker模板中通过${testEnum}又能获取到这个值,也就是前面页面传入值,此时并没有调用action的中getTestEnum方法,这个时候应该是从ValueStack中取到的,因为在请求action的时候,已经把请求的参数放入了ValueStack。如果页面上需要action处理后的判断testEnum是不是为null,就不能直接使用<#if testEnum??>了,这个时候就必须还要判断一下testEnum的对象类型,具体的方法参看:freemarker中判断对象类型

分类: Java 标签: ,

freemarker如何判断对象类型

2011年12月6日 没有评论

在freemarker中似乎没有instanceOf这个方法,有时候页面上需要来判断变量的类型,可以使用变通的方法,如下

    <#if myVar.class.simpleName == "Object Type">
        ...
    </#if>

photoshop复制

2011年12月3日 没有评论

在photoshop中需要把图片的某一部分复制到图片的另一位置,有两种方法,其一是先选取需要复制的部位,然后ctrl+c、ctrl+v,这时候就会把复制的内容粘贴到一个新图层,选取该图层后可以进行位置的调整;另外一种是先选取图片,然后同时按住ctrl+alt,用鼠标拖动到目的地即完成了复制,注意此时不会创建新图层。

分类: web前端 标签:

解决Firefox下记录输入框内容的问题

2011年12月2日 没有评论

firefox中对于页面的输入框,如果输入了一些信息,当通过F5刷新页面后,刚输入的信息还是给保留下来了,这个功能似乎是firefox独有的,有时候确实给用户输入带来了方便,但有些情况不希望保留。

其实解决这个问题很简单,如果不希望保留,只要在对应的input加上一个

autocomplete=”off”

即可,autocomplete默认是on,也就是开启的,它的作用是把输入框以前的输入记录显示出来。

MyBatis3自定义typeHandlers

2011年11月28日 没有评论

mybatis3中默认了标准的java类型的typeHandlers,对枚举类型也内置了一个叫EnumTypeHandler的处理器,但是有一个问题,如果在数据库里面的字段类型是SMALLINT、TYININT、INTEGER等数据类型,默认的EnumTypeHandler就不能处理了,http://asialee.iteye.com/blog/1013238,这个地方有比较详细的说明。解决这个问题有两种方法,一是修改数据库字段的类型为枚举类型,并且枚举值用字符表示;另外一种方法就是自己实现一个typeHandlers。实现的方法很简单,官方的手册上就一个例子。配置的时候需要注意,不光只在 MapperConfig.xml 配置

<typeHandlers>
<typeHandler javaType="String" jdbcType="VARCHAR"
handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>

还需要在对应的字段在resultMap中配置jdbcType属性,而且select的返回结果类型不能使用resultType,必须用resultMap,否则mybatis就无法应用用自定义的typeHandlers。为何一定要配置jdbcType呢?因为MyBatis为POJO中字段设置typeHandlers是根据在javaType和jdbcType来确定的,javaType可以根据POJO来获取,MyBatis不会审视数据库元信息来决定jdbcType,如果没有指定,那么都是按null来处理,因而获取typeHandlers通过javaType了,就算在MapperConfig.xml中配置的全局typeHandlers也无法正确应用。

另外一种配置是直接在resultMap中指定对应字段的typeHandlers,这样可以不在MapperConfig.xml配置typeHandlers和设置jdbcType。

官方文档中有如下说明:

使用这样的类型处理器将会覆盖已经存在的处理Java的String类型属性和VARCHAR参数及结果的类型处理器。要注意MyBatis不会审视数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指定那是VARCHAR类型的字段,来绑定到正确的类型处理器上。这是因为MyBatis直到语句被执行都不知道数据类型的这个现实导致的。

由于没有很好的理解“不会审视数据库元信息来决定使用哪种类型”导致走了很多弯路,一直无法使用自定义的typehandler。

Tomcat-6.0.33之APR based Apache Tomcat Native library

2011年11月25日 没有评论

最近使用tomcat 6.0.33这个版本,启动的时候有个提示:

The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:...

tomcat可以整合本地apr,在处理静态资源的时候速度更快,总而言之就是使用本地的apr库提升处理效率。在网上一查,很多人提到了这个问题,解决这个问题其实很简单,但window和linux处理方法不太一样。下面就分别给出解决方法。

  • window平台

在window下启动的时候会提示was not found on the java.library.path: C:\Tools\jdk1.6.0_29\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS …,这个根据每个人的环境不同,可能给出的路径也不太一样,只要把Native library拷贝到上述路径之一即可,Native library是什么呢,网上有提供下载,其实不要那么麻烦,在tomcat的bin目录下就有,文件名是:tcnative-1.dll。例如我把这个文件拷贝到C:\Tools\jdk1.6.0_29\bin下,然后再启动tomcat就没有上述的提示了。

  • linux平台

linux下比较复杂一点,因为tomcat包中没有提供编译好的so文件,所以需要自己编译,tomcat发行版中提供了源码,文件为tomcat的bin/tomcat-native.tar.gz,另外编译时候需要依赖APR 1.2、OpenSSL,如果机器上没有安装,可以使用 yum -y install apr-devel openssl-devel 来进行安装。解压tomcat-native.tar.gz后会得到一个tomcat-native-1.1.20-src的目录,Native library的源文件位于tomcat-native-1.1.20-src/jni/native下,进入该目录,执行./configure,可能会看到configure: error: APR could not be located. Please use the –with-apr option.的错误提示,这个时候用–with-apr制定一下apr的位置即可,我使用的是

./configure --with-apr=/usr/bin/apr-1-config

,顺利通过,然后执行 make && make install 编译就算搞定,此时应该可以在/usr/local/apr/lib/下看到一个名为 libtcnative-1.so 的文件,拷贝该文件到tomcat启动时提示的任何一个路径即可。

更多关于apr的信息可以查看官方资料,地址:http://tomcat.apache.org/tomcat-5.5-doc/apr.html

无觅相关文章插件,快速提升流量